Syscall ve scheduler
- Go kursu
- Uzman
- Ders 5/34
- 4 dk
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
package main
import (
"fmt"
"runtime"
)
func main() {
// buraya yaz
}Örnek çözüm
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
runtime.____()
defer runtime.UnlockOSThread()
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 |