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() активдүү горутиналардын санын көрсөтөт (негизги менен кошо).