Bosh sahifa Wiki Test-and-Set

Test-and-Set

Test-and-Set — xotira joyining eski qiymatini qaytarib, unga yangi qiymatni atomik yozadigan read-modify-write operatsiyasi. U oddiy spinlock qurishning klassik asosi hisoblanadi.

Lock qurilishi

Lock so‘zi 0 bo‘lsa test_and_set uni 1 qiladi va eski 0ni olgan thread critical sectionga kiradi. Eski 1 bo‘lsa thread kutadi. Unlock release store bilan 0 yozadi.

Memory order

Operatsiyaning o‘zi atomic bo‘lishi yetarli emas; lock acquire semantikasi, unlock release semantikasi critical sectiondagi memory accesslarni tartiblaydi. Noto‘g‘ri relaxed ordering protected data visibilitysini buzishi mumkin.

Cache contention

Oddiy TAS spinlock har kutuvchi doimiy atomic write qilib cache line’ni corelar orasida aylantiradi. Test-and-test-and-set avval oddiy load bilan kutib, 0 ko‘ringanda atomic urinish qilib coherence trafficni kamaytiradi.

Qo‘llanish sohasi

Spinlock owner deschedule bo‘lsa waiter CPUni isrof qiladi. Qisqa kernel critical section yoki thread bloklanmaydigan kontekstga mos; uzoq kutishda mutex/parking yaxshi. Backoff contentionda bus bosimini kamaytiradi.

Fairness

TAS lock fairness kafolatlamaydi; yangi kelgan thread oldingi waiterlarni ortda qoldirishi mumkin. Queue lock har waiter uchun alohida node va tartibli handoff bilan scalabilityni yaxshilaydi.

Tekshiruv

Test mutual exclusion, acquire/release visibility, heavy contention, preemption va starvationni qamraydi. CPU utilization hamda cache-line invalidation performance metrikasidir.

Amaliy boshqaruv

Test-and-Set implementatsiyasida atomic RMW va lock word alohida va versiyalangan holat sifatida yuritiladi. Qaror uchun zarur inputlar yashirin global taxminga aylantirilmaydi: platforma, konfiguratsiya, identity yoki memory-order sharti tegishli obyekt bilan bog‘lanadi. Shu sabab incremental yangilanish, context almashishi yoki parallel hodisada eskirgan ma’lumotdan foydalanish kamayadi. Debug rejim qarorni hosil qilgan edge, state transition va parametrlarni ko‘rsatadi; production log esa maxfiy qiymatlarni xom shaklda yozmaydi.

Muhim xato sinfi — starvation, coherence traffic yoki owner preemption. Bunday vaziyatda tizim optimistik tarzda davom etmaydi: semantikaga qarab konservativ fallback, bounded retry, taskni bloklash yoki aniq error tanlanadi. Timeout correctness isboti emas; u faqat operatsion limitdir. Queue membership, reference count, lock ownership va visibility kabi invariantlar state bilan atomik yangilanadi. Cancellation yoki failure o‘rtada yuz bersa qisman o‘zgargan holat cleanup protokoli orqali tiklanadi.

Sifat nazorati mutual exclusion va contention benchmark orqali bajariladi. Test normal yo‘ldan tashqari bo‘sh navbat, bitta element, yuqori contention, timeout bilan bir vaqtdagi wakeup, resurs limiti va platforma variantlarini qamraydi. To‘g‘rilik performance’dan alohida tekshiriladi; keyin throughput, p99 latency, context switch, cache miss yoki artefakt hajmi kabi mavzuga mos ko‘rsatkichlar baseline bilan solishtiriladi. Topilgan minimal interleaving yoki kirish regressiya to‘plamida doimiy saqlanadi.

Spin loop busy-wait hint yoki pause instruction ishlatib power va SMT contentionni kamaytiradi. Unlockni faqat owner bajarishi contract bo‘lsa debug build owner IDni tekshirishi mumkin. Recursive kirish oddiy TAS lockda deadlock qiladi; recursive lock alohida state va semantikaga ega.

Lock profiling hold time va wait time’ni ajratadi. Uzoq critical section topilsa spin parametrini oshirish o‘rniga protected ishni qisqartirish yoki blocking lock tanlash ko‘riladi.

Bog‘liq tushunchalar

atomic read-modify-write, spinlock, mutual exclusion, memory ordering, backoff, queue lock