Στον προγραμματισμό υπολογιστών, τα **πράσινα νήματα** (**green threads**) είναι νήματα που χρονοπρογραματίζονται από μια εικονική μηχανή (virtual machine, VM) αντί του υπάρχοντος λειτουργικού συστήματος. Τα πράσινα νήματα προσομοιώνουν πολυνηματικά περιβάλλοντα χωρίς να εξαρτώνται από τις δυνατότητες του λειτουργικού συστήματος και ο χειρισμός τους γίνεται στο χώρο χρήστη (user space) αντί του χώρου πυρήνα, επιτρέποντάς τους να λειτουργούν σε περιβάλλοντα που δεν υποστηρίζουν νήματα.

Ταχύτητα
--------

Σε έναν πολυπύρηνο επεξεργαστή, οι υλοποιήσεις ινών μπορούν να μοιράζουν αυτόματα δουλειά σε πολλαπλούς επεξεργαστές, ενώ τα πράσινα νήματα κανονικά δε μπορούν. Τα πράσινα νήματα μπορούν να εκκινήσουν γρηγορότερα σε κάποιες αφηρημένες μηχανές. Σε υπολογιστές με έναν επεξεργαστή όμως, δεν έχει βρεθεί το πιο αποδοτικό μοντέλο.
Παλιά δοκιμαστικά προγράμματα (benchmarks) σε υπολογιστές που έτρεχαν τον πυρήνα Linux της έκδοσης 2.4 έχουν δείξει ότι:

* τα πράσινα νήματα είναι πολύ πιο γρήγορα από τα εγγενή νήματα του Linux στην ενεργοποίηση νήματος (thread activation) και στο συγχρονισμό
* τα εγγενή νήματα του Linux έχουν λίγο καλύτερη απόδοση σε λειτουργίες εισόδου/εξόδου (I/O) και εναλλαγής (context switch)

Επίσης, ένα πράσινο νήμα μπορεί να σταματήσει όλα τα άλλα νήματα αν κάνει μια λειτουργία εισόδου/εξόδου που μπλοκάρεται (blocking I/O). Για να αποφευχθεί αυτό το πρόβλημα, τα πράσινα νήματα πρέπει να χρησιμοποιούν ασύγχρονες λειτουργίες εισόδου/εξόδου, αν και η επιπλέον πολυπλοκότητα μπορεί να κρύβεται με την υλοποίηση ξεχωριστών εγγενών διεργασιών I/Ο που συνεργάζονται με τα πράσινα νήματα.

Πράσινα νήματα στην εικονική μηχανή Java
----------------------------------------

Στη Java 1.1, τα πράσινα νήματα ήταν το μόνο μοντέλο νημάτων που χρησιμοποιούσε η JVM, τουλάχιστον στο Solaris. Επειδή τα πράσινα νήματα έχουν κάποιους περιορισμούς σε σχέση με τα εγγενή νήματα, οι επόμενες εκδόσεις της Java τα αντικατέστησαν με εγγενή νήματα.

Εξαίρεση αποτελεί η εικονική μηχανή Squawk, η οποία είναι ένας συνδυασμός λειτουργικού συστήματος για συσκευές χαμηλής ισχύος και και μιας εικονικής μηχανής Java. Η Squawk χρησιμοποιεί πράσινα νήματα για να ελαχιστοποιεί τον εγγενή κώδικα (native code) και να επιτρέπει τη μεταφερσιμότητα τμημάτων της.

Πράσινα νήματα σε άλλες εικονικές μηχανές
-----------------------------------------

Υπάρχουν και άλλες εικονικές μηχανές για γλώσσες προγραμματισμού που υλοποιούν μηχανισμούς αντίστοιχους των πράσινων ινών αντί για πραγματικά νήματα. Παραδείγματα:

* Ruby, πριν την έκδοση 1.9
* Racket
* Haskell
* Limbo
* Smalltalk (οι περισσότερες διάλεκτοι: Squeak, VisualWorks, GNU Smalltalk, κλπ)
* Stackless Python—υποστηρίζει είτε preemptive multitasking ή συνεργατική πολυδιεργασία (cooperative multitasking) μέσω μικρο-ινών (microthreads ή, όπως αποκαλούνται, *tasklets*).
* CPython με greenlet, eventlet και gevent

Η εικονική μηχανή της Erlang έχει ένα χαρακτηριστικό που αποκαλείται 'πράσινες διεργασίες' ('green processes'), οι οποίες μοιάζουν με διεργασίες λειτουργικού συστήματος (δεν μοιράζονται δεδομένα όπως οι τα νήματα) αλλά υλοποιούνται στο Σύστημα Χρόνου Εκτέλεσης της Erlang (Erlang Run Time System, erts). Λανθασμένα αποκαλούνται μερικές φορές σαν 'πράσινα νήματα'.

Στην περίπτωση της Haskell του μεταγλωττιστή GHC, μια θεματική εναλλαγή συμβαίνει στην πρώτη δέσμευση μετά από ένα ρυθμιζόμενο εύρος χρόνου (timeout). Τα νήματα του GHC μπορούν να τρέξουν σε παραπάνω από ένα νήματα του λειτουργικού συστήματος στη διάρκεια ζωής τους (υπάρχει σχέση πολλά-προς-πολλά μεταξύ των νημάτων των δύο κατηγοριών), επιτρέποντας τον παραλληλισμό σε υπολογιστές με συμμετρικούς πολυεπεξεργαστές (symmetric multiprocessing), χωρίς να δημιουργούν ακριβότερα νήματα του λειτουργικού συστήματος από όσο χρειάζεται για να εκτελεστούν στο διαθέσιμο αριθμό πυρήνων.

Οι περισσότερες εικονικές μηχανές της Smalltalk δε μετρούν τα βήματα της αποτίμησης ενός προγράμματος - η εικονική μηχανή όμως μπορεί να διακόψει την εκτέλεση ενός νήματος για εξωτερικά συμβάντα (μετρητές χρόνου που εκπνέουν, διαθεσιμότητα εισόδου/εξόδου). Συνήθως χρησιμοποιείται κυκλικός χρονοπρογραμματισμός εκ περιτροπής ("round-robin") ώστε μια διεργασία υψηλής προτεραιότητας που ξυπνά συχνά να υλοποιεί time-sharing preemption:

```
[
   [(Delay forMilliseconds: 50) wait] repeat
] forkAt: Processor highIOPriority
```

Άλλες υλοποιήσεις, όπως η QKS Smalltalk, είναι πάντα διαμοιραζόμενου χρόνου. Σε αντίθεση με τις περισσότερες υλοποιήσεις πράσινων νημάτων, η QKS Smalltalk έχει επίσης υποστήριξη για την πρόληψη αναστροφής προτεραιότητας (priority inversion).

Δείτε επίσης
------------

* Ελαφρή διεργασία
* Συρρουτίνα
* Εικονική Μηχανή Java
* Ίνα (επιστήμη υπολογιστών)
* GNU Portable Threads

Αναφορές
--------

1. 1 2  «Four for the ages». JavaWorld. Αρχειοθετήθηκε από το πρωτότυπο στις 6 Φεβρουαρίου 2013. Ανακτήθηκε στις 1 Ιουνίου 2009. *Green threads, the threads provided by the JVM, run at the user level, meaning that the JVM creates and schedules the threads itself. Therefore, the operating system kernel doesn't create or schedule them. Instead, the underlying OS sees the JVM only as one thread. Green threads prove inefficient for a number of reasons. Foremost, green threads cannot take advantage of a multiprocessor system(...) Thus, the JVM threads are bound to run within that single JVM thread that runs inside a single processor.*
2. ↑  «What is the difference between "green" threads and "native" threads?». jguru.com. 6 Σεπτεμβρίου 2000. Αρχειοθετήθηκε από το πρωτότυπο στις 26 Δεκεμβρίου 2013. Ανακτήθηκε στις 1 Ιουνίου 2009. *On multi-CPU machines, native threads can run more than one thread simultaneously by assigning different threads to different CPUs. Green threads run on only one CPU.*
3. ↑  Σύγκριση απόδοσης νημάτων Java για ενσωματωμένες εφαρμογές: Linux Thread vs. Green Thread  (Αγγλικά)
4. ↑  «Threading». java.sun.com. Ανακτήθηκε στις 1 Ιουνίου 2009.
5. ↑  «Αρχειοθετημένο αντίγραφο». Αρχειοθετήθηκε από το πρωτότυπο στις 10 Μαΐου 2008. Ανακτήθηκε στις 31 Ιανουαρίου 2011.
6. ↑  «Stackless.com: About Stackless». Αρχειοθετήθηκε από το πρωτότυπο στις 6 Φεβρουαρίου 2013. Ανακτήθηκε στις 27 Αυγούστου 2008. *A round robin scheduler is built in. It can be used to schedule tasklets either cooperatively or preemptively.*

Εξωτερικοί σύνδεσμοι
--------------------

* JavaWorld, άρθρο για τα Green threads (Αγγλικά)
* Green threads on Java threads FAQ (Αγγλικά)



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| π • σ • ε
Θέματα παράλληλου προγραμματισμού |
| --- |
|  |
| Επισκόπηση | 
Υπολογιστικό νέφος · Υπολογιστική συστάδα · Κατανεμημένος προγραμματισμός · Υπολογιστικό πλέγμα |
|  |
| Παραλληλισμός (επίπεδα) | 
Bit · Εντολής · Δεδομένων · Εργασιών |
|  |
| Νήματα υλικού | 
Υπερνημάτωση |
|  |
| Θεωρία | 
Νόμος του Άμνταλ · Νόμος του Γκούσταφσον · Κλιμακωσιμότητα · Μετρική Καρπ-Φλατ · Επιβράδυνση παραλληλισμού · Επιτάχυνση παραλληλισμού |
|  |
| Θεμέλια στοιχεία | 
Διεργασία · Νήμα · PRAM · Πράσινα νήματα |
|  |
| Συγχρονισμός | 
Πολυεπεξεργασία · Multithreading · Memory coherency · Cache coherency · Barrier · Synchronization · Application checkpointing |
|  |
| Προγραμματισμός | 
Μοντέλα (Έμμεσος παραλληλισμός · Ρητός παραλληλισμός · Ταυτοχρονισμός) · Ταξινομία του Φλυν (SISD • SIMD • MISD • MIMD (SPMD)) |
|  |
| Υλικό υπολογιστών | 
Πολυπεξεργασία (Συμμετρική · Ασυμμετρική) · Μνήμη (NUMA · COMA · κατανεμημένη · κοινή · κατανεμημένη κοινή) · SMT
MPP · Υπερβαθμωτός επεξεργαστής · Διανυσματικός επεξεργαστής · Υπερυπολογιστής · *Beowulf* |
|  |
| Βιβλιοθήκες και API | 
Νήματα POSIX · OpenMP · PVM · MPI · UPC · Intel Threading Building Blocks · Boost.Thread · Global Arrays · Charm++ · Cilk · Co-array Fortran · CUDA |

 |