Кіріспе
Жүйенің мінез-құлқы басқарылмайтын оқиғалардың уақытына байланысты болғанда, жарыс жағдайы немесе жарыс қаупі туындайды. Бұл электроникалық, бағдарламалық қамтамасыз ету немесе басқа да жүйенің маңызды мінез-құлқының, басқа бақыланбайтын оқиғалардың реттілігіне немесе уақытына тәуелді болуы, күтпеген немесе үйлесімсіз нәтижелерге алып келуі жағдайы. Егер жүйенің мүмкін болатын мінез-құлқының бірі немесе бірнешесі қанағаттандырмас болса, онда бұл қателікке айналады. "Жарыс жағдайы" термині 1954 жылдан бері қолданылып келеді, мысалы, Дэвид А. Хаффманның "Тізбектік коммутациялық схемалардың синтезі" атты докторлық диссертациясында айтылған. Жарыс жағдайлары ең көп логикалық схемаларда немесе көп өрісті немесе таратылған бағдарламалық жасақтамаларда кездеседі.
A race condition or race hazard is the condition of an electronics, software, or other system where the system's substantive behavior is dependent on the sequence or timing of other uncontrollable events, leading to unexpected or inconsistent results. It becomes a bug when one or more of the possible behaviors is undesirable. The term race condition was already in use by 1954, for example in David A. Huffman's doctoral thesis "The synthesis of sequential switching circuits". Race conditions can occur especially in logic circuits or multithreaded or distributed software programs.
Электрондық техникада
Жарыс жағдайының әдеттегі мысалы логикалық қақпа бір көзден әртүрлі жолмен келген сигналдарды біріктіргенде туындауы мүмкін. Қақпаға түсетін сигналдар бастапқы сигналдың өзгеруіне жауап ретінде сәл әртүрлі уақытта өзгеруі мүмкін. Нәтижесінде, шығыс белгілі бір уақытқа қажетсіз күйге ауысып, содан кейін жоспарланған күйіне оралуы мүмкін. Кейбір жүйелер мұндай қателерге төзімді, бірақ егер бұл шығыс, мысалы, жады бар басқа жүйелер үшін синхронды сигнал ретінде қолданылса, жүйе жобаланған мінез-құлқынан тез ауытқуы мүмкін (фактически, уақытша қате тұрақты қатеге айналады). Мысалы, екі кірісті ЖӘНЕ қақпасын келесі логикамен қоректендірейік: бір кіріске логикалық сигнал, ал екінші кіріске оның инверсиясы (¬ – Бульдік инверсия) берілгенде, теориялық тұрғыдан алғанда, ешқашан «ақиқат» мәні шығарылмайды: егер, алайда, сигналдың мәнінің өзгеруі бірінші кіріске қарағанда екінші кіріске таралу үшін көбірек уақыт кетсе, және сигнал «жалғаннан» «ақиқатқа» өзгеретін болса, екі кіріс те қысқа мерзімге «ақиқат» болады, сондықтан қақпаның шығысы да «ақиқат» болады. Жарыс жағдайының нақты мысалы логикалық тізбектерді санаушының белгілі бір шығыстарын анықтау үшін қолданғанда туындауы мүмкін. Егер санаушының барлық биттері бірдей уақытта өзгермесе, онда жалған сәйкестіктерді тудыруы мүмкін аралық үлгілер пайда болады.
Критикалық және сынсыз нысандар
Критиктік жарыс жағдайы, ішкі айнымалылардың өзгеру реті күй машинасының соңғы күйін анықтайтын жағдайда туындайды. Критикалық емес жарыс жағдайы, ішкі айнымалылардың өзгеру реті күй машинасының соңғы күйін анықтамайтын жағдайда туындайды.
Статикалық, динамикалық және негізгі нысандар
Статикалық жарыс жағдайы сигнал және оның инверсиясы біріктірілген кезде пайда болады. Динамикалық жарыс жағдайы, күтілген бір ауысудың орнына, бірнеше ауысулар туындағанда пайда болады. Бұл жағдайлар қақпалардың өзара әрекеттесуінен туындайды. Оны екі деңгейден аспайтын қақпаларды қолдану арқылы болдырмауға болады. Маңызды жарыс жағдайы, кіріс сигналының жалпы кері байланыс таралу уақытынан кем уақыт ішінде екі ауысу жасағанда пайда болады. Кейде оларды кіріс сигналының уақыттық ұзақтығын ұзарту үшін индуктивті кешіктіру желілерін қолдану арқылы шешеді.
Айналадағы амалдар
Карноу карталары сияқты жобалау тәсілдері дизайнерлерді проблемалар туындамас бұрын, жарыс жағдайларын анықтауға және жоюға көмектеседі. Көбінесе, кейбір жарыстарды болдырмау үшін логикалық артықтық қосылуы мүмкін. Бұл мәселелерден өзге, кейбір логикалық элементтер тұрақсыз күйге түсуі мүмкін, бұл тізбектерді жобалаушылар үшін қосымша қиындықтар тудырады.
Бағдарламалық жасақтауда
Бағдарламалық жасақтамада жарыс жағдайы компьютерлік бағдарламада бір уақытта орындалатын бірнеше код жолдары болған кезде туындауы мүмкін. Егер бірнеше код жолы күткеннен өзгеше уақыт алса, олар күткеннен өзгеше ретпен аяқталуы мүмкін, бұл күтпеген әрекеттерге байланысты бағдарламалық қателерге әкелуі мүмкін. Жарыс екі бағдарлама арасында да болуы мүмкін, соның салдарынан қауіпсіздік мәселелері туындауы мүмкін (төменде қараңыз). Критикалық жарыс жағдайлары дұрыс емес орындалуға және бағдарламалық қателерге себеп болады. Критикалық жарыс жағдайлары көбінесе процестер немесе жіптер бір ортақ күйге тәуелді болған кезде пайда болады. Ортақ күйлерге қатысты операциялар өзара байланысты болуы тиіс маңызды бөлімдерде орындалады. Бұл ереже бұзылса, ортақ күй зардап шегуі мүмкін. Деректер жарысы – жарыс жағдайының бір түрі. Деректер жарысы әртүрлі формальды жад модельдерінің маңызды бөлігі болып табылады. C11 және C++11 стандарттарындағы жад моделі деректер жарысын қамтитын C немесе C++ бағдарламасының мінез-құлқы анықталмаған деп көрсетеді. Жарыс жағдайын қайта жасау және түзету қиын болуы мүмкін, өйткені соңғы нәтиже детерминистік емес және араласатын жіптер арасындағы уақытқа байланысты. Сондықтан, мұндай мәселелер жөндеу режимінде жұмыс істегенде, қосымша журнал қосылғанда немесе жөндеу құралы қосылғанда жойылуы мүмкін. Түзету кезінде осылай жоғалып кететін қателер көбінесе "Хейзенбэг" деп аталады. Сондықтан, бағдарламалық жасақтаманы мұқият жобалау арқылы жарыс жағдайларынан сақтану дұрыс.
Деректер жарысы
Барлық адамдар деректер жарысын жарыс жағдайларының кіші жиынтығы деп қарастырмайды. Деректер жарысының нақты анықтамасы қолданылатын ресми қатарлы өңдеу моделіне байланысты, бірақ әдетте ол бір жіптегі жад операциясының басқа жіптегі жад операциясы сол жад орнына жазатын кезде, қауіпті жағдайда, сол жад орнына қол жеткізуге тырысуын білдіреді. Бұл деректер жарысының жарыс жағдайынан өзгеше екенін көрсетеді, себебі уақытқа байланысты беймәлімдік деректер жарысы жоқ бағдарламада да болуы мүмкін, мысалы, барлық жадқа қол жеткізулер тек атомдық операцияларды қолданатын бағдарламада. Бұл қауіпті болуы мүмкін, өйткені көптеген платформаларда егер екі жіп бір уақытта жад орнына жазса, жад орны әр жіп жазуға тырысқан мәндерді білдіретін биттердің кездейсоқ және мағынасыз комбинациясын ұстауы мүмкін; нәтижедегі мән ешбір жіп жазуға тырыспаған болса, бұл жадтың бұзылуына әкелуі мүмкін (кейде бұл «жарылған жазу» деп аталады). Сол сияқты, егер бір жіп бір орналасудан оқыса, ал екінші жіп оған жазатын болса, оқу нәтижесінде жазу алдындағы жад орнындағы және жазылып жатқан мәнді білдіретін биттердің кездейсоқ және мағынасыз комбинациясы қайтарылуы мүмкін. Көптеген платформаларда бір мезгілде қол жеткізу үшін арнайы жад операциялары қарастырылған; мұндай жағдайларда, әдетте, осы арнайы операцияларды пайдаланумен бір мезгілде қол жеткізу қауіпсіз, бірақ басқа жад операцияларын пайдаланумен бір мезгілде қол жеткізу қауіпті. Кейде мұндай арнайы операциялар (бір мезгілде қол жеткізу үшін қауіпсіз) атомдық немесе синхрондау операциялары деп аталады, ал қарапайым операциялар (бір мезгілде қол жеткізу үшін қауіпсіз емес) дерек операциялары деп аталады. Бұл терминнің «дерек жарысы» болуының себебі осы болуы мүмкін; көптеген платформаларда, тек синхрондау операцияларын қамтитын жарыс жағдайы болса, мұндай жарыс беймәлімдік тудыруы мүмкін, бірақ басқа жағынан қауіпсіз болуы мүмкін; бірақ деректер жарысы жадтың бұзылуына немесе белгіленбеген мінез-құлыққа әкелуі мүмкін.
Компьютерлік қауіпсіздік
Көптеген бағдарламалық жасақтамадағы жарыс жағдайлары компьютерлік қауіпсіздікпен байланысты. Жарыс жағдайы ортақ ресурсқа қол жеткізген шабуылшыға осы ресурсты пайдаланатын басқа да қатысушылардың жұмысын бұзуға мүмкіндік береді, нәтижесінде қызметтен уақытша тоқтату және құқықтарды кеңейту сияқты салдарлар туындайды. Жарыс жағдайларының нақты бір түрі белгілі бір шартты тексеруді (мысалы, аутентификация үшін) және содан кейін осы шарт бойынша әрекет етуді қамтиды, ал осы шарт тексерілген кезден пайдаланылған кезге дейін өзгеруі мүмкін. Егер мұндай қате қауіпсіздікке сезімтал кодта болса, қауіпсіздікке қатысты осалдық туындайды, бұл тексеру уақытынан пайдалану уақытына дейінгі (TOCTTOU) қате деп аталады. Жарыс жағдайлары аппараттық кездейсоқ сандар генераторларын және физикалық түрде көшірмейтін функцияларды (PUF) жасау үшін де қасақана қолданылады. PUF-тарды бір түйіске дейінгі бірдей жолдармен схема топологиясын жобалау арқылы және қай жолдың бірінші болып аяқталуын кездейсоқ анықтау үшін өндіріс айырмашылықтарына сүйене отырып жасауға болады. Әрбір өндірілген схеманың жарыс жағдайларының нақты жиынтығын өлшеу арқылы әрбір схема үшін профиль жинақталып, схеманың сәйкестігін кейін тексеру үшін құпия сақталады.
Файл жүйелері
Екі немесе одан көп бағдарлама файл жүйесін өзгертуге немесе оған қол жеткізуге тырысқанда қақтығысуы мүмкін, бұл деректердің бұзылуына немесе құқықтардың кеңеюіне әкелуі мүмкін. Файлдарды құлыптау (бұғаттау) осы мәселенің жиі қолданылатын шешімі болып табылады. Күрделірек шешім – жүйені осылай ұйымдастыру: бір ғана процесс (мысалы, демонды іске қосу арқылы) файлға эксклюзивті қол жеткізімділікке ие болады, ал осы файлдағы деректерге қол жеткізуі керек барлық басқа процестер тек сол процесспен өзара әрекеттесу арқылы оны жасайды. Бұл процесс деңгейінде синхронизациялауды талап етеді. Файл жүйелерінде басқа да жарыс жағдайы болуы мүмкін, онда байланыссыз бағдарламалар бір-біріне әсер етуі мүмкін, мысалы, дискідегі орын, жад кеңістігі немесе процессор циклдары сияқты қол жетімді ресурстарды кенеттен толық пайдалану арқылы. Мұндай жарыс жағдайын болжап, басқаруға арналған бағдарламалық құралдар күтпеген нәтижелерге әкелуі мүмкін. Мұндай тәуекел өте сенімді көрінетін жүйеде ұзақ уақыт бойы назардан тыс қалуы мүмкін. Бірақ, жеткілікті дерек жинақталғанда немесе жүйенің көп бөліктерін тұрақсыздандыру үшін басқа бағдарламалық құралдар қосылғанда, жағдай күрт нашарлауы мүмкін. Мұның мысалы – Марс ровері "Spirit" қонғаннан кейін көп ұзамай дерлік жоғалып кетуі. Шешім – бағдарламалық құрал тапсырманы бастамас бұрын қажетті барлық ресурстарды сұрап, резервтеуі; егер сұраныс сәтсіз болса, тапсырма кейінге шегеріледі, бұл сәтсіздікке ұшырауы мүмкін көптеген нүктені болдырмайды. Балама ретінде, осы нүктенің әрқайсысына қателерді өңдеу механизмдерін орнатуға болады немесе тапсырманы жалғастыру алдында оның сәтті аяқталғанын тексеруге болады. Көбінесе тапсырманы бастамас бұрын жеткілікті жүйе ресурстары бар екенін тексеру жеткілікті деп есептеледі; алайда, бұл жеткіліксіз болуы мүмкін, өйткені күрделі жүйелерде басқа іске қосылған бағдарламалардың әрекеттерін болжау қиын.
Желі құру
Желіде IRC сияқты таратылған чат желісін қарастырайық, онда арнаны бастаған пайдаланушы автоматты түрде арна операторының құқықтарын иеленеді. Егер екі пайдаланушы бір желідегі әртүрлі серверлерде, әртүрлі нүктелерде бір атаулы арнаны бір уақытта ашуға тырысса, әр пайдаланушының сәйкес сервері әрқайсысына арна операторының құқықтарын береді, себебі екі сервердің біреуі де екінші сервердің осы арнаны бөліп алғаны туралы сигналды әлі алмаған болады. (Бұл мәселе IRC серверлерінің әртүрлі нұсқаларында көбінесе шешілді.) Осы жарыс жағдайында "ортақ ресурс" түсінігі желінің күйін қамтиды (қандай арналар бар, оларды кім ашқан және осыған байланысты кім қандай құқықтарға ие), әр сервер желідегі басқа серверлерге өзгерістер туралы хабарлағанша, оларды еркін өзгерте алады, осылайша олар желінің күйі туралы түсініктерін жаңарта алады. Дегенмен, желідегі кешігу осы сипатталған жарыс жағдайының пайда болуына мүмкіндік береді. Осы жағдайда, жарыс жағдайларын болдырмау үшін ортақ ресурсқа қол жеткізуді бақылауды енгізу, мысалы, кімге қандай құқықтар беріледі, оны анықтау үшін бір серверді тағайындау, таратылған желіні орталықтандырылған желіге айналдырумен (кем дегенде желілік операцияның осы бөлігі үшін) тең болады. Жарыс жағдайлары компьютерлік бағдарлама бұғатталмайтын сокеттермен жазылғанда да туындауы мүмкін, онда бағдарламаның өнімділігі желілік байланыстың жылдамдығына байланысты болуы мүмкін.
Өмірге маңызды жүйелер
Өмірге қатысты маңызды жүйелердегі бағдарламалық қателер апатқа әкелуі мүмкін. Жарыс жағдайы Therac 25 сәулелік терапия машинасының қателіктерінің бірі болды, нәтижесінде кем дегенде үш науқас қаза тапты және бірнешеуі жарақат алды. Тағы бір мысал – GE Energy компаниясы ұсынған және Огайо штатындағы FirstEnergy Corp (басқа да энергетикалық объектілер арасында) қолданған энергия басқару жүйесі. Ескертулердің қосалқы жүйесінде жарыс жағдайы болды; үш нашарлаған электр желісі бірден ажыратылғанда, бұл жағдай мониторинг жүзеге асыратын техниктерге ескертулерді жіберуге кедергі келтіріп, олардың мәселені білуін кешіктірді. Осы бағдарламалық қате 2003 жылғы Солтүстік Америкадағы тотальдік қараңғылыққа (жарық өшуге) соқтырды. Кейін GE Energy бұрын анықталмаған қатені жою үшін бағдарламалық түзету жасады.
Басқа салаларда
Нейробиологиялық зерттеулер нәсілдік жағдай сүтқоректілердің миында да пайда болуы мүмкін екенін көрсетуде. Ұлыбритания теміржол сигнализациясында 55-қағиданы орындау кезінде мұндай жағдай туындауы мүмкін. Осы қағидаға сәйкес, егер пойыз жүріп тұрған жолда сигналға тоқтаса, локомотив машинисінің көмекшісі сигналдық постқа барып, сигнал берушіге пойыздың тоқтағанын еске салар еді. Кем дегенде бір жағдайда, 1934 жылы Уинвик станциясында, авария болды, себебі сигнал беруші көмекші келгенге дейін басқа пойызды қабылдап алған. Қазіргі заманғы сигнализация жүйесі радиоарқылы сигналдық постқа дереу байланысу мүмкіндігі арқылы мұндай жағдайдың туындауын болдырмайды.