Bosh sahifa Wiki Shared memory

Shared memory

Shared memory — ikki yoki undan ortiq jarayon yoxud bajaruvchi bir xil fizik xotira hududini o‘z virtual manzil makoniga xaritalab foydalanadigan IPC mexanizmidir. Ma’lumot kernel orqali har xabarda nusxalanmagani uchun katta hajmli va past kechikishli almashinuvda samarali. Biroq xotiraning o‘zi tartib, egalik va sinxronizatsiyani ta’minlamaydi.

Xaritalash

Operatsion tizim umumiy obyekt yaratadi va jarayonlarga handle yoki nom orqali ochishga ruxsat beradi. Har jarayondagi virtual manzil turlicha bo‘lishi mumkin, ammo sahifa jadvallari bir xil fizik sahifaga yo‘naltiradi. Shu sababli umumiy struktura ichida oddiy mutlaq pointer saqlash xavfli; offset yoki position-independent format ishlatiladi.

POSIX shared memory, System V segmenti va memory-mapped file keng tarqalgan usullardir. Faylga tayangan mapping persistensiya yoki boshqa vosita bilan ko‘rishni yengillashtiradi. Anonymous shared mapping odatda qarindosh jarayonlar orasida fork orqali meros bo‘ladi.

Sinxronizatsiya

Bir jarayon yozayotgan paytda boshqasi yarim yangilangan ma’lumotni o‘qimasligi kerak. Process-shared mutex, semaphore, atomar operatsiya yoki ring buffer protokoli kirishni muvofiqlashtiradi. Primitive umumiy xotiraning o‘zida joylashsa, u process-shared rejim uchun yaratilgan bo‘lishi shart; oddiy thread mutex boshqa jarayonda ishlamasligi mumkin.

Memory ordering ko‘p yadroli tizimda muhim. Ishlab chiqaruvchi payloadni yozib, keyin ready flagni release semantika bilan o‘rnatadi; iste’molchi flagni acquire bilan o‘qigach payloadni ko‘radi. Faqat volatile kesh va protsessor qayta tartiblashiga yetarli kafolat bermaydi.

Tuzilma va hayot sikli

Segment headerida versiya, hajm, magic value va holat saqlanishi mumkin. Turli dastur versiyalari bir xil layoutni boshqacha talqin qilmasligi uchun ABI va alignment qat’iy belgilanadi. Variable-length ma’lumot uchun offset jadvali yoki oldindan ajratilgan bloklar ishlatiladi; umumiy heap allocator alohida sinxronizatsiya talab qiladi.

Jarayon crash qilsa segment va undagi “egallangan” holat qolishi mumkin. Robust mutex egasi o‘lganini bildiradi, lekin ma’lumot invariantini tiklashni dastur bajaradi. Segmentni kim yaratishi, oxirgi foydalanuvchidan keyin kim o‘chirishi va eski segmentni qanday aniqlash protokolda ko‘rsatiladi.

Xavfsizlik va unumdorlik

Shared memory nomi va permissioni ruxsatsiz jarayonning maxfiy ma’lumotni o‘qishini cheklaydi. Segmentga parol, token yoki shaxsiy ma’lumot yozilsa, core dump va diagnostika vositalari ham uni ko‘rishi mumkin. Keraksiz ma’lumot foydalanilgach tozalanadi.

False sharingda mustaqil hisoblagichlar bitta cache linega tushib, yadrolar orasida doimiy invalidation yaratadi. Padding va har yadro uchun alohida slot buni kamaytiradi. NUMA tizimida sahifani qaysi tugun birinchi ishlatgani joylashuvga ta’sir qiladi. Benchmark faqat nusxalash tezligini emas, contention, kesh miss va tail latency qiymatlarini ham o‘lchaydi.

Ma’lumot almashish protokoli

Yozuvchi va o‘quvchi qaysi byte qachon yaroqli ekanini kelishishi kerak. Ikki bufferli sxemada yozuvchi faol bo‘lmagan nusxani to‘ldirib, generation raqamini atomar almashtiradi; o‘quvchi bir izchil snapshot oladi. Ring bufferda head va tail wraparound, to‘lish hamda bo‘sh holatni ajratadi. Counter overflow matematikasi unsigned farq orqali loyihalanadi. Bir consumer uchun yozilgan lock-free tuzilmani ko‘p consumerga bevosita kengaytirib bo‘lmaydi. Protokol fuzz, crash va sekin ishtirokchi bilan sinovdan o‘tkaziladi; faqat normal ketma-ket test memory ordering xatosini ko‘rsatmasligi mumkin.

Turli CPU arxitekturalari weak memory orderingni boshqacha namoyon qilgani uchun protokol kamida qo‘llanadigan platformalarda sinovdan o‘tadi.

Bog‘liq tushunchalar

IPC, Memory mapping, Semaphore, Ring buffer, Memory ordering, NUMA