Sobes.tech
Middle

Иштөө убактысы (runtime) эмне жана планлаштыргыч (scheduler) кандай иштейт?

sobes.tech AI

AIден жооп

Go-до ишке ашыру убактысы (runtime) — бул Go программалары ишке ашырылуучу чөйрө. Ал төмөнкүлөрдү камтыйт:

  • Эстутумду башкаруу: Garbage collector (көпчүлүк учурда кутулушу) автоматтык түрдө эстутумду бөлүү жана бошотуу менен иштейт.
  • Жоспорчулук (scheduler): Жергиликтүү жиптерде (горутинахта) иштетүүнү башкаруу.
  • Жүйөлүк чакыруулар: Операциялык тутум менен өз ара аракеттенүү үчүн интерфейс.
  • Синхрондоштуруу примитивдери: Каналдар, мьютекстер жана башка механизмдер.

Go-дун планировчусу M:N моделин ишке ашырган (бир нече горутин бир нече операциялык тутумдун жиптеринде). Анын негизги компоненттери:

  • G (Goroutine): Жеңил иштетүү жипи, негизинен функциянын абстракциясы.
  • M (Machine): Операциялык тутумдун жипи, анда Go программалары ишке ашырылат.
  • P (Processor): Логикалык процессор, операциялык тутумдун жипине байланыштуу. Ал жергиликтүү runnable кезегин сактайт.

Жоспорчулучулук принципи:

  1. Горутиналар (G) түзүлүп, глобалдык же жергиликтүү runnable кезекке кошулат.
  2. M операциялык тутумдун жиптери (M) P менен байланыштуу. P саны стандарттык түрдө CPU ядролорунун санына (GOMAXPROCS) барабар.
  3. P өзүнүн жергиликтүү кезегинен горутинаны алат. Эгер жергиликтүү кезек бош болсо, P башка Pдин кезегинен же глобалдык кезектен горутиналарды уурдап алууга аракет кылат.
  4. M горутинаны иштетет.
  5. Эгер горутина блоктосо (мисалы, каналдан маалымат жок учурда окуу же системдик чакырууда), M-дары ажырап, P башка горутинаны иштетүүгө даяр болот. Блоктогон горутина күтүүлүккө коюлат. Блоктан чыгуу менен кайра runnable болуп, кезекке коюлат.
  6. Эгер M системдик чакырууда блоктосо, ал Pти кармабайт. Жаңы M түзүлүшү мүмкүн же бар M колдонулушу мүмкүн, ошондо P башка горутиналарды иштетүүнү уланта алат.

Бул ыкма процессор ресурстарын эффективдүү пайдаланууга жана параллелдүү тапшырмаларды оңой масштабдоого мүмкүндүк берет, операциялык тутумдун жиптерин башкаруу татаалдыгын иштеп чыгуучудан жашырат.

// Горутинаны түзүү мисалы
func myFunc() {
	// Горутинанын коду
}

func main() {
	go myFunc() // Горутинаны ишке киргизүү
	// Негизги программа параллелдүү иштөөдө улантат
}