Bosh sahifa Wiki Heap

Heap

Heap — dastur ishlash vaqtida dinamik xotira ajratish uchun foydalanadigan memory region. Object yoki buffer hajmi compile vaqtida noma’lum bo‘lsa, allocator heap’dan joy beradi.

C tilida malloc, C++da new, ko‘plab yuqori darajali tillarda object yaratish heap allocationga olib kelishi mumkin.

Heap data strukturadagi binary heap bilan bir xil tushuncha emas.

Dynamic allocation

Dastur xotira so‘raydi:

allocator → kerakli hajmdagi blok

Blok pointer yoki reference orqali ishlatiladi.

Keyin:

  • qo‘lda bo‘shatiladi;
  • garbage collector tomonidan yig‘iladi;
  • process tugaganda OS tomonidan qaytariladi.

Heap va stack

Jihat Heap Stack
Allocation Dynamic Function call bilan avtomatik
Umri Explicit yoki GCga bog‘liq Scope/call tugaguncha
Hajm Katta va moslashuvchan Thread limitiga bog‘liq
Tezlik Allocator ishlovi kerak Stack pointer o‘zgaradi
Fragmentatsiya Bo‘lishi mumkin Kamroq
Sharing Threadlar umumiy Har threadda alohida

Barcha local object stackda, barcha object heapda degan qoida har til va compilerda bir xil emas.

Allocator

Allocator katta memory regionlarni operatsion tizimdan oladi va kichik bloklarga bo‘ladi.

Vazifalari:

  • mos bo‘sh blok topish;
  • alignment;
  • metadata;
  • bo‘shatish;
  • bloklarni birlashtirish;
  • thread contentionni kamaytirish;
  • xavfsizlik tekshiruvi.

Keng tarqalgan allocatorlar turli strategiyadan foydalanadi.

Operatsion tizimdan xotira olish

Allocator xotirani:

  • brk yoki sbrk tarixan;
  • mmap;
  • virtual memory API

orqali olishi mumkin.

Katta allocation alohida mapping sifatida yaratilishi mumkin.

free() qilingan memory har doim darhol OSga qaytmaydi. Allocator keyingi so‘rov uchun saqlab qoladi.

Allocation metadata

Har blok yonida yoki alohida strukturada:

  • hajm;
  • holat;
  • oldingi/keyingi bo‘sh blok;
  • arena;
  • checksum yoki guard

saqlanishi mumkin.

Buffer overflow metadata’ni buzsa, keyingi free yoki allocation paytida crash yuz beradi.

Alignment

CPU va SIMD instructionlar ma’lumotning ma’lum chegaraga tekislanishini talab qilishi yoki undan foyda ko‘rishi mumkin.

Allocator odatda umumiy alignment kafolatlaydi.

Maxsus:

APIlari mavjud.

Free list

Bo‘sh bloklar hajm yoki joylashuv bo‘yicha ro‘yxatlarda saqlanadi.

Allocation algoritmlari:

  • first fit;
  • best fit;
  • segregated bins;
  • buddy;
  • slab;
  • arena.

Har birining tezlik va fragmentation xususiyati farq qiladi.

Internal fragmentation

Ajratilgan blok so‘ralgan hajmdan kattaroq.

Masalan, 33 bayt so‘rov 48 bayt size class oladi.

Ortiqcha qism internal fragmentation.

Alignment va metadata ham overhead qo‘shadi.

External fragmentation

Bo‘sh xotira umumiy hajmda yetarli, lekin kichik tarqoq bloklarga bo‘lingan.

Katta contiguous block topilmaydi.

Bloklarni birlashtirish va size class strategiyasi yordam beradi.

Virtual memory fizik contiguous xotira talabini kamaytiradi, lekin allocator virtual region ichida fragmentatsiyaga ega bo‘lishi mumkin.

Memory leak

Dastur heap blockga reference’ni yo‘qotadi, ammo uni bo‘shatmaydi.

Process ishlash davomida xotira sarfi o‘sadi.

Leak manbalari:

  • missing free;
  • global cache;
  • listener olib tashlanmagan;
  • reference cycle;
  • queue;
  • thread-local;
  • native extension.

Garbage collector barcha leakni yo‘q qilmaydi. Keraksiz objectga reference qolsa, u yig‘ilmaydi.

Dangling pointer

Blok bo‘shatilgan, ammo pointer saqlanib qolgan.

Undan foydalanish use-after-free hisoblanadi.

Blok boshqa object uchun qayta ishlatilishi mumkin.

Pointer’ni NULL qilish barcha aliaslarni avtomatik tozalamaydi.

Double free

Bir blok ikki marta allocatorga qaytariladi.

Bu free list va metadata’ni buzishi mumkin.

Zamonaviy allocator ayrim double free’ni aniqlab processni to‘xtatadi.

Buffer overflow

Ajratilgan blok chegarasidan tashqariga yozish qo‘shni object yoki metadata’ni buzadi.

Misol:

10 bayt ajratildi
20 bayt yozildi

Natija darhol emas, keyingi allocation yoki free paytida ko‘rinishi mumkin.

Heap corruption

Belgilar:

Asl xato crashdan ancha oldin sodir bo‘lgan bo‘lishi mumkin.

Sanitizer va deterministic test yordam beradi.

Thread safety

Ko‘p thread bir allocator’dan foydalanadi.

Global lock contentionni kamaytirish uchun:

  • per-thread cache;
  • arena;
  • size class;
  • lock-free fast path

ishlatiladi.

Bir thread ajratgan blokni boshqasi bo‘shatishi mumkin, ammo allocator semantikasi bunga mos bo‘lishi kerak.

Arena

Allocator heapni bir nechta arena’ga bo‘lishi mumkin.

Threadlar turli arena bilan parallel ishlaydi.

Ko‘p arena memory footprint va fragmentationni oshirishi mumkin.

Container memory limitida allocator defaultlari moslashtiriladi.

Garbage collection

Managed runtime heap objectlarini avtomatik boshqaradi.

GC usullari:

  • reference counting;
  • mark-and-sweep;
  • generational;
  • copying;
  • compacting;
  • concurrent;
  • incremental.

GC memory safetyni yaxshilaydi, ammo pause va overheadga ega.

Generational heap

Ko‘p object qisqa umr ko‘radi degan kuzatuvga tayanadi.

Heap:

  • young generation;
  • old generation

ga bo‘linadi.

Young collection tez-tez, old collection kamroq bajariladi.

Uzoq yashaydigan object promote qilinadi.

Compacting

GC tirik objectlarni bir joyga ko‘chirib, bo‘sh hududni birlashtiradi.

Bu external fragmentationni kamaytiradi.

Pointerlar runtime tomonidan yangilanadi. Native raw pointerlar maxsus handle talab qilishi mumkin.

Heap growth

Process RSS va virtual memory bir xil emas.

Allocator katta virtual region rezerv qilib, faqat ishlatilgan sahifalarni RAMga olib kelishi mumkin.

free() qilingan blok allocator ichida qolsa, RSS darhol kamaymaydi.

Bu har doim leak degani emas.

Memory limit

Container yoki service memory limitga ega bo‘lishi mumkin.

Heap limitdan oshsa:

yuz beradi.

Application heap metriği bilan process RSS birga kuzatiladi.

Profiling

Heap profiler:

  • qaysi call site allocation qiladi;
  • object soni;
  • retained size;
  • allocation rate;
  • leak;
  • fragmentation

ni ko‘rsatadi.

Snapshotlar vaqt bo‘yicha solishtiriladi.

Faqat eng katta object emas, uni ushlab turgan reference chain muhim.

Xavfsizlik

Heap exploitationga qarshi allocator:

  • randomization;
  • guard;
  • quarantine;
  • metadata check;
  • safe unlink;
  • pointer encoding;
  • zeroing

kabi himoya ishlatishi mumkin.

Memory-safe til va process sandbox qo‘shimcha himoya beradi.

Diagnostika

Heap muammosida:

  • allocation rate;
  • live object;
  • RSS;
  • virtual size;
  • GC pause;
  • fragmentation;
  • double free;
  • use-after-free;
  • sanitizer;
  • heap snapshot;
  • OOM log

tekshiriladi.

Xotira o‘sishi leak, cache, allocator retention yoki normal workload sabab bo‘lishi mumkin. Ular alohida ajratiladi.

Bog‘liq tushunchalar

Dynamic memory, Allocator, Stack, Memory leak, Fragmentation, Garbage collection, Use-after-free, Double free, OOM, Heap profiler