Ana Sayfa

Go Runtime: Planlayıcının Derinlikleri ve Goroutine Yönetimi

1 dk okuma

Go runtime'ın önemli bir bileşeni olan planlayıcı (scheduler), programdaki yüzlerce, binlerce hatta milyonlarca goroutine'u sınırlı sayıdaki işletim sistemi (OS) iş parçacığına (thread) verimli bir şekilde dağıtarak CPU çekirdeklerinin sürekli meşgul kalmasını ve hiçbir goroutine'un kaynak sıkıntısı çekmemesini sağlar. Önceki makalede bellek yöneticisinin her P (işlemci) için kendi bellek önbelleğine sahip olduğundan bahsedilmişti, ancak planlayıcının asıl görevi, hangi goroutine'un hangi iş parçacığında çalışacağına karar vermektir. go ifadesi, kanal işlemleri ve time.Sleep gibi tüm eşzamanlı Go yapıları planlayıcı ile etkileşime girer.

Planlayıcı, GMP modeli adı verilen üç temel yapı etrafında inşa edilmiştir: G (goroutine), M (machine/OS thread) ve P (processor). G, Go runtime'ın eşzamanlı bir iş parçasını temsil eden goroutine'dur. Her go f() çağrıldığında, runtime bu fonksiyonun yürütülmesini takip etmek için bir G oluşturur veya yeniden kullanır. Bir G, küçük bir yığın (stack) (yalnızca 2KB'den başlayarak), kaydedilmiş bazı yazmaçlar (register) (yığın işaretçisi, program sayacı vb.), durum alanı (çalışıyor, bekliyor, çalışmaya hazır) ve onu çalıştıran M'ye bir işaretçi gibi önemli alanlar içerir.

Bir goroutine, tipik olarak 1-8MB'lık bir yığınla başlayan ve çok sayıda çekirdek durumu taşıyan bir OS iş parçacığına kıyasla oldukça hafiftir. Bu hafiflik sayesinde, tek bir Go programında milyonlarca goroutine bulunabilirken, birkaç bin OS iş parçacığı bile sistemde baskı yaratmaya başlayabilir. M ise, kodu gerçekten yürüten bir OS iş parçacığıdır. Planlayıcının görevi, goroutine'ları M'lere yerleştirerek onların çalışmasını sağlamaktır. Her M'nin, o anda çalışan kullanıcı goroutine'unu gösteren curg gibi önemli goroutine işaretçileri bulunur.

İçgörü

Go'nun yüksek eşzamanlılık ve performans yeteneklerinin temelini oluşturan goroutine'ların işletim sistemi iş parçacıkları üzerinde nasıl yönetildiğini ve dağıtıldığını detaylı bir şekilde açıklıyor.

Kaynak