Middle+
Goroutinlar qanday tuzilgan va ular stekda qancha xotira egallaydi?
sobes.tech AI
AIdan javob
Gorutina — bu Go ijro oqimi bo‘sh va yengil oqim bo‘lib, Go ijro muhit tomonidan boshqariladi. Operatsion tizim iplaridan farqli o‘laroq, gorutinalar kamroq operatsion tizim iplariga multiplex qilinadi. Bu esa yaxshiroq kengaytirilishni ta'minlaydi.
Asosiy jihatlar:
- Rejalashtiruvchi (Scheduler): Go ijro muhitining o‘z rejalashtiruvchisi (M:N scheduler) bor, u gorutinalarni (M) cheklangan sonli operatsion tizim iplariga (N) boshqaradi.
- Xotira menejeri (Memory Manager): Gorutinalarning steklari va ularning o‘sishi/kichrayishini boshqaradi.
- Aloqa: Gorutinalar kanallar orqali muloqot qiladi, bu esa ko‘pchilik hollarda blokirovkalar/mutekslar bo‘lmasdan xavfsiz ma'lumot almashishni ta'minlaydi.
Gorutina steki:
- Dastlab, gorutinalarning steklari kichik, odatda 2 KB (Go 1.4 dan oldin 4 KB edi).
- Stek dinamik ravishda o‘sadi va qisqaradi. To‘lib ketganda, avtomatik kengayadi, va xotira bo‘shatilganda, qisqaradi.
- Bu dinamik boshqaruv operatsion tizim iplariga nisbatan xarajatlarni kamaytiradi.
Xotira iste'moli:
- Gorutina yaratilganda, odatda, 2 KB xotira egallaydi.
- Xotira iste'moli funksiyalar chaqirilishi bilan dinamik ravishda oshishi va ularning qaytishi bilan kamayishi mumkin.
- Maksimal stek o‘lchami cheklangan, lekin ko‘pchilik vazifalar uchun yetarlicha katta (odatda bir necha MB).
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Gorutina bilan salom!")
}
func main() {
// Gorutina yaratishni ko‘rsatish
go sayHello()
// Gorutinaning ishlashini kuzatish uchun
time.Sleep(100 * time.Millisecond)
fmt.Printf("Gorutinalar soni: %d\n", runtime.NumGoroutine())
}
Ushbu misolda, sayHello alohida gorutina sifatida ishlaydi. runtime.NumGoroutine() faol gorutinalar sonini (asosiy bilan birga) ko‘rsatadi.