Bosh sahifa Wiki Dynamic memory

Dynamic memory

Dynamic memory — dastur bajarilish vaqtida ehtiyojga qarab ajratadigan va hayot siklini boshqaradigan xotiradir. U compile time’da hajmi noma’lum kolleksiya, obyekt grafigi, buffer va uzoq yashovchi ma’lumot uchun ishlatiladi. Native tillarda allocator va ownership bevosita, managed tillarda garbage collector orqali boshqarilishi mumkin.

Heap allocation

malloc yoki new so‘ralgan hajmga mos blok qaytaradi. Allocator kichik bloklar uchun size class va free list, katta blok uchun virtual memory mapping ishlatishi mumkin. Qaytgan manzil alignment talabiga mos bo‘ladi. Allocation muvaffaqiyatsiz qaytishi yoki til siyosatiga ko‘ra exception berishi mumkin; natija taxmin qilinmaydi.

free yoki delete blokni allocatorga qaytaradi, lekin fizik RAM darhol operatsion tizimga berilmasligi mumkin. Allocator kelajak allocation uchun uni cache qiladi. Shu sababli process RSS bo‘shatishdan keyin ham yuqori qolishi leakni avtomatik isbotlamaydi.

Fragmentation

External fragmentation bo‘sh joylar mavjud bo‘lsa ham katta uzluksiz blok topilmasligini, internal fragmentation esa allocation class yoki alignment ichidagi ishlatilmagan joyni bildiradi. Uzoq yashovchi va qisqa yashovchi obyektlar aralashsa heap parchalanishi mumkin. Arena va pool bir xil lifetime’dagi obyektlarni guruhlaydi.

Compacting garbage collector tirik obyektlarni ko‘chirib fragmentationni kamaytiradi, lekin pause va pointer yangilash talab qiladi. Native pointerlar ko‘chirishni qiyinlashtiradi. Region allocator butun guruhni birdan ozod qilib individual free xarajatini kamaytiradi.

Ownership

Yagona egali obyekt scope tugaganda avtomatik ozod qilinadi. Shared ownership reference count bilan ishlashi mumkin, ammo sikl bo‘lsa count nolga tushmaydi. Weak reference siklni uzadi. Borrowing model egasi tirik paytda vaqtinchalik reference beradi va use-after-free’ni compile time’da cheklashi mumkin.

Manual boshqaruvda leak, double free, buffer overflow va UAF asosiy xatolardir. RAII cleanupni destructorga bog‘laydi. C API bilan til chegarasida kim ajratib, kim qaysi allocator bilan bo‘shatishi contractda aniq yoziladi; turli runtime heaplarini aralashtirish xavfli.

Unumdorlik va kuzatuv

Har kichik obyektni heapda ajratish lock, metadata va cache miss xarajatini oshiradi. Stack yoki inline storage qisqa lokal ma’lumot uchun arzonroq. Object pool allocationni kamaytiradi, lekin eskirgan holatni tozalash va pool o‘sishini cheklash kerak.

Heap profiler allocation soni, bayt, call stack va tirik obyekt retentionini ko‘rsatadi. Leakni topishda bir snapshotdan ko‘ra vaqt bo‘yicha doimiy o‘sish va dominator tree foydali. Memory limitga yaqinlashganda allocationni rad etish, cache evict va backpressure boshqariladi; OOM paytida murakkab recovery uchun yangi xotira ajratib bo‘lmasligi mumkin.

Xavfsiz hajm hisoblash

Array uchun count * sizeof(element) overflow qilsa allocator kerakligidan kichik blok beradi. Checked multiplication va maksimal element soni allocationdan oldin tekshiriladi. Zero-size allocation turli API’da NULL yoki free qilinishi mumkin bo‘lgan noyob pointer qaytarishi mumkin; kod uning contractiga mos yoziladi. realloc muvaffaqiyatsiz bo‘lsa eski blok saqlanadi, natijani bevosita ayni pointerga yozish reference’ni yo‘qotib leak yaratadi. Yangi vaqtinchalik pointer tekshirilgach almashtiriladi. Sensitive buffer free’dan oldin compiler o‘chirib yubormaydigan secure zero funksiyasi bilan tozalanadi, lekin swap va oldingi nusxalar uchun alohida siyosat kerak.

Dinamik xotira bilan ishlashda egalik qoidasi aniq bo‘lishi zarur: qaysi qism obyektni yaratishi va qaysi qism uni ozod qilishi belgilanadi. Noaniq egalik sizib chiqish hamda takroriy bo‘shatish xatolarini kuchaytiradi.

Bog‘liq tushunchalar

Heap, Allocator, Garbage collection, Fragmentation, Ownership, Memory leak