Sobes.tech
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 runnable kuyruğu, goroutine'leri tutar.

Planlayıcının çalışma prensibi:

  1. Goroutine'ler (G) oluşturulur ve küresel veya yerel runnable kuyruğuna eklenir.
  2. İş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).
  3. 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.
  4. M, goroutine'yi yürütür.
  5. 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 runnable olur ve kuyruğa geri konur.
  6. 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
}