Sobes.tech
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 new veya 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