Race condition — dastur natijasi parallel yoki asinxron amallarning nazoratsiz bajarilish tartibiga bog‘liq bo‘lib qoladigan xatolik holatidir. Bir xil kirish ma’lumotida vaqt, rejalashtirish yoki tarmoq kechikishidagi kichik farq turli natija berishi mumkin. Shu sababli bunday nosozliklar kam takrorlanadi va diagnostikasi qiyin bo‘ladi.
Oddiy misol
Ikki oqim umumiy hisoblagichni oshirsin. x = x + 1 bitta atomar amal bo‘lmasligi mumkin: qiymat o‘qiladi, registrda oshiriladi va qayta yoziladi. Ikkala oqim ham eski qiymatni o‘qisa, ikkita oshirishdan keyin hisoblagich faqat bittaga ortadi. Bu lost update deb ataladi.
Oqim A: x=10 ni o‘qidi
Oqim B: x=10 ni o‘qidi
Oqim A: 11 ni yozdi
Oqim B: 11 ni yozdi
“Tekshir, keyin bajar” shakli ham xavfli. Dastur fayl yo‘qligini tekshirganidan keyin, uni yaratishidan oldin boshqa jarayon faylni yaratishi mumkin. Tekshiruv bilan amal orasidagi vaqt TOCTOU poygasini hosil qiladi.
Data race bilan munosabat
Data race odatda ikki parallel bajaruvchi bir xil xotira joyiga sinxronizatsiyasiz murojaat qilishi va ulardan kamida biri yozishi holatidir. Race condition kengroq mantiqiy tushuncha: unda xotiradagi data race bo‘lmasligi ham mumkin. Masalan, ikkita qonuniy tranzaksiya biznes cheklovini alohida tekshirib, birgalikda limitdan oshirishi mumkin.
Til xotira modeli data racening oqibatini belgilaydi. Ayrim tillarda u aniqlanmagan xatti-harakatga olib keladi, boshqalarida esa ko‘rinish va tartib kafolatlari zaiflashadi. volatile yoki unga o‘xshash belgi har doim murakkab amalni atomar qilmaydi.
Oldini olish usullari
Mutex kritik bo‘limga bir vaqtda faqat bitta oqim kirishini ta’minlaydi. Atomar operatsiyalar oddiy hisoblagich va holat bayroqlariga mos keladi. Ma’lumotlar bazasida tranzaksiya, qator qulfi, noyob cheklov yoki shartli yozuv tekshiruv bilan yangilashni bitta atomar qarorga birlashtiradi. Xabarlar navbati va actor modeli umumiy o‘zgaruvchan holatni bitta egaga topshirishi mumkin.
Sinxronizatsiya chegarasi invariantga mos bo‘lishi kerak. Ikki maydon birgalikda yangilansa, ularni alohida atomar yozish umumiy qoidani saqlamasligi mumkin. Qulf tartibi bir xil belgilanmasa, race conditionni bartaraf etish o‘rniga deadlock paydo bo‘ladi.
Aniqlash va sinash
Oddiy test bir xil rejalashtirishda doim o‘tishi mumkin. Stress testlari, ko‘p yadroli muhit, tasodifiy kechikish va takroriy bajarish turli interleavinglarni ko‘paytiradi. Thread sanitizer kabi dinamik vositalar xotiradagi data racelarni topadi, ammo biznes darajasidagi barcha poygalarni aniqlamaydi.
Hodisa jurnallarida operatsiya identifikatori, oqim yoki so‘rov identifikatori va monoton vaqt bo‘lishi foydali. Faqat jurnal vaqtiga qarab haqiqiy sababiy tartibni aniqlash taqsimlangan tizimda qiyin, chunki soatlar farq qiladi. Idempotent operatsiyalar, versiya raqami va compare-and-swap takroriy yoki raqobatli yangilanishlarni xavfsizroq qiladi.
Kod ko‘rigida umumiy o‘zgaruvchan holat, check-then-act ketma-ketligi, blokdan tashqariga chiqib ketgan havola va bekor qilish bilan tugallanish poygalari tekshiriladi. Eng ishonchli yechim holat va egalik modelini soddalashtirishdir.
Taqsimlangan muhit
Race condition faqat umumiy xotirada yuz bermaydi. Ikki xizmat bir xil buyurtmani bir vaqtda qayta ishlashi, ikki mintaqa esa bir xil noyob nomni qabul qilishi mumkin. Taqsimlangan qulf ayrim vazifalarda ishlatiladi, lekin uning muddati, tarmoq bo‘linishi va egani aniqlash muammolari bor. Ko‘pincha ma’lumotlar bazasi cheklovi, fencing token yoki deterministik konflikt siyosati ishonchliroq bo‘ladi.
Bog‘liq tushunchalar
Data race, Mutex, Atomar operatsiya, Deadlock, Tranzaksiya, Compare-and-swap