Bosh sahifa Wiki Thread-Local Storage

Thread-Local Storage

Thread-Local Storage (TLS) — har bir thread uchun bir xil variable nomining alohida instansiyasini saqlaydigan mexanizm. Bir thread yozgan TLS qiymati boshqasining nusxasini o‘zgartirmaydi.

TLS accessi

Compiler TLS variable accessini thread pointer va offset orqali kodlaydi. Static, initial-exec, local-dynamic yoki general-dynamic model load time va shared-library shartlariga mos tanlanadi.

Loader modeli

TLS process address space’ida bo‘lsa ham har thread uchun blok ajratiladi. Yangi thread template’dan initial data oladi. Dynamic loaded module uchun TLS blok kengayishi runtime loader tomonidan boshqariladi.

Destructor

Destructor thread exitda ishlaydi. Thread pool worker uzoq yashasa requestga xos TLS tozalanmay, keyingi requestga sizishi mumkin. Scope cleanup shart.

Async cheklovi

TLS tez implicit context beradi, lekin async task bir threaddan boshqasiga ko‘chsa logical qiymat yo‘qoladi. Async-local yoki explicit context kerak. Fiberlar bitta threadda TLSni ulashadi.

Xotira xarajati

Katta TLS har thread xotirasini ko‘paytiradi. Juda ko‘p threadli tizimda umumiy table yoki lazy allocation ma’qul. Signal handler TLS initialization race’iga ehtiyot bo‘ladi.

Sinov

Test ko‘p thread initial value, isolation, destructor, dynamic module va thread-pool reuse’ni qamraydi. TLS model relocationlari target ABI bilan tekshiriladi.

Amaliy nazorat

Thread-Local Storage bilan ishlaydigan tizim per-thread block va destructorni aniq lifecycle va version bilan yuritadi. Pointer, mapping, navbat yoki exception holati boshqa qatlamga uzatilganda ownership hamda permission shartlari yo‘qolmaydi. Debug rejimda manzil, obyekt identifikatori va state transition qayd etiladi; production log ASLR, maxfiy ma’lumot va raw pointerlarni ochib yubormaydigan shaklga keltiriladi. Eskirgan handle yoki metadata reuse qilinmasligi uchun generation, build-id yoxud reference hisobidan foydalaniladi.

Muhim xavf — thread-pool reuse yoki async migration. Bunday vaziyatda tizim taxmin bilan davom etmaydi: access fault, aniq error, konservativ fallback yoki nazoratli cleanup qo‘llanadi. Signal/fault kelgan nuqta har doim asl buzilish joyi emas; allocation, mapping va oxirgi ownership amallari trace’i tashxisga yordam beradi. Parallel accessda lock, atomic ordering va lifetime birgalikda tekshiriladi. Timeout yoki null check memory safetyning o‘rnini bosa olmaydi.

Sifat nazorati isolation, module load va exit testi orqali bajariladi. Sinovlar normal holat bilan birga nol uzunlik, page boundary, alignment, juda katta offset, concurrent close/free, permission o‘zgarishi va platforma farqlarini qamraydi. Correctness avval etalon hamda invariant bilan tekshiriladi, keyin page fault, cache miss, contention, latency yoki xotira sarfi o‘lchanadi. Sanitizer, fault injection va malformed-input fuzzing topgan minimal holat doimiy regressiya testiga aylantiriladi.

TLS o‘zgaruvchisining har bir threadda alohida nusxasi bo‘ladi; uning manzili threadlar orasida bir xil bo‘lishi shart emas. Executable va dynamic library uchun access modellari loaderga ma’lumlik darajasiga qarab farqlanadi, shuning uchun TLS access oddiy globaldan qimmatroq bo‘lishi mumkin. Thread poolda worker uzoq yashaydi: requestga oid qiymat tozalanmasa keyingi vazifa eski contextni meros qilib oladi. Destructorlar thread chiqishida ishlaydi, lekin processning keskin to‘xtashi bunga kafolat bermaydi. Async task bir threaddan boshqasiga ko‘chishi mumkinligi sabab task-local context ko‘pincha TLSdan mosroq abstraksiyadir.

Bog‘liq tushunchalar

thread variable, thread pointer, TLS model, dynamic linker, thread pool, async context