CodeBlanks Logo Icon CodeBlanks

Work stealing

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

main.go
package main

import (
    "fmt"
    "sync"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
calinan := len(kurban.kuyruk) / ____
Cevap
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

Uzman bölümündeki tüm dersler