Work stealing
- Go kursu
- Uzman
- Ders 3/34
- 4 dk
Boşta kalan processor'ların iş çalma mekanizmasını öğrenirsin.
Work stealing
Her P'nin 256 yerlik yerel bir kuyruğu vardır; ayrıca tüm P'lerin paylaştığı bir global kuyruk bulunur. Bir P'nin işi bitince sırayla şunlara bakar: kendi kuyruğu → global kuyruk → ağ poller'ı → başka bir P'nin kuyruğunun yarısını çalmak.
P0: [G1 G2 G3 G4] P1: []
P1 çalar → P0: [G1 G2] P1: [G3 G4]Böylece yük, merkezi bir kilide ihtiyaç duymadan çekirdekler arasında dengelenir.
runnext ve yerellik
Yeni oluşturulan goroutine, onu oluşturan P'nin runnext yuvasına konur ve sıradaki ilk çalışan olur. Üretici-tüketici desenlerinde iki goroutine aynı P'de art arda çalışır; önbellek sıcak kalır. Yerel kuyruk taşarsa yarısı global kuyruğa aktarılır.
Uygulama Paralel işçiler
sync.WaitGroup ile 8 goroutine başlat; her biri 1'den 1000'e kadar toplasın ve sonucu bir dilimde kendi indeksine yazsın. Hepsini bekle ve dilimdeki ilk değeri yazdır.
Başlangıç kodu
package main
import (
"fmt"
"sync"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"sync"
)
func main() {
sonuc := make([]int, 8)
var wg sync.WaitGroup
for i := 0; i < 8; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
t := 0
for j := 1; j <= 1000; j++ {
t += j
}
sonuc[i] = t
}(i)
}
wg.Wait()
fmt.Println(sonuc[0])
}Beklenen çıktı
500500
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Global kuyruk neden zaman zaman yerel kuyruktan önce kontrol edilir?
- Daha hızlı olduğu için
- Yerel kuyruk boş olamayacağı için
- GC bunu gerektirdiği için
- Global kuyruktaki goroutine'ler aç kalmasın diye Doğru cevap
Açıklama: Zamanlayıcı her 61 zamanlama adımında bir global kuyruğa bakar; aksi halde dolu yerel kuyruklar global işleri sonsuza dek bekletebilirdi.
2 Çalınan miktar
calinan := len(kurban.kuyruk) / ____
calinan := len(kurban.kuyruk) / 2
Açıklama: Yarısını çalmak iki P arasında işi hızla dengeler.
3 Kuyruk ve özelliği
| Kavram | Anlamı |
|---|---|
Yerel kuyruk |
P başına, 256 yer |
Global kuyruk |
Paylaşılan, kilitli |
runnext |
Sıradaki ilk G |
Work stealing |
Başka P'den iş alma |