Memory Compaction — bo‘sh physical sahifalarni bir joyga jamlash uchun movable sahifalarni ko‘chirib, yuqori tartibli contiguous bloklar yaratadigan memory-management jarayoni.
Fragmentation
Buddy allocatorda bo‘sh sahifalar tarqoq bo‘lsa jami RAM yetarli bo‘lsa ham katta contiguous allocation muvaffaqiyatsiz bo‘lishi mumkin. Compaction free va movable page scannerlari orqali bloklarni birlashtiradi.
Sahifa ko‘chirish
User page yangi framega nusxalanadi, page table reference’lari yangilanadi va eski frame bo‘shatiladi. Migration vaqtida access lock, retry yoki page migration entry bilan xavfsiz boshqariladi.
Ko‘chmaydigan sahifalar
Pinned DMA page, kernelning unmovable allocationi va ayrim huge page’lar ko‘chmaydi. Memory zone pageblocklarni movable/unmovable turlarga ajratib kelajak fragmentationni kamaytiradi.
Latency
Compaction synchronous allocation yo‘lida latency yaratishi yoki background thread tomonidan oldindan bajarilishi mumkin. Direct compaction priority va time budget bilan cheklanadi.
Qatlam farqi
Virtual heap compaction managed GCdagi obyekt ko‘chirishga o‘xshash nomga ega, ammo OS physical-page compactiondan boshqa qatlamdir. Pointer update mexanizmlari farqli.
Benchmark
Test fragmented workload, pinned page, huge-page allocation, NUMA zone va memory pressureda success rate hamda stall vaqtini o‘lchaydi.
Amaliy nazorat
Memory Compaction bilan ishlaydigan tizim movable page, free extent va zoneni 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 — pinned page yoki compaction stall. 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 fragmentation va huge-page allocation 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.
Compaction allocatorning erkin sahifalar sonini ko‘paytirmaydi; u mavjud bo‘sh sahifalarni yonma-yon joylashtirib, yuqori orderli blok hosil qiladi. Buning uchun movable sahifalar yangi frame’ga ko‘chiriladi va page table hamda tegishli metadata yangilanadi. Pinned DMA sahifasi, ayrim kernel obyektlari yoki uzoq muddatli mapping ko‘chishga to‘sqinlik qilishi mumkin. Direct compaction allocation yo‘lida bajarilsa latency sakrashini keltiradi, background compaction esa ishni oldindan bajaradi. Kuzatuvda compaction scan, migrated pages, allocation stall va muvaffaqiyatsiz high-order requestlar birga tahlil qilinadi.
NUMA tizimida sahifani noto‘g‘ri node’ga ko‘chirish localityni yomonlashtirishi mumkin, shu bois migratsiya siyosati topologiyani ham hisobga oladi.
Bog‘liq tushunchalar
physical memory, fragmentation, buddy allocator, page migration, huge page, memory reclaim