Ko'pgina dasturlash tillarida oqim yaratish (thread) operatsion tizim (OS thread) orqali amalga oshiriladi. Nega Go tili millionlab goroutine'larni xotirjam va juda kam resurs sarflab ishlata oladi? Javob Go Runtime Scheduler arxitekturasida yotadi!
Rob Pike (Go asoschisi):
"Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once." (Concurrency — bu bir vaqtda ko'p narsalar bilan ishlay olish tuzilishi. Parallelism — bu bir vaqtda ko'p narsalarni haqiqatda jismonan bajarish).
Go Runtime Scheduler 3 ta asosiy obyektga tayanadi:
P o'zining mahalliy navbatiga (Local Run Queue — 256 ta goroutine sig'imli) ega. [ Global Run Queue (GRQ) ]
│
┌─────────┴─────────┐
▼ ▼
┌───────┐ ┌───────┐
│ P 0 │ │ P 1 │ (Mantiqiy protsessorlar)
└───┬───┘ └───┬───┘
│ LRQ │ LRQ
[G1, G2] [G3, G4]
│ │
┌───┴───┐ ┌───┴───┐
│ M 0 │ │ M 1 │ (OS thread'lar CPU yadrosida)
└───────┘ └───────┘
Agar P 0 protsessori o'zining navbatidagi barcha goroutine'larni bajarib bo'lsa va bekor qolib ketsa, u nima qiladi?
P 1) ning navbatiga qaraydi;Bu algoritm CPU yadrolarining hech qachon bekor turmasligini va yuklama optimal taqsimlanishini kafolatlaydi!
runtime.GOMAXPROCS(n) — bu dasturda bir vaqtda parallel kod bajara oladigan P (protsessorlar) sonini belgilaydi.
Odatiy holatda u kompyuterdagi mantiqiy CPU yadrolari soniga teng bo'ladi (runtime.NumCPU()).
Operatsion tizim thread'lari odatda boshlang'ich 1MB dan 8MB gacha qat'iy stack talab qiladi. Shuning uchun 10 000 ta OS thread ochilsa, kamida 10-80 GB xotira kerak bo'ladi.
Goroutine esa atigi 2 KB boshlang'ich stack bilan tug'iladi! Agar funksiya chaqiruvlari chuqurlashib, 2KB yetmay qolsa, Go runtime uni xotirada avtomatik 4KB, 8KB, 16KB qilib kattalashtiradi (va aksincha, bo'shaganda kichraytiradi). Shu tufayli 100 000 ta goroutine atigi ~200MB xotira bilan ishlayveradi!
Tizimingizdagi CPU yadrolari sonini va joriy GOMAXPROCS qiymatini ekranga chiqaruvchi dastur yozing.
package main
import (
"fmt"
"runtime"
)
func main() {
// TODO: NumCPU va GOMAXPROCS qiymatlarini ekranga chiqaring
}
Siz Gist of Go: Concurrency kursining barcha 13 ta bobini muvaffaqiyatli yakunladingiz!
Endi siz Go tilida:
context) tizimini;Tabriklaymiz, siz Go Concurrency bo'yicha professional bilimlarga ega bo'ldingiz!