Sobes.tech
Middle+

Go тилиндеги атаандаштыкты башкаруу үлгүсү (GMP) жөнүндө айтып бериңиз.

sobes.tech AI

AIден жооп

GMP - бул Go тилиндеги горутиндерди ишке ашыруу планын түзүү модели, анда:

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

Мындайча иштейт:

  1. Планировщик (Go рантаймынын бөлүгү) жаңы горутиндерди глобалдык же жергиликтүү P кезегине коюп коюу.
  2. P менен байланышкан M, P кезегинен горутинди алып, аны ишке ашырат.
  3. Эгерде горутина блоктосо (мисалы, I/O күтүп жатканда же мьютексте):
    • M учурдагы P менен байланышты үзөт.
    • Планировщик башка бир M табууга аракет кылат же жаңысын түзөт.
    • Блоктогон горутина атайын кезекке коюлат.
    • Блоктон кийин, горутина кайра runnable болуп, P кезегине кайтарат.
  4. Эгерде горутина өз квантын аяктап же ачык эле башкарууну өткөрүп берсе (азыркы учурда сейрек), планировщик M-ны башка горутинге которо алат ошол эле P ичинде.

Мындай ыкманын артыкчылыктары:

  • Жүйөлүк агымдар Mдин эффективдүү колдонулушу.
  • Нативдүү ОС агымдарына салыштырмалуу контекстти которуу чыгымдарын азайтуу.
  • "Work stealing" механизми аркылуу P арасындагы жүктү теңдөө (M башка Pдин кезегинен горутин уурдай алат).

Горутина түзүү мисалы:

// main.go
пакет main

импорт (
	"fmt"
	"time"
)

функция иштөөчү(id int) {
	fmt.Printf("Иштөөчү %d башталды\n", id)
	time.Sleep(time.Second) // блоктоо/иштөө иллюстрациясы
	fmt.Printf("Иштөөчү %d аяктады\n", id)
}

функция main() {
	for i := 1; i <= 5; i++ {
		go иштөөчү(i) // жаңы горутин түзүү
	}

	time.Sleep(time.Second * 2) // горутиндердин аяктоосун күтүү
}