Sobes.tech
Middle+

Go tilida to'plam qanday tuzilgan?

sobes.tech AI

AIdan javob

In Golang, to'plam (heap) — bu xotira maydoni bo'lib, unda dinamik tarzda ajratilgan obyektlar joylashtiriladi. Bu xotira boshqaruvi avtomatik ravishda axlat tozalovchi (garbage collector) tomonidan amalga oshiriladi.

Asosiy jihatlar:

  • Dinamik ajratish: Kichik va qisqa muddatli obyektlar, kompilator ularning hayot davomiyligini funksiya yoki stack chegaralari bilan cheklashni isbotlay olmagan yoki new yoki adres olish (&) yordamida ajratilgan obyektlar odatda stackda joylashadi.
  • Axlat tozalovchi (GC): Go, konkurent, uch rangli, Mark-and-Sweep axlat tozalovchi ishlatadi. U dastur bajarilishi bilan parallel ishlaydi va pauzalarni minimallashtiradi.
    • Mark (Belgilash): GC, ildiz ko'rsatkichlar (stackdagi mahalliy o'zgaruvchilar, global o'zgaruvchilar) dan erishiladigan obyektlarni o'tib, ularni "jonli" sifatida belgilaydi.
    • Sweep (Tozalash): GC, mavjud bo'lgan butun heapni o'tib, "jonli" bo'lmagan obyektlar tomonidan egallangan xotirani bo'shatadi.
    • Konkurrent: GC, alohida gorutinalarda ishlaydi, asosiy dasturdagi kechikishlarni kamaytiradi.
  • Escape tahlili: Golang kompilyatori, o'zgaruvchi yoki qiymat stack yoki heapga ishora qilayotganini aniqlash uchun escape tahlilini o'tkazadi. Agar o'zgaruvchi yoki strukturaviy maydon, joriy gorutina qaytarilganidan keyin ham erishiladigan bo'lsa, u ehtimol heapda ajratiladi. Aks holda, stackda ajratilishi mumkin.
    // Escape tahlil misoli.
    // Bu obyekt ehtimol heapda ajratiladi,
    // chunki ko'rsatkich qaytariladi.
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // Ko'rsatkich "escape" qiladi
    }
    
    // Bu obyekt ehtimol stackda ajratiladi,
    // chunki u funksiyadan chiqib ketgach, erkin emas.
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Arena bo'linishi: Go'da heap, bir nechta arenalarga bo'linishi mumkin, bu esa axlat tozalovchiga samarali ishlashga yordam beradi, ayniqsa ko'p protsessorli tizimlarda.
  • mmap dan foydalanish: Golang, mmap (Memory Map) tizim chaqirig'idan foydalanib, katta virtual xotira bloklarini heap uchun ajratadi.
  • Davomiylik: Ba'zi tillarga qaraganda, Go, obyektlarning fizik davomiyligini kafolatlamaydi. Xotira bo'laklarga bo'lingan bo'lishi mumkin.
  • Qo'lda xotira boshqaruvi yo'q: Dasturchi, xotirani aniq ajratish yoki bo'shatishga ehtiyoj sezmaydi, GC buni avtomatik ravishda bajaradi.

Golang'da stack va heap turli rollarni bajaradi:

Xotira maydoni Maqsad Boshqaruv Hayot davomiyligi
Stack Mahalliy o'zgaruvchilar, funksiyalar parametrlari, qaytish manzillari Avtomatik (funksiya kirish/chiqishida) Funksiya bajarilish vaqtiga cheklangan
Heap Dinamik tarzda ajratilgan obyektlar, "escape" qilganlar, katta tuzilmalar Axlat tozalovchi (GC) Ob'ektning erishiluvchanligiga bog'liq