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
newyoki 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 |