0Pricing
Ruby Academy · Ders

GVL Açıklaması

İş parçacıkları neden sınırlıdır

GVL Açıklaması, CoddyKit'te ücretsiz bir Ruby Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Ruby Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Ruby Academy kursu toplamda 4 dersten oluşur.

GVL Nedir?

GVL (Küresel VM Kilidi, tarihsel olarak GIL), standart Ruby yorumlayıcısı olan CRuby'nin içindeki bir kilittir.

  • Aynı anda Ruby kodunu yalnızca bir iş parçacığının yürütmesine izin verir.
  • Yorumlayıcının iç yapılarını eşzamanlı bozulmaya karşı korur.
  • Salt Ruby ile yapılan CPU işlerinin birden çok çekirdekte gerçekten paralel çalışmaması anlamına gelir.

GVL'yi anlamak, iş parçacıklarının ne zaman yardımcı olduğunu ve ne zaman olmadığını açıklar.

Neden Vardır

CRuby'nin iç yapılarının (nesne ayırma, çöp toplama ve C uzantıları) tümü iş parçacığı güvenli olacak şekilde yazılmamıştır. GVL, Ruby yürütmesini sıralı hâle getirerek bunları güvenli kılar.

GVL'yi temiz bir şekilde kaldırmak zordur; bu nedenle CRuby onu korur. JRuby ve TruffleRuby'de GVL yoktur ve iş parçacıklarını birçok çekirdekte çalıştırabilirler.

CPU Ağırlıklı İşler

CPU ağırlıklı görevlerde (matematik, sıralama, ayrıştırma) CRuby altında iş parçacıkları işleri hızlandırmaz. Herhangi bir anda Ruby kodunu yalnızca bir iş parçacığı çalıştırır; bu nedenle iki CPU iş parçacığı kabaca tek bir iş parçacığı artı ek yüküne eşittir.

def heavy
  sum = 0
  1_000_00.times { |i| sum += i }
  sum
end

puts heavy
puts "CPU work does not parallelize under the GVL"

G/Ç, GVL'yi Serbest Bıraktırır

Temel fikir şudur: engelleyici G/Ç, GVL'yi serbest bırakır. Bir iş parçacığı uyuduğunda, bir dosya okuduğunda veya bir yuva üzerinde beklediğinde kilidi bırakır; böylece başka bir iş parçacığı Ruby kodunu çalıştırabilir.

GVL olsa bile iş parçacıklarının G/Ç ağırlıklı işler için harika olmasının nedeni budur.

Beklemeleri Örtüştürme

Burada üç iş parçacığının her biri uyur. sleep GVL'yi serbest bıraktığı için beklemeler örtüşür. Toplam süre 0,6 sn değil, yaklaşık 0,2 sn'dir.

start = Time.now

threads = (1..3).map do
  Thread.new { sleep 0.2 }
end
threads.each(&:join)

elapsed = Time.now - start
puts "Elapsed roughly: " + elapsed.round(1).to_s

C Uzantıları GVL'yi Serbest Bırakabilir

İyi yazılmış C uzantıları, uzun yerel hesaplamalar sırasında rb_thread_call_without_gvl kullanarak GVL'yi serbest bırakabilir. Bu, Ruby iş parçacıkları çalışmaya devam ederken heavy yerel işlerin paralel yürütülmesini sağlar.

Böylece bazı kütüphaneler CRuby'de bile gerçek paralellik elde eder.

İş Parçacıkları Yine de Geçiş Yapar

CPU işleri için bile GVL, diğer iş parçacıklarını sonsuza kadar dondurmaz. CRuby, her birinin sırasını alabilmesi için bir iş parçacığının önceliğini düzenli aralıklarla keser. İş eşzamanlıdır (iç içe yürütülür), ancak paralel değildir (aynı anda yürütülmez).

results = []
mutex = Mutex.new

threads = (1..3).map do |n|
  Thread.new do
    mutex.synchronize { results << n }
  end
end
threads.each(&:join)

puts "Collected: " + results.sort.join(", ")

Eşzamanlılık ve Paralellik

İki önemli sözcük vardır:

  • Eşzamanlılık: Görevler, yürütmeyi iç içe geçirerek ilerler. GVL buna izin verir.
  • Paralellik: Görevler farklı çekirdeklerde tam olarak aynı anda çalışır. GVL, Ruby kodu için bunu engeller.

İş parçacıkları eşzamanlılık, Ractor'lar ise paralellik sağlar.

GVL'yi Aşma

CRuby'de CPU işleri için birden çok çekirdek kullanmak amacıyla şunları yapabilirsiniz:

  • Birden çok süreç çalıştırabilirsiniz (her birinin kendi GVL'si vardır).
  • Süreç içi paralellik için Ractor'ları kullanabilirsiniz.
  • GVL'yi serbest bırakan C uzantılarına işi devredebilirsiniz.

G/Ç işleri için düz iş parçacıkları genellikle yeterlidir.

Süreçlerin Paylaşılan GVL'si Yoktur

Her OS süreci, kendi GVL'sine sahip kendi Ruby VM'sini çalıştırır. Çatallama gerçek paralellik oluşturur; ancak süreçler belleği paylaşmaz ve daha fazla kaynak kullanır.

puts "Main pid: " + Process.pid.to_s
puts "Each forked process has its own independent GVL"

Strateji Seçme

Karar rehberi:

  • Çok fazla bekleme mi var? İş parçacıklarını kullanın.
  • Yoğun CPU işi ve çekirdekleri kullanma gereksinimi mi var? Süreçleri veya Ractor'ları kullanın.
  • Paylaşılan duruma mı ihtiyacınız var? Bir Mutex ile iş parçacıkları kullanın; ancak GVL'nin sınırlarını göz önünde bulundurun.

GVL'yi bilmek, CPU iş parçacıklarının doğrusal olarak ölçeklenmesini bekleme şeklindeki klasik hatayı önler.

Hızlı Kontrol

GVL hakkındaki anlayışınızı ölçün.

Özet: GVL

Küresel VM Kilidi hakkında temel çıkarımlar:

  • CRuby'de aynı anda Ruby kodunu yalnızca bir iş parçacığı çalıştırır.
  • Yorumlayıcının iç yapılarını korur.
  • Engelleyici G/Ç, onu serbest bırakarak beklemelerin örtüşmesini sağlar.
  • CPU ağırlıklı Ruby işleri çekirdekler arasında paralelleşmez.
  • Gerçek paralellik için süreçleri veya Ractor'ları kullanın.

Sırada, hafif işbirlikçi eşzamanlılık için Fiber'ları inceleyeceğiz.

Sıkça Sorulan Sorular

“GVL Açıklaması” dersi ücretsiz mi?

Evet — “GVL Açıklaması” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Ruby Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Ruby Academy kursu toplamda 4 dersten oluşur.

“GVL Açıklaması” dersinde ne öğreneceğim?

İş parçacıkları neden sınırlıdır Ruby Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Ruby Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Ruby Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“GVL Açıklaması” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Ruby Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Ruby Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İş Parçacıkları
  2. GVL Açıklaması
  3. Fiber'lar
  4. Ractor'lar
← Ruby Academy Sayfasına Dön