Hafıza bloklarını 2'nin kuvvetleri halinde bölen Buddy Sistemini, GC Mark-Sweep erişilebilirlik taramasını ve boş hafıza bloklarını birleştirmeyi (Coalescing) içerir.
Bellek Yönetimi, programların çalışma zamanında ihtiyaç duyduğu dinamik hafıza isteklerini verimli karşılamak ve kullanılmayan alanları sisteme geri kazandırmak için kullanılan sistem algoritmalarıdır.
Buddy Bellek Sistemi (Buddy System), hafızayı $2^k$ boyutlarında bloklara ayırır. Bir istek geldiğinde en küçük uygun $2^k$ bloğu bulmak için büyük bloklar ortadan ikiye ("buddy" - arkadaş) bölünür. Bloklar serbest kaldığında ise yanındaki boş buddy bloğu ile otomatik birleştirilerek tekrar büyütülür.
Çöp Toplama (Garbage Collection), artık referans verilmeyen nesnelerin otomatik taranıp temizlenmesidir. Mark-Sweep algoritmasında, kök nesnelerden (root) başlanarak DFS/BFS ile tüm aktif nesneler işaretlenir (Mark). İşaretlenmeyenler ise temizlenir (Sweep). Rekürsif olmayan Schorr-Waite algoritması ise ek bir yığın (stack) kullanmadan, nesne göstergelerini yönlendirerek işaretleme yapar.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1export interface BuddyBlock {2 size: number;3 offset: number;4 allocated: boolean;5}67export class BuddyAllocator {8 private memorySize: number;9 public blocks: BuddyBlock[] = [];10 11 constructor(totalSize: number) {12 this.memorySize = totalSize;13 this.blocks.push({ size: totalSize, offset: 0, allocated: false });14 }15 16 public allocate(requestSize: number): BuddyBlock | null {17 // Find smallest power of 2 that holds requestSize18 let powerSize = 1;19 while (powerSize < requestSize) {20 powerSize *= 2;21 }22 23 // Find suitable block24 let bestIdx = -1;25 for (let i = 0; i < this.blocks.length; i++) {26 const b = this.blocks[i];27 if (!b.allocated && b.size >= powerSize) {28 if (bestIdx === -1 || b.size < this.blocks[bestIdx].size) {29 bestIdx = i;30 }31 }32 }33 34 if (bestIdx === -1) return null; // No memory35 36 // Split block until size matches powerSize37 while (this.blocks[bestIdx].size > powerSize) {38 const b = this.blocks[bestIdx];39 const halfSize = b.size / 2;40 41 // Split into two buddies42 const left: BuddyBlock = { size: halfSize, offset: b.offset, allocated: false };43 const right: BuddyBlock = { size: halfSize, offset: b.offset + halfSize, allocated: false };44 45 this.blocks.splice(bestIdx, 1, left, right);46 // bestIdx points to left buddy now47 }48 49 this.blocks[bestIdx].allocated = true;50 return this.blocks[bestIdx];51 }52}Buddy bellek tahsis adımlarını (bölme/birleştirme) ve GC erişilebilirlik işaretlemelerini adım adım izleyin.
Buddy bellek tahsis adımlarını (bölme/birleştirme) ve GC erişilebilirlik işaretlemelerini adım adım izleyin.
En İyi Durum: O(log n) - Buddy tahsisi veya serbest bırakması
Ortalama Durum: O(log n)
En Kötü Durum: O(V + E) - GC işaretleme (tüm nesne grafı taranır)
O(n) - Hafıza blokları listesi veya GC yığın derinliği - Bu algoritmanın karmaşıklığı belirtilmemiş.
Bellek Yönetimi ve Çöp Toplama (Memory Management & GC) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: