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

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Μετάβαση σε: πλοήγηση, αναζήτηση

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

Ταχύτητα[Επεξεργασία | επεξεργασία κώδικα]

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

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

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

Πράσινα νήματα στην εικονική μηχανή Java[Επεξεργασία | επεξεργασία κώδικα]

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

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

Πράσινα νήματα σε άλλες εικονικές μηχανές[Επεξεργασία | επεξεργασία κώδικα]

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

Η εικονική μηχανή της 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).

Δείτε επίσης[Επεξεργασία | επεξεργασία κώδικα]

Αναφορές[Επεξεργασία | επεξεργασία κώδικα]

  1. 1,0 1,1 «Four for the ages». JavaWorld. http://www.javaworld.com/javaworld/javaqa/2001-04/02-qa-0413-four.html. Ανακτήθηκε στις 2009-06-01. «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. 2000-09-06. http://www.jguru.com/faq/view.jsp?EID=143462. Ανακτήθηκε στις 2009-06-01. «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 [1] (Αγγλικά)
  4. «Threading». java.sun.com. http://java.sun.com/docs/hotspot/threads/threads.html. Ανακτήθηκε στις 2009-06-01. 
  5. http://spec.ruby-doc.org/wiki/Ruby_Threading
  6. «Stackless.com: About Stackless». http://zope.stackless.com/about/sdocument_view. Ανακτήθηκε στις 2008-08-27. «A round robin scheduler is built in. It can be used to schedule tasklets either cooperatively or preemptively.» 

Εξωτερικοί σύνδεσμοι[Επεξεργασία | επεξεργασία κώδικα]


Στο λήμμα αυτό έχει ενσωματωθεί κείμενο από το λήμμα Green threads της Αγγλικής Βικιπαίδειας, η οποία διανέμεται υπό την GNU FDL και την CC-BY-SA 3.0. (ιστορικό/συντάκτες).