Bu algoritmayı buraya taşıma sebebim Golang’ın “Tricolor Mark-And-Sweep Algoritması”nı kullanıyor olması, böylece GO’da işler nasıl yürüyor öğrenirken, yanında genel kültürümüzü de artırmış olacağız.
Tricolor Garbage Collection, Türkçe çevirisyle “Üç renkli çöp toplama” algoritması HEAP’de yer alan nesnelerin siyah, beyaz ve gri şeklinde üç gruba ayrılmasına dayanan bir Garbage Collection algoritması. Başlangıçta tüm nesneler beyazdır fakat algoritma tarafından zamanla gri ve ardından siyah kümelere taşınırlar. Toplanabilir kümeler beyaz kümede kalır ve buradan temizlenirler.
Bu renk kümelerinin anlamı
SİYAH: Beyaz kümedeki herhangi bir nesneyi referans gösteren işaretçiler (pointer) içermezler. Siyah gruptaki bir nesnenin beyazdakilerle ilişkisi olmadığı kesindir, ama tam tersi için bir zorunluluk yoktur. Siyah gruptaki hiç bir nesne doğrudan beyaza aktarılmaz.
GRİ: Beyaz kümedeki nesnelere referans gösteren işaretçiler içerebilirler.
BEYAZ: Temizlik için aday durumunda olan fakat siyah ve gri’den erişilme ihtimali de olan nesnelerdir.
Go Garbage Collector işini yapmaya başladığında önce tüm nesneleri beyaz grupta kabul eder ve kök nesnelerin hepsini dolaşarak bunları gri gruba alır. Kök nesneden kasıt uygulama tarafından doğrudan erişilebilen global değişkenler, stackdeki fonksiyonlar vs. vs. gibi nesnelerdir.
Akabinde gri gruptaki bir nesne alınır ve rengi siyaha çevrilir ve beyaz gruptaki herhangi bir nesnenin işaretçisini taşıyor mu buna bakılır. Yani gri bir nesnenin siyah olup olmadığı araştırılırken rengi siyaha çevrilir. Eğer beyazdaki herhangi bir nesneye işaretçisi olduğu bulunursa bu beyaz nesnede gri gruba alınır. (Siyahlar beyaza referans göstermez dedik, griye değil) Bu süreç gri gruptaki tüm nesnelerin üzerinden geçilene kadar devam eder. En sonunda beyazda başka hiç bir nesne ile ilişkisi olmayan nesneler kalır ve artık bu nesneleri hafızadan kaldırmak güvenlidir.
GO Garbage Collector nasıl çalışıyor?
Pusher, 2016 yılında paylaştıkları bir blog yazısında yukarıda anlattığım işaretleme sürecini görselleştirmiş. (Golang’s Real-time GC in Theory and Practice) GoLang’ın Garbage Collector’de kullandığı Tricolor Algoritması sayesinde sağladığı düşük gecikmeler, Haskell’den Go’ya geçiş sebepleri, elde ettikleri pratik sonuçlar vs. gibi derin ve öğretici bu yazıdaki görsel yapıtı basit olarak anlamak için de çok faydalı.
Bu algoritmayı bilmek neden önemli?
Amacımız bu algoritmayı aktif şekilde uyarlamak, tüm tasarımımızı buna göre yapmak, hatta geliştirip daha iyi hale getirmek değil. Zaten daha ayrıntılı öğrenmek isterseniz akademik yayınlar, ileri seviye yazılım hatta donanım bilgisi gereksinimi, saatler süren okumalar vs karşınıza çıkacak.
Bu yazıdaki amacımız Garbage Collector’ün temizliği nasıl yaptığını anlamak, nesnelerin beyaz gruba girmeleri gerektiğini farkında olmaktı. Açıkçası ben de daha fazlası ile ilgilenmiyorum. Garbage Collector çalışma mantığını tamamen göz ardı edersek programımızın düşük performansı, yüksek kaynak (hafıza) kullanımı vs. sorunların sebeplerini de anlayamayız. İhtiyacımız olmayan bir nesne, siyah veya gri bir nesne tarafından referans gösterildiği için hiç bir zaman beyaz gruba alınmayabilir. Hafıza yönetimini Go yapsa da, ona doğru yolu göstermek bizim işimiz.
Ben daha fazlasını öğrenmek isterim derseniz
James Fisher’in konuyla ilgili videolarını tavsiye edebilirim.
Ardan Labs’ın yazı dizisini faydalı bulabilirsiniz.
Vincent Blanchon’un şu yazısını beğendebilirsiniz.
Kapak Fotoğrafı Lara Jameson
Bu Yazıda Yapılan Değişiklikler
- 11.05.2022: Yazı özeti düzenlendi.