Middle+
Go dilinde yığın nasıl yapılandırılmıştır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Golang'da, yığın (heap), dinamik olarak tahsis edilen nesnelerin yerleştirildiği bir bellek alanıdır. Bu belleğin yönetimi otomatik olarak çöp toplayıcı tarafından yapılır.
Anahtar noktalar:
- Dinamik tahsis: Küçük ve kısa ömürlü nesneler, derleyicinin yaşam sürelerini fonksiyon veya yığın sınırlarıyla sınırlı olduğunu kanıtlayamadığı veya
newveya adres alma (&) kullanılarak tahsis edilen nesneler genellikle yığında yer alır. - Çöp toplayıcı (GC): Go, eşzamanlı, üç renkli, Mark-and-Sweep çöp toplayıcı kullanır. Programın yürütmesiyle eşzamanlı çalışır ve duraklamaları en aza indirir.
- İşaretleme (Mark): GC, kök göstergelerden (yerel değişkenler yığında, küresel değişkenler) erişilebilir nesneleri tarar ve "canlı" olarak işaretler.
- Temizleme (Sweep): GC, erişilebilir olan tüm yığını tarar ve "canlı" olarak işaretlenmeyen nesnelerin kapladığı belleği serbest bırakır.
- Eşzamanlı: GC, ana programın gecikmesini azaltmak için ayrı goroutine'lerde çalışır.
- Kaçış Analizi: Golang derleyicisi, bir değişkenin veya değerin yığını mı yoksa yığını mı gösterdiğini belirlemek için kaçış analizi yapar. Bir değişken veya yapı alanı, mevcut goroutine'den dönüş sonrası erişilebilir olabiliyorsa, büyük olasılıkla yığında tahsis edilir. Aksi takdirde, yığında tahsis edilebilir.
// Kaçış analizi örneği. // Bu nesne büyük olasılıkla yığında tahsis edilir, // çünkü gösterici döndürülür. func createPoint() *Point { p := Point{X: 1, Y: 2} return &p // Gösterici "kaçıyor" fonksiyondan } // Bu nesne büyük olasılıkla yığında tahsis edilir, // çünkü fonksiyon tamamlandıktan sonra erişilebilir değildir. func processValue() { val := 10 println(val) } type Point struct { X, Y int } - Arena bölünmesi: Go'daki yığın, çöp toplayıcının özellikle çok işlemcili sistemlerde daha verimli çalışmasına yardımcı olmak için birkaç arene bölünebilir.
- mmap kullanımı: Golang, büyük sanal bellek bloklarını tahsis etmek için sistem çağrısı
mmap'yi kullanır. - Süreklilik: Bazı dillere kıyasla, Go nesnelerin fiziksel sürekliliğini garanti etmez. Bellek parçalanmış olabilir.
- Manuel bellek yönetimi yok: Geliştirici, yığında bellek tahsis veya serbest bırakmayı açıkça yapmaya gerek duymaz. GC bunu otomatik olarak yapar.
Golang'da yığın ve yığın farklı roller üstlenir:
| Bellek alanı | Amaç | Yönetim | Yaşam süresi |
|---|---|---|---|
| Yığın | Yerel değişkenler, fonksiyon parametreleri, dönüş adresleri | Otomatik (fonksiyon giriş/çıkışında) | Fonksiyonun çalışma süresiyle sınırlıdır |
| Yığın | Dinamik olarak tahsis edilen nesneler, "kaçan" nesneler, büyük yapılar | Çöp toplayıcı (GC) | Köklerden erişilebilirliğe bağlı olarak belirlenir |