Ruby Academy · leksjon

GVL forklart

Hvorfor tråder er begrenset

Leksjon 2 av 413 trinn

GVL forklart er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Ruby Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Ruby Academy inneholder totalt 4 leksjoner.

Hva er GVL?

GVL (Global VM Lock, historisk kalt GIL) er en lås inne i CRuby, den standardiserte Ruby-tolkeren.

  • Den tillater at bare én tråd kjører Ruby-kode om gangen.
  • Den beskytter tolkens interne deler mot samtidig korrupsjon.
  • Det betyr at CPU-arbeid i ren Ruby-kode ikke kjører virkelig parallelt på flere kjerner.

En forståelse av GVL forklarer når tråder er nyttige, og når de ikke er det.

Hvorfor finnes den?

De interne delene av CRuby (objektallokering, søppelrydding og C-utvidelser) ble ikke alle skrevet for å være trådsikre. GVL gjør dem sikre ved å serialisere Ruby-kjøringen.

Det er vanskelig å fjerne den på en ryddig måte, så CRuby beholder den. JRuby og TruffleRuby har ikke en GVL og kan kjøre tråder på mange kjerner.

CPU-bundet arbeid

For CPU-bundne oppgaver (matematikk, sortering og tolking) gir tråder ingen økt hastighet under CRuby. Bare én tråd kjører Ruby-kode til enhver tid, så to CPU-tråder tilsvarer omtrent én tråd pluss ekstra kostnader.

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 frigjør GVL

Det viktigste poenget er at blokkerende I/O frigjør GVL. Når en tråd sover, leser en fil eller venter på en socket, slipper den låsen slik at en annen tråd kan kjøre Ruby-kode.

Derfor er tråder godt egnet til I/O-bundet arbeid, selv med GVL.

Overlappende venting

Her sover tre tråder hver for seg. Fordi sleep frigjør GVL, overlapper ventetidene. Den totale tiden er omtrent 0,2 sekunder, ikke 0,6 sekunder.

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-utvidelser kan frigjøre den

Godt skrevne C-utvidelser kan frigjøre GVL under lange beregninger i innebygd kode ved hjelp av rb_thread_call_without_gvl. Da kan omfattende arbeid i innebygd kode kjøre parallelt mens Ruby-tråder fortsetter.

Noen biblioteker oppnår derfor ekte parallellitet selv på CRuby.

Tråder bytter fortsatt

Selv for CPU-arbeid fryser ikke GVL andre tråder for alltid. CRuby avbryter en tråd med jevne mellomrom, slik at alle får en tur. Arbeidet er samtidig (flettet), men ikke parallelt (samtidig utført).

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

Samtidig kjøring kontra parallellitet

To viktige begreper:

  • Samtidig kjøring: Oppgaver gjør fremgang ved å flettes sammen. Dette tillater GVL.
  • Parallellitet: Oppgaver kjører nøyaktig samtidig på forskjellige kjerner. GVL forhindrer dette for Ruby-kode.

Tråder gir samtidig kjøring, mens Ractors gir parallellitet.

Omgå GVL

For å bruke flere kjerner til CPU-arbeid i CRuby kan du:

  • Kjøre flere prosesser (hver prosess har sin egen GVL).
  • Bruke Ractors for parallellitet i prosessen.
  • Overlate arbeidet til C-utvidelser som frigjør GVL.

For I/O-arbeid er vanlige tråder som regel tilstrekkelig.

Prosesser har ingen delt GVL

Hver operativsystemprosess kjører sin egen Ruby-VM med sin egen GVL. Forgrening skaper ekte parallellitet, men prosesser deler ikke minne og bruker mer ressurser.

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

Velge en strategi

Veiledning for valg:

  • Mye venting? Bruk tråder.
  • Tungt CPU-arbeid og behov for flere kjerner? Bruk prosesser eller Ractors.
  • Behov for delt tilstand? Bruk tråder med en Mutex, men ta hensyn til GVLs begrensninger.

Med kunnskap om GVL unngår du den klassiske feilen å forvente at CPU-tråder skalerer lineært.

Kort kontroll

Test forståelsen din av GVL.

Oppsummering: GVL

Det viktigste om Global VM Lock:

  • Bare én tråd kjører Ruby-kode om gangen i CRuby.
  • Den beskytter tolkens interne deler.
  • Blokkerende I/O frigjør den, slik at venting kan overlappe.
  • CPU-bundet Ruby-arbeid blir ikke parallelt på tvers av kjerner.
  • Bruk prosesser eller Ractors for ekte parallellitet.

Deretter skal vi se på Fibers for lettvektsbasert samarbeidende samtidig kjøring.

Gratis å komme i gang

Lær deg Ruby med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
29
Leksjoner
109

Ofte stilte spørsmål

Er leksjonen «GVL forklart» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «GVL forklart», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Ruby Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «GVL forklart»?

Hvorfor tråder er begrenset Du øver på Ruby Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Ruby Academy?

Ingen tidligere erfaring er nødvendig. Ruby Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «GVL forklart»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Ruby Academy-leksjonen?

Ja. Alle Ruby Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Tråder
  2. GVL forklart
  3. Fibers
  4. Ractors
← Tilbake til Ruby Academy