Bosh sahifa Wiki Signal Queue

Signal Queue

Signal Queueprocess yoki thread uchun hali yetkazilmagan signallar va ularga tegishli metadata’ni saqlash mexanizmi. POSIX signal modelida barcha signallar bir xil queue semantikasiga ega emas: standard signallar ko‘pincha bitta pending holatga birlashadi, real-time signallar esa tartibli navbatda bir nechta instance sifatida saqlanadi.

Standard signal

Standard signal masklangan paytda besh marta yaratilsa, kernel odatda faqat “shu signal pending” ekanini saqlaydi. Unblockdan keyin handler bir marta ishlashi mumkin. Shu bois signalni event counter sifatida ishlatish noto‘g‘ri; yo‘qolmaydigan sanash uchun pipe, eventfd yoki shared queue kerak.

Birlashtirish metadata tanlovini ham murakkab qiladi. Bir nechta sender yuborgan bo‘lsa qaysi sender info saqlanishi implementationga bog‘liq bo‘lishi mumkin. Xavfsizlik qarori faqat oxirgi signal metadata’siga tayanmaydi.

Real-time signallar

Real-time signallar odatda queue qilinadi va signal raqami priority tartibiga, bir xil raqam esa yuborilish tartibiga muvofiq yetkaziladi. sigqueue integer yoki pointer-sized qiymat biriktirishi mumkin. Pointer qiymati boshqa process address space’ida ma’noli emas; protokol serializatsiyalangan ID ishlatadi.

Queue cheksiz emas. User yoki system limitiga yetganda send operatsiyasi xato qaytaradi. Sender bu xatoni tekshirmasa notification yo‘qoladi. High-rate data transfer uchun signal queue emas, ring buffer va bitta wakeup samaraliroq.

Process va thread pending setlari

Thread-directed signal konkret threadning pending queue’siga, process-directed signal esa umumiy pending holatga tushishi mumkin. Kernel delivery paytida signalni bloklamagan threadni tanlaydi. Dedicated signal thread barcha workerlarda mask o‘rnatib, umumiy queue’ni synchronous sigwaitinfo bilan oladi.

Thread tugasa uning directed pending signallari uchun platforma qoidalari amal qiladi. Lifecycle protocol target thread mavjudligini va identifier reuse’ini hisobga oladi.

Ordering

Real-time va standard signallar o‘rtasidagi umumiy delivery priority POSIX va implementatsiya qoidalariga bog‘liq. Dastur turli signal raqamlari qat’iy global FIFO bo‘ladi deb faraz qilmaydi. Bir xil real-time signal uchun tartib kuchliroq.

Signal handler bilan shared memory data uzatilsa sender avval data’ni publish qiladi, so‘ng notification yuboradi. Processlar o‘rtasidagi memory ordering shared-memory primitive’i bilan ta’minlanadi; signalning o‘zi murakkab lock-free protokolni avtomatik to‘g‘ri qilmaydi.

Overload nazorati

Queue depth, dropped yoki failed send va handler latency monitoring qilinadi. Consumer sekin bo‘lsa backpressure kerak. Har hodisaga signal berish o‘rniga “queue bo‘sh emas” holatidan bir marta wakeup yuborish stormni kamaytiradi.

Test masklangan davrda ko‘p signal, limitga yetish, bir nechta sender, thread exit va fork/exec holatini qamraydi. Payload maxfiy yoki ishonchli deb qabul qilinmaydi; sender permissioni va application protokoli alohida tekshiriladi.

PID reuse va sender

Queue’ga signal yuborishda target PID tekshirilganidan keyin eski process tugab, raqam yangi processga berilishi mumkin. pidfd_send_signal pidfd bilan aniq process lifecycle’iga bog‘lanib bu race’ni kamaytiradi. Permission baribir sender credentiali bo‘yicha tekshiriladi. Queue metadata’dagi sender PID keyin qayta ishlatilgan bo‘lsa audit uni process start time va session bilan bog‘laydi.

Priority inversion

Past priority consumerga yuqori tezlikda real-time signal yuborilsa queue to‘ladi, lekin signalning “real-time” nomi deadline kafolatlamaydi. Scheduler priority, queue limit va handler execution time birga sozlanadi. Bir signal handleri uzoq ishlasa boshqa yuqori ahamiyatli signal delivery’sini kechiktirishi mumkin. Payload queue’dan olinib worker poolga berilganda ordering talabi saqlanishi yoki ataylab bo‘shatilishi hujjatlashtiriladi.

Bog‘liq tushunchalar

real-time signal, pending set, sigqueue, sigwaitinfo, eventfd, backpressure