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