Middle+
Go тилиндеги атаандаштыкты башкаруу үлгүсү (GMP) жөнүндө айтып бериңиз.
sobes.tech AI
AIден жооп
GMP - бул Go тилиндеги горутиндерди ишке ашыруу планын түзүү модели, анда:
- G (Goroutine): Жеңил салмактагы иштөө агымы, системдик агымдарга карата абстракция.
- M (Machine): Операциялык тутумдун системдик агымы. Бир нече горутиндерди ишке ашыра алат.
- P (Processor): Логикалык процессор, горутиндерди ишке ашыруу үчүн контекстти көрсөтөт. Ар бир P үчүн M белгиленет, жана P runnable горутиндердин жергиликтүү кезегин камтыйт. P саны әдепки
$GOMAXPROCS(көбүнчө процессордун ядролорунун саны) менен барабар.
Мындайча иштейт:
- Планировщик (Go рантаймынын бөлүгү) жаңы горутиндерди глобалдык же жергиликтүү P кезегине коюп коюу.
- P менен байланышкан M, P кезегинен горутинди алып, аны ишке ашырат.
- Эгерде горутина блоктосо (мисалы, I/O күтүп жатканда же мьютексте):
- M учурдагы P менен байланышты үзөт.
- Планировщик башка бир M табууга аракет кылат же жаңысын түзөт.
- Блоктогон горутина атайын кезекке коюлат.
- Блоктон кийин, горутина кайра runnable болуп, P кезегине кайтарат.
- Эгерде горутина өз квантын аяктап же ачык эле башкарууну өткөрүп берсе (азыркы учурда сейрек), планировщик 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) // горутиндердин аяктоосун күтүү
}