Middle
Çalışma zamanı (runtime) nedir ve zamanlayıcı (scheduler) nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Go'da çalışma zamanı (runtime), Go programlarının çalıştırıldığı ortamdır. Şunları içerir:
- Bellek yönetimi: Çöp toplayıcı (garbage collector) otomatik olarak bellek tahsisini ve serbest bırakmayı yönetir.
- Planlayıcı (scheduler): Goroutine'ların işletim sistemi thread'leri üzerinde yürütülmesini sağlar.
- Sistem çağrıları: İşletim sistemi ile etkileşim için bir arayüz sağlar.
- Senkranizasyon primitive'leri: Kanallar, mutex'ler ve diğer mekanizmalar, goroutine'leri koordine etmek için kullanılır.
Go planlayıcısı, M:N modeli (birçok goroutine, birçok işletim sistemi thread'i üzerinde) uygular. Ana bileşenleri:
- G (Goroutine): Hafif yürütme akışı, temel olarak bir fonksiyonun soyutlamasıdır.
- M (Machine): Go programlarının çalıştığı işletim sistemi thread'i.
- P (Processor): İşletim sistemi thread'ine bağlı mantıksal bir işlemci. Yerel
runnablekuyruğu, goroutine'leri tutar.
Planlayıcının çalışma prensibi:
- Goroutine'ler (G) oluşturulur ve küresel veya yerel
runnablekuyruğuna eklenir. - İşletim sistemi thread'leri (M), mantıksal işlemciler (P) ile ilişkilendirilir. Varsayılan olarak P sayısı, CPU çekirdek sayısına eşittir (
GOMAXPROCS). - P, kendi yerel kuyruğundan bir goroutine alır. Eğer yerel kuyruk boşsa, P, diğer P'lerden veya küresel kuyruktan goroutine çalmaya (steal) çalışır.
- M, goroutine'yi yürütür.
- Bir goroutine engellendiğinde (örneğin, veri olmayan bir kanaldan okuma veya sistem çağrısı yaparken), M P'den ayrılır ve P, başka bir goroutine yürütmek üzere kullanılabilir hale gelir. Engellenen goroutine beklemeye alınır. Engelleme kaldırıldığında, goroutine tekrar
runnableolur ve kuyruğa geri konur. - Eğer M, sistem çağrısında engellenirse, P tutmaz. Yeni bir M oluşturulabilir veya mevcut bir M kullanılabilir, böylece P diğer goroutine'leri yürütmeye devam edebilir.
Bu yaklaşım, işlemci kaynaklarının verimli kullanılmasını sağlar ve paralel görevlerin kolayca ölçeklendirilmesine imkan tanır, işletim sistemi thread yönetiminin karmaşıklığını geliştiriciden gizler.
// Bir goroutine oluşturma örneği
func myFunc() {
// Goroutine kodu
}
func main() {
go myFunc() // Goroutine başlatılır
// Ana program paralel olarak devam eder
}