Sobes.tech
Middle+

Горутини кандай түзүлүп, стекте канча жадды ээлейт?

sobes.tech AI

AIден жооп

Горутина — бул жеңил ишке ашыруу агымы, аны ишке ашыруу чөйрөсү башкарган. Операциялык тутумдун агымдарына караганда, горутиналар аз сандагы ОС агымдарына мультиплексирленет. Бул жакшы масштабдоону камсыздайт.

Негизги аспектилер:

  • Жоспорчул (Scheduler): Go ишке ашыруу чөйрөсүнүн өзүнүн планировщусу (M:N scheduler) бар, ал горутиналарды (M) чектелген сандагы ОС агымдарына (N) башкарат.
  • Эстутум менеджери (Memory Manager): Горутиналардын стеклерин жана алардын өсүшүн/азайышын башкарат.
  • Камтамасыздоо: Горутиналар каналдар аркылуу өз ара аракеттенет, бул көбүнчө блоктоолор/мютекссиз коопсуз маалымат алмашууну камсыздайт.

Горутинанын стеки:

  • Баштапкыда, горутиналардын стеклери кичинекей, адатта 2 КБ (Go 1.4-төн мурун 4 КБ).
  • Стек динамикалык өсөт жана кыскарат. Анын ашып кетсе, автоматтык түрдө кеңейтилет, жана эс тутум бошотулса, кыскарат.
  • Бул динамикалык стек башкаруу чыгымдарды азайтат, операциялык тутумдун чоң туруктуу стеклерине салыштырмалуу.

Эс тутум колдонуу:

  • Жасалганда, горутинанын орточо 2 КБ эс тутуму талап кылынат.
  • Эс тутум колдонуу функция чакыруулары менен динамикалык өсүшү мүмкүн жана кайтарганда азая алат.
  • Максималдуу стек өлчөмү чектелген, бирок көп тапшырмалар үчүн жетиштүү чоң (көпчүлүк учурда бир нече МБ).
package main

import (
	"fmt"
	"runtime"
	"time"
)

func sayHello() {
	fmt.Println("Салам, горутиндан!")
}

func main() {
	// Горутин түзүүнүн мисалы
	go sayHello()

	// Горутин ишин байкоо үчүн
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Горутиналардын саны: %d\n", runtime.NumGoroutine())
}

Бул мисалда, sayHello башка горутин катары иштейт. runtime.NumGoroutine() активдүү горутиналардын санын көрсөтөт (негизги менен кошо).