Mis on rohelised niidid (green threads)?
sobes.tech AI
Vastus AI-lt
Rohelised niidid on kasutajaruumi tasandil juhitavad niidid, mitte operatsioonisüsteemi tasandil. Need ei ole otseselt nähtavad OS niitidena. Planeerimine ja konteksti vahetamine roheliste niidide vahel toimub programmeerimiskeele jooksuaegses keskkonnas või spetsiaalses teegis.
Peamised omadused:
- Juhtimine: täielikult toimub jooksuaegses keskkonnas.
- Ressursid: nõuavad vähem süsteemseid ressursse (mälu ja CPU aega) võrreldes natiivsete OS-niididega nende loomisel ja vahetamisel.
- Planeerimine: koostöö (cooperative multitasking). Niidil tuleb selgelt üle anda juhtimine, et teine roheline niit saaks täidetud.
- Paralleelsus: koostöö ja kasutajaruumi juhtimise tõttu ei toeta rohelised niidid otseselt paralleelset täitmist mitme tuumaga protsessoritel ilma täiendavate mehhanismideta (näiteks mitme protsessi kasutamine, igaühel oma rohelised niidid).
Ruby-s, eriti vanemates versioonides (enne 1.9) ja MRI (Matz's Ruby Interpreter) kasutati rohelisi niite. See põhjustas jõudlusprobleeme mitmetuumalistel süsteemidel, kuna ainult üks roheline niit võis korraga täidetud olla, blokeeritud Global Interpreter Lock (GIL)-iga. Uuemates MRI versioonides ja alternatiivsetes teostustes (JRuby, Rubinius) kasutatakse natiivseid OS-niite.
# Näide niitide kasutamisest Ruby-s (sõltuvalt versioonist ja teostusest võivad need olla rohelised või natiivsed)
t1 = Thread.new do
puts "Niit 1 algas"
sleep(1)
puts "Niit 1 lõppes"
end
t2 = Thread.new do
puts "Niit 2 algas"
sleep(1)
puts "Niit 2 lõppes"
end
t1.join # Ootab t1 lõpetamist
t2.join # Ootab t2 lõpetamist
puts "Kõik niidid on lõpetatud"
Roheliste ja natiivsete niitide võrdlus:
| Omadus | Rohelised niidid | Natiivsed OS-niidid |
|---|---|---|
| Juhtimine | Kasutajaruumi tasandil | OS kerneli tasandil |
| Loomine/Ülekanne | Odavam | Kallim |
| Planeerimine | Kooperatiivne (sõbralik) | Ennustatav |
| Paralleelsus | Piiratud (üks CPU) ilma mehhanismideta | Täielik (mitu CPU) |
| Blokeerivad kutsed | Blokeerib kogu tõlgendaja/protsessi | Blokeerib ainult praeguse natiivse niidi |
Kaasaegses Ruby-s (alates 1.9 ja kõrgem MRI) on standardsed Thread niidid natiivsed OS-niidid. Rohelised niidid, kui peamine paralleelismi mudel, on nüüd MRI-s haruldased, kuid võivad esineda spetsiifilistes teekides või alternatiivsetes run-ajalistes keskkondades.