Πράσινα νήματα

Στον προγραμματισμό υπολογιστών, τα **πράσινα νήματα** (**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&mdash;υποστηρίζει είτε 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

## Αναφορές


## Εξωτερικοί σύνδεσμοι
* JavaWorld, άρθρο για τα Green threads 
* Green threads on Java threads FAQ 

Κατηγορία:Νήματα
Κατηγορία:Java