Ruby Academy · Les

De GVL uitgelegd

Waarom threads beperkt zijn

Les 2 van 413 stappen

De GVL uitgelegd is een gratis Ruby Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Ruby Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Ruby Academy bevat in totaal 4 lessen.

Wat is de GVL?

De GVL (globale VM-vergrendeling, historisch de GIL) is een vergrendeling binnen CRuby, de standaard Ruby-interpreter.

  • Hierdoor kan er steeds maar één thread tegelijk Ruby-code uitvoeren.
  • De interne werking van de interpreter wordt beschermd tegen gelijktijdige beschadiging.
  • Dit betekent dat CPU-werk in pure Ruby niet echt parallel op meerdere kernen wordt uitgevoerd.

Als je de GVL begrijpt, weet je wanneer threads helpen en wanneer niet.

Waarom deze bestaat

De interne onderdelen van CRuby (objecttoewijzing, geheugenopruiming en C-extensies) zijn niet allemaal threadveilig geschreven. De GVL maakt ze veilig door Ruby-uitvoering te serialiseren.

Het is lastig om de GVL op een nette manier te verwijderen, daarom houdt CRuby deze. JRuby en TruffleRuby hebben geen GVL en kunnen threads op meerdere kernen uitvoeren.

CPU-gebonden werk

Voor CPU-gebonden taken (wiskunde, sorteren en parseren) versnellen threads niets onder CRuby. Er draait op elk moment maar één thread Ruby-code, dus twee CPU-threads komen ruwweg neer op één thread plus extra kosten.

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

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

I/O geeft de GVL vrij

De kern is: blokkerende I/O geeft de GVL vrij. Wanneer een thread slaapt, een bestand leest of op een socket wacht, laat deze de vergrendeling los zodat een andere thread Ruby kan uitvoeren.

Daarom zijn threads uitstekend voor I/O-gebonden werk, zelfs met de GVL.

Overlappende wachttijden

Hier slapen drie threads elk. Omdat sleep de GVL vrijgeeft, overlappen de wachttijden. De totale tijd is ongeveer 0,2 s, niet 0,6 s.

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-extensies kunnen deze vrijgeven

Goed geschreven C-extensies kunnen de GVL vrijgeven tijdens lange berekeningen in systeemeigen code met behulp van rb_thread_call_without_gvl. Hierdoor kan zwaar systeemeigen werk parallel worden uitgevoerd terwijl Ruby-threads doorgaan.

Sommige bibliotheken bereiken zo echte parallelle uitvoering, zelfs op CRuby.

Threads wisselen nog steeds

Zelfs bij CPU-werk bevriest de GVL andere threads niet voor altijd. CRuby onderbreekt een thread periodiek, zodat elke thread aan de beurt komt. Het werk is gelijktijdig (door elkaar heen uitgevoerd), maar niet parallel (op hetzelfde moment).

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(", ")

Gelijktijdigheid versus parallellisme

Twee belangrijke woorden:

  • Gelijktijdigheid: taken boeken voortgang door elkaar heen uit te voeren. De GVL maakt dit mogelijk.
  • Parallellisme: taken worden exact op hetzelfde moment op verschillende kernen uitgevoerd. De GVL verhindert dit voor Ruby-code.

Met threads krijg je gelijktijdigheid; met Ractors krijg je parallellisme.

De GVL omzeilen

Om in CRuby meerdere kernen te gebruiken voor CPU-werk kun je:

  • Meerdere processen uitvoeren (elk heeft een eigen GVL).
  • Ractors gebruiken voor parallellisme binnen één proces.
  • Werk uitbesteden aan C-extensies die de GVL vrijgeven.

Voor I/O-werk zijn gewone threads meestal voldoende.

Processen delen geen GVL

Elk besturingssysteemproces voert zijn eigen Ruby-VM uit met zijn eigen GVL. Forken zorgt voor echt parallellisme, maar processen delen geen geheugen en gebruiken meer hulpbronnen.

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

Een strategie kiezen

Keuzehulp:

  • Veel wachten? Gebruik threads.
  • Zware CPU-belasting en kernen benutten? Gebruik processen of Ractors.
  • Gedeelde toestand nodig? Gebruik threads met een Mutex, maar houd rekening met de beperkingen van de GVL.

Als je de GVL kent, voorkom je de klassieke fout om te verwachten dat CPU-threads lineair opschalen.

Kennischeck

Toets je begrip van de GVL.

Samenvatting: de GVL

Belangrijkste punten over de globale VM-vergrendeling:

  • In CRuby voert steeds maar één thread Ruby-code uit.
  • De interne werking van de interpreter wordt beschermd.
  • Blokkerende I/O geeft de vergrendeling vrij, waardoor overlappende wachttijden mogelijk zijn.
  • CPU-gebonden Ruby-werk wordt niet parallel uitgevoerd over meerdere kernen.
  • Gebruik processen of Ractors voor echt parallellisme.

Vervolgens kijken we naar Fibers voor lichte coöperatieve gelijktijdigheid.

Gratis beginnen

Leer Ruby met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
29
Lessen
109

Veelgestelde vragen

Is de les “De GVL uitgelegd” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Ruby Academy, waaronder “De GVL uitgelegd”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Ruby Academy bevat in totaal 4 lessen.

Wat leer ik in “De GVL uitgelegd”?

Waarom threads beperkt zijn Je oefent met Ruby Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Ruby Academy te beginnen?

Ervaring vooraf is niet nodig. Ruby Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “De GVL uitgelegd”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Ruby Academy?

Ja. Elke les over Ruby Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Threads
  2. De GVL uitgelegd
  3. Fibers
  4. Ractors
← Terug naar Ruby Academy