CodeBlanks Logo Icon CodeBlanks

Concurrent GC

GC'nin uygulama ile eşzamanlı çalışmasını öğrenirsin.

Eşzamanlı GC

Go GC'si işaretlemeyi programla eşzamanlı yapar. Dünya yalnızca iki kısa an durur (STW): işaretlemeyi açarken ve bitirirken. Bu sürede yaklaşık %25 CPU GC'ye ayrılır; çok ayıran goroutine'ler de "mark assist" ile işaretlemeye yardım etmek zorunda kalır.

GODEBUG=gctrace=1 ./app
# gc 12 @3.1s 2%: 0.03+1.2+0.02 ms clock, ...
#                 STW   eşz.  STW

Yazma bariyeri

İşaretleme sırasında program bir işaretçi alanına yazarsa derleyicinin eklediği kısa kod çalışır ve hedef nesneyi griye boyar. Go hibrit bir bariyer kullanır (Yuasa + Dijkstra); bu sayede işaretleme sonunda goroutine yığınlarını yeniden taramak gerekmez ve ikinci STW çok kısa kalır.

Uygulama Duraklama süresi

runtime.GC() çağır, sonra runtime.ReadMemStats ile son duraklamayı oku: m.PauseNs[(m.NumGC+255)%256]. Duraklamanın 1 saniyeden kısa olduğunu (< 1e9) yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "runtime"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "runtime"
)

func main() {
    runtime.GC()
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    son := m.PauseNs[(m.NumGC+255)%256]
    fmt.Println(son < 1e9)
}

Beklenen çıktı

true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Yazma bariyeri ne zaman etkindir?

  • Her zaman
  • Yalnızca STW anında
  • Hiçbir zaman
  • Yalnızca işaretleme aşamasında Doğru cevap

Açıklama: Bariyer işaretleme sürerken işaretçi yazımlarını izler; GC çalışmıyorken kapalıdır ve maliyeti yoktur.

2 GC izi

Soru
GODEBUG=____=1 ./app
Cevap
GODEBUG=gctrace=1 ./app

Açıklama: gctrace=1 her GC döngüsü için süreleri ve heap boyutlarını stderr'e yazar.

3 GC aşaması

Kavram Anlamı
STW 1 İşaretlemeyi aç
Eşzamanlı işaretleme Program çalışırken
STW 2 İşaretlemeyi bitir
Süpürme Tembel, ayırırken

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