CodeBlanks Logo Icon CodeBlanks

Syscall ve scheduler

Syscall sırasında M'nin nasıl yönetildiğini öğrenirsin.

Syscall ve handoff

Bloklayan bir sistem çağrısı (ör. dosya okuma) M'yi çekirdekte bekletir. Go bu sırada P'yi boşa harcamaz: syscall uzarsa sysmon P'yi o M'den alır ve başka (gerekirse yeni) bir M'ye verir. Buna handoff denir. Syscall bitince eski M bir P bulmaya çalışır; bulamazsa G'yi global kuyruğa koyup uyur.

G1 read() → M1 bloklandı
P0, M2'ye geçer → G2, G3 çalışmaya devam eder

Çok sayıda M

Çok fazla eşzamanlı bloklayan syscall veya cgo çağrısı M sayısını artırır. Varsayılan sınır 10.000'dir; aşılırsa program çöker. runtime.LockOSThread() bir goroutine'i kendi M'sine kilitler; bazı C kütüphaneleri ve grafik API'leri iş parçacığına bağlı durum tuttuğu için gerekir.

Uygulama İş parçacığı kilidi

Bir goroutine içinde runtime.LockOSThread() ve defer runtime.UnlockOSThread() çağır, ardından kanal üzerinden "kilitli" gönder. main kanaldan okuyup yazdırsın.

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() {
    ch := make(chan string)
    go func() {
        runtime.LockOSThread()
        defer runtime.UnlockOSThread()
        ch <- "kilitli"
    }()
    fmt.Println(<-ch)
}

Beklenen çıktı

kilitli

Soru ve cevaplar

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

1 Ağ G/Ç'si neden M bloklamaz?

  • GC tarafından yönetilir
  • Go ağ işlemlerini epoll/kqueue ile poller'da bekletir Doğru cevap
  • Ağ işlemleri her zaman anlıktır
  • Ayrı süreçte yapılır

Açıklama: Soketler bloklamayan modda açılır; veri yoksa G waiting olur ve netpoller hazır olunca onu yeniden runnable yapar.

2 İş parçacığına kilitle

Soru
runtime.____()
defer runtime.UnlockOSThread()
Cevap
runtime.LockOSThread()
defer runtime.UnlockOSThread()

Açıklama: LockOSThread mevcut goroutine'in yalnızca bu OS iş parçacığında çalışmasını sağlar.

3 Bekleme türü

Kavram Anlamı
Dosya read() M bloklanır, P devredilir
Soket okuma Netpoller bekletir
cgo çağrısı M'yi meşgul eder
LockOSThread G'yi M'ye bağlar

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