Sobes.tech
Middle+

Kas ir zaļie pavedieni (green threads)?

sobes.tech AI

Atbilde no AI

Zaļās pavedieni ir pavedieni, kurus pārvalda lietotāja telpa, nevis operētājsistēma. Tie netieši nav redzami OS pavedienos. Plānošana un konteksta pārslēgšana starp zaļajiem pavedieniem tiek veikta valodas run-laikā vai īpašā bibliotēkā.

Galvenās īpašības:

  • Vadība: pilnībā tiek veikta run-laikā.
  • Resursi: prasa mazāk sistēmas resursu (atmiņu un CPU laiku) salīdzinājumā ar nativajiem OS pavedieniem to izveidei un pārslēgšanai.
  • Plānošana: kooperatīva (cooperative multitasking). Pavedienam jānodod vadība acīmredzami, lai cits zaļais pavediens varētu tikt izpildīts.
  • Paralēlisma: Ņemot vērā neparedzamo plānošanu un vadību lietotāja telpā, zaļie pavedieni tieši nepārstāv paralēlu izpildi daudzkodolu procesoros bez papildu mehānismiem (piemēram, izmantojot vairākus procesus, katru ar saviem zaļajiem pavedieniem).

Ruby, īpaši vecākās versijās (pirms 1.9) un ar MRI (Matz's Ruby Interpreter), tika izmantoti zaļie pavedieni. Tas noveda pie veiktspējas problēmām daudzkodolu sistēmās, jo tikai viens zaļais pavediens varēja tikt izpildīts jebkurā laikā, bloķēts ar Global Interpreter Lock (GIL). Jaunākās MRI versijās un alternatīvajās realizācijās (JRuby, Rubinius) tiek izmantoti nativie OS pavedieni.

# Piemērs, kā izmantot pavedienus Ruby (atkarībā no versijas un realizācijas, tie var būt zaļie vai nativie)
t1 = Thread.new do
  puts "Pavediens 1 sākās"
  sleep(1)
  puts "Pavediens 1 beidzās"
end

t2 = Thread.new do
  puts "Pavediens 2 sākās"
  sleep(1)
  puts "Pavediens 2 beidzās"
end

t1.join # Gaida, kamēr tiks pabeigts t1

t2.join # Gaida, kamēr tiks pabeigts t2

puts "Visi pavedieni pabeigti"

Zaļo un nativu pavedienu salīdzinājums:

Raksturlielums Zaļie pavedieni Nativie OS pavedieni
Vadība Lietotāja telpa OS kodols
Izveide/Pāreja Lētāk Dārgāk
Plānošana Kooperatīva (sadarbība) Prognozējama
Paralēlisma Ierobežots (viens CPU) bez mehānismiem Pilnīgs (vairāk CPU)
Blokējoši izsaukumi Bloķē visu interpretatoru/procesu Bloķē tikai pašreizējo nativu pavedienu

Mūsdienu Ruby (no 1.9 un augstākās MRI) standarta pavedieni Thread ir nativie OS pavedieni. Zaļie pavedieni kā galvenais paralelizācijas modelis šobrīd ir reti MRI, bet var tikt izmantoti specifiskās bibliotēkās vai alternatīvos run-laikos.