Middle
Иштөө убактысы (runtime) эмне жана планлаштыргыч (scheduler) кандай иштейт?
sobes.tech AI
AIден жооп
Go-до ишке ашыру убактысы (runtime) — бул Go программалары ишке ашырылуучу чөйрө. Ал төмөнкүлөрдү камтыйт:
- Эстутумду башкаруу: Garbage collector (көпчүлүк учурда кутулушу) автоматтык түрдө эстутумду бөлүү жана бошотуу менен иштейт.
- Жоспорчулук (scheduler): Жергиликтүү жиптерде (горутинахта) иштетүүнү башкаруу.
- Жүйөлүк чакыруулар: Операциялык тутум менен өз ара аракеттенүү үчүн интерфейс.
- Синхрондоштуруу примитивдери: Каналдар, мьютекстер жана башка механизмдер.
Go-дун планировчусу M:N моделин ишке ашырган (бир нече горутин бир нече операциялык тутумдун жиптеринде). Анын негизги компоненттери:
- G (Goroutine): Жеңил иштетүү жипи, негизинен функциянын абстракциясы.
- M (Machine): Операциялык тутумдун жипи, анда Go программалары ишке ашырылат.
- P (Processor): Логикалык процессор, операциялык тутумдун жипине байланыштуу. Ал жергиликтүү
runnableкезегин сактайт.
Жоспорчулучулук принципи:
- Горутиналар (G) түзүлүп, глобалдык же жергиликтүү
runnableкезекке кошулат. - M операциялык тутумдун жиптери (M) P менен байланыштуу. P саны стандарттык түрдө CPU ядролорунун санына (
GOMAXPROCS) барабар. - P өзүнүн жергиликтүү кезегинен горутинаны алат. Эгер жергиликтүү кезек бош болсо, P башка Pдин кезегинен же глобалдык кезектен горутиналарды уурдап алууга аракет кылат.
- M горутинаны иштетет.
- Эгер горутина блоктосо (мисалы, каналдан маалымат жок учурда окуу же системдик чакырууда), M-дары ажырап, P башка горутинаны иштетүүгө даяр болот. Блоктогон горутина күтүүлүккө коюлат. Блоктан чыгуу менен кайра
runnableболуп, кезекке коюлат. - Эгер M системдик чакырууда блоктосо, ал Pти кармабайт. Жаңы M түзүлүшү мүмкүн же бар M колдонулушу мүмкүн, ошондо P башка горутиналарды иштетүүнү уланта алат.
Бул ыкма процессор ресурстарын эффективдүү пайдаланууга жана параллелдүү тапшырмаларды оңой масштабдоого мүмкүндүк берет, операциялык тутумдун жиптерин башкаруу татаалдыгын иштеп чыгуучудан жашырат.
// Горутинаны түзүү мисалы
func myFunc() {
// Горутинанын коду
}
func main() {
go myFunc() // Горутинаны ишке киргизүү
// Негизги программа параллелдүү иштөөдө улантат
}