Wait Queue — ma’lum condition, resurs yoki hodisani kutayotgan task yoki threadlarni saqlaydigan kernel yoki runtime navbati. Kutuvchi CPUni band qilmaydi va wakeupda runnable holatga qaytadi.
Kutish protokoli
Wait protokoli conditionni lock ostida tekshiradi, taskni queuega qo‘shadi va state’ni waitingga o‘tkazadi. Waker conditionni o‘zgartirib queue’dan bittasini yoki barchasini uyg‘otadi. Tartib lost wakeupni oldini oladi.
Uyg‘otish siyosati
Exclusive waiter wake_one, umumiy waiter wake_all semantikasidan foydalanadi. FIFO fairness mumkin, lekin priority-aware queue real-time talab uchun kerak. Thundering herd barcha waiter uyg‘onib bittasi resurs olganda yuz beradi.
Timeout race’i
Spurious wakeup ruxsat etilsa waiter qaytgach conditionni while bilan tekshiradi. Timeout va cancellation queue linkini xavfsiz olib tashlaydi. Wakeup bilan timeout race’i aynan bir completion natijasini beradi.
Amaliy primitive
Kernel wait queue I/O, child exit va device eventlarda ishlatiladi. Condition variable user-space mutex bilan shunga o‘xshash semantika beradi. Futex uncontended holatni user space’da saqlab, faqat wait/wake uchun kernelga kiradi.
Queue tuzilishi
Queue node TCB ichida intrusive bo‘lishi mumkin. Bitta node ikki queuega qo‘shilmaydi. Memory ordering condition write uyg‘ongan threadda ko‘rinishini ta’minlaydi.
Stress testi
Test wake-before-wait, wait-before-wake, timeout/wake bir vaqtda, cancellation va ko‘p waiter fairnessini qamraydi. Stress takroriy millionlab interleavinglarda invariantni tekshiradi.
Amaliy boshqaruv
Wait Queue implementatsiyasida condition, waiter va wakeup 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 — wake-before-wait race yoki thundering herd. 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 timeout/wakeup interleaving stressi 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.
Wakeup “signal”ni doimiy hisoblagich sifatida saqlamasligi mumkin: condition false bo‘lsa erta wake keyingi waiter uchun yo‘qoladi. Semaphore esa permitni saqlaydi. Primitive tanlashda event, condition va resource count semantikasi farqlanadi; noto‘g‘ri primitive lost notificationga olib keladi.
Bog‘liq tushunchalar
blocking, wakeup, condition variable, futex, thread state, synchronization