Co jsou zelené vlákna (green threads)?
sobes.tech AI
Odpověď od AI
Zelené vlákna jsou vlákna řízená na úrovni uživatelského prostoru, nikoli operačního systému. Přímo se nezobrazují na vláknech OS. Plánování a přepínání kontextu mezi zelenými vlákny provádí běhové prostředí jazyka nebo speciální knihovna.
Hlavní charakteristiky:
- Řízení: Plně prováděno běhovým prostředím.
- Zdroje: Vyžadují méně systémových zdrojů (paměti a CPU času) ve srovnání s nativními vlákny OS pro tvorbu a přepínání.
- Plánování: Kooperativní (nepředvídatelné multitasking). Vlákno musí výslovně předat řízení, aby mohlo být vykonáváno jiné zelené vlákno.
- Paralelismus: Kvůli nepředvídatelnému plánování a řízení v uživatelském prostoru zelená vlákna explicitně nepodporují paralelní vykonávání na vícejádrových procesorech bez dalších mechanismů (například použití více procesů, každý se svými zelenými vlákny).
V Ruby, zejména ve starších verzích (před 1.9) a s MRI (Matz's Ruby Interpreter), se používala zelená vlákna. To vedlo k problémům s výkonem na vícejádrových systémech, protože pouze jedno zelené vlákno mohlo být vykonáváno v jakémkoli okamžiku, blokované Global Interpreter Lock (GIL). V novějších verzích MRI a alternativních implementacích (JRuby, Rubinius) jsou používána nativní vlákna OS.
# Příklad použití vláken v Ruby (v závislosti na verzi a implementaci, mohou to být zelená nebo nativní)
t1 = Thread.new do
puts "Vlákno 1 začalo"
sleep(1)
puts "Vlákno 1 dokončeno"
end
t2 = Thread.new do
puts "Vlákno 2 začalo"
sleep(1)
puts "Vlákno 2 dokončeno"
end
t1.join # Čeká na dokončení vlákna t1
t2.join # Čeká na dokončení vlákna t2
puts "Všechna vlákna dokončena"
Porovnání zelených a nativních vláken:
| Charakteristika | Zelená vlákna | Nativní vlákna OS |
|---|---|---|
| Řízení | Uživatelský prostor | Jádro OS |
| Vytváření/Přepínání | Levnější | Drahé |
| Plánování | Kooperativní (nepředvídatelné) | Předvídatelné |
| Paralelismus | Omezen (jeden CPU) bez mechanismů | Plný (více CPU) |
| Blokující volání | Blokují celý interpretér/proces | Blokují pouze aktuální nativní vlákno |
V kontextu moderního Ruby (od 1.9 a výše MRI) jsou standardní vlákna Thread nativními vlákny OS. Zelená vlákna, jako hlavní model paralelismu, jsou nyní vzácná v MRI, ale mohou se vyskytovat v specifických knihovnách nebo alternativních běhových prostředích.