Middle+
Go tilida raqobat boshqarish naqshini (GMP) haqida gapiring.
sobes.tech AI
AIdan javob
GMP - bu Go-da goroutinlarning bajarilishini rejalashtirish modeli bo‘lib, u yerda:
- G (Goroutine): Yengil vaznli bajarish oqimi, tizim oqimlari ustidan abstraktsiya.
- M (Machine): Operatsion tizimining oqimi. Bir yoki bir nechta goroutinlarning kodini bajarishi mumkin.
- P (Processor): Mantiqiy protsessor bo‘lib, u goroutinlarni bajarish uchun kontekstni ifodalaydi. Har bir P ga M tayinlangan va P lokal navbatda bajariladigan goroutinlarni saqlaydi. P ning standart soni
$GOMAXPROCS(odatda protsessor yadro soni).
Ishlash tartibi:
- Go-ning runtime qismi (scheduler) yangi goroutinlarni P ning global yoki lokal navbatlariga joylashtiradi.
- P bilan bog‘langan M, P ning navbatidan goroutinni oladi va uni bajaradi.
- Goroutin bloklanganida (masalan, I/O kutayotganda yoki mutexda):
- M hozirgi P dan ajraladi.
- Scheduler boshqa M ni topishga harakat qiladi yoki yangi M yaratadi.
- Bloklangan goroutin maxsus navbatga joylashtiriladi.
- Blokdan chiqarilgach, goroutin qayta runnable holatiga o'tadi va P ning navbatiga qaytadi.
- Goroutin vaqt kvantini tugatganda yoki aniq ravishda nazoratni qo‘yib yuborsa (kam hollarda), scheduler M ni boshqa goroutin bilan almashtirishi mumkin.
Ushbu yondashuvning afzalliklari:
- M tizim oqimlaridan samarali foydalanish.
- Tizim oqimlarining tabiiy o‘zgarishlariga nisbatan kontekst o‘zgartirish xarajatlarini kamaytirish.
- "Work stealing" mexanizmi yordamida P o‘rtasida yukni muvozanatlash (M, boshqa P ning navbatidan goroutinni o‘g‘irlay oladi).
Goroutin yaratish misoli:
// main.go
package main
import (
"fmt"
"time"
)
func worker(id int) {
fmt.Printf("Xodim %d boshlanmoqda\n", id)
time.Sleep(time.Second) // Bloklash/ishtirok etish misoli
fmt.Printf("Xodim %d tugadi\n", id)
}
func main() {
for i := 1; i <= 5; i++ {
go worker(i) // Yangi goroutin yaratish
}
time.Sleep(time.Second * 2) // Goroutinlar tugashini kutish
}