Sobes.tech
Middle+

Горутини чӣ гуна сохта шудаанд ва дар стек чанд ёддошт мегиранд?

sobes.tech AI

Ҷавоб аз AI

Горутин — это жеңіл орындалу ағыны, оны іске асыру ортасы басқарған. Операциялық жүйе ағындарынан айырмашылығы, горутиндер аз санына көпірмеленеді (мультиплексі). Бұл жақсы масштабталуды қамтамасыз етеді.

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

  • Жоспарлаушы (Scheduler): Go іске асыру ортасында өзінің жоспарлаушысы (M:N жоспарлаушы) бар, ол горутиндерді (M) шектеулі санына OS ағындарында (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() белсенді горутиндердің санын көрсетеді (негізгімен бірге).