Bosh sahifa Wiki Critical section

Critical section

Critical section — bir nechta oqim yoki jarayon foydalanadigan umumiy holat ustida atomar mantiqiy amal bajariladigan kod qismidir. Unda bir vaqtning o‘zida nazoratsiz bajarilish invariantni buzishi mumkin. Masalan, balansni o‘qish, tekshirish va yangilash uchta buyruq bo‘lsa ham biznes nuqtai nazaridan bitta ajralmas amal bo‘lishi kerak.

Mutual exclusion

Mutex kritik bo‘limga bir paytda faqat bitta oqim kirishini ta’minlaydi. Oqim qulfni oladi, umumiy holatni o‘zgartiradi va barcha yo‘lda qulfni bo‘shatadi. Istisno yoki erta qaytishda qulf qolib ketmasligi uchun RAII, context manager yoki finally kabi til mexanizmi ishlatiladi.

Kritik bo‘limning chegarasi invariantga mos keladi. Faqat bitta maydon yoziladigan qatorni qulflash yetarli ko‘rinsa ham, boshqa maydon bilan birgalikdagi qoida buzilishi mumkin. Aksincha, keragidan katta bo‘lim parallelizmni kamaytiradi va kutishni oshiradi.

Bo‘lim ichidagi amallar

Qulfni ushlab turib tarmoq so‘rovi, disk I/O yoki foydalanuvchi callbackini chaqirish xavfli. Amal sekinlashsa barcha kutuvchilar bloklanadi; callback yana shu qulfni olishga urinib deadlock yaratishi mumkin. Zarur ma’lumot qulf ostida nusxalanib, uzoq ish tashqarida bajariladi, natijani qo‘llashda holat qayta tekshiriladi.

Bir nechta qulf kerak bo‘lsa, barcha kod bir xil global tartibda oladi. Try-lock va timeout deadlock oqibatini cheklashi mumkin, lekin noto‘g‘ri invariantni avtomatik tuzatmaydi. Lock hierarchy hujjati murakkab tizimda ruxsat etilgan tartibni ko‘rsatadi.

Alternativalar

Oddiy hisoblagich uchun atomar operatsiya mutexdan yengilroq bo‘lishi mumkin. Read-write lock ko‘p o‘qish, kam yozishda parallel o‘quvchilarga ruxsat beradi. Immutable ma’lumot va copy-on-write umumiy o‘zgaruvchan holatni kamaytiradi. Actor yoki message queue holatni bitta egaga berib, boshqa oqimlarni xabar orqali bog‘laydi.

Lock-free algoritm bloklanishni kamaytirishi mumkin, ammo memory ordering, ABA va reclamation muammolari sabab murakkab. Uning to‘g‘riligi va amaliy foydasi benchmark hamda maxsus test bilan isbotlanadi; “qulfsiz” har doim “tezroq” degani emas.

Tekshirish

Race detector umumiy xotiradagi ayrim sinxronizatsiya xatolarini topadi. Stress test turli interleavinglarni oshiradi, ammo barcha tartibni qamramaydi. Kod ko‘rigida umumiy resurs egasi, qulf chegarasi, qulf olish tartibi va bo‘lim ichidagi bloklovchi amal tekshiriladi.

Monitoring lock contention, kutish va ushlab turish vaqtini o‘lchaydi. Yuqori contention bo‘limni sharding, ma’lumot tuzilmasini o‘zgartirish yoki ishni batchlash zarurligini ko‘rsatishi mumkin. Kritik bo‘limni qisqartirishda to‘g‘rilik unumdorlikdan oldin turadi.

Ma’lumotlar bazasidagi ko‘rinish

Tranzaksiya ham kritik bo‘limga o‘xshash invariantni himoya qiladi, lekin ma’lumotlar bazasi lock, MVCC va isolation leveldan foydalanadi. Ilova qatorni o‘qib, uzoq hisobdan keyin yangilasa, boshqa tranzaksiya orada qiymatni o‘zgartirishi mumkin. SELECT FOR UPDATE, version ustuni yoki conditional update kerakli semantikani beradi. Tranzaksiya ichida tashqi HTTP chaqirig‘ini kutish qator qulflarini uzoq ushlab turadi. Outbox yoki ikki bosqichli ish oqimi tashqi yon ta’sirni bazadagi atomar o‘zgarishdan ajratadi. Isolation darajasi yuqori bo‘lsa ham barcha biznes invariant avtomatik himoyalanmaydi.

Serializable rejim ayrim anomaliyani bloklash yoki abort orqali cheklaydi, shuning uchun ilova retryga tayyor bo‘ladi. Distributed service chegarasida lokal lock boshqa instancedagi parallel so‘rovni ko‘rmaydi. Yagona koordinatsiya manbai yoki atomar storage amali tanlanadi. Ikki xil lock qatlamini tartibsiz aralashtirish yangi deadlock zanjiri yaratadi.

Bog‘liq tushunchalar

Mutex, Lock, Race condition, Atomic operation, Deadlock, Lock contention