Sobes.tech
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:

  1. Go-ning runtime qismi (scheduler) yangi goroutinlarni P ning global yoki lokal navbatlariga joylashtiradi.
  2. P bilan bog‘langan M, P ning navbatidan goroutinni oladi va uni bajaradi.
  3. 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.
  4. 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
}