Προγραμματισμός Νημάτων POSIX

Η εισαγωγή αυτή είναι βασισμένη στο tutorial "POSIX Threads Programming" του Blaise Barney, Lawrence Livermore Laboratory, USA. Μετάφραση και προσαρμογή: Κ.Γ. Μαργαρίτης και Ι. Παπίκας, Εργαστήριο Παράλληλης Κατανεμημένης Επεξεργασίας, Τμήμα Εφαρμοσμένης Πληροφορικής, Πανεπιστήμιο Μακεδονίας.



Περιεχόμενα

  1. Περίληψη
  2. Επισκόπηση των Pthreads
    1. Τι είναι ένα Νήμα;
    2. Τι είναι τα Pthreads;
    3. Γιατί Pthreads;
    4. Σχεδιασμός προγραμμάτων με Νήματα
  3. Το API των Pthreads
  4. Μεταγλώττιση προγραμμάτων με Νήματα
  5. Διαχείριση Νημάτων
    1. Δημιουργία και Τερματισμός Νημάτων
    2. Πέρασμα παραμέτρων στα Νήματα
    3. Ένωση και Απόσπαση Νημάτων
    4. Διαχείριση Στοίβας
    5. Διάφορες Ρουτίνες
  6. Μεταβλητές Αμοιβαίου Αποκλεισμού - Mutex
    1. Επισκόπηση Μεταβλητών Mutex
    2. Δημιουργία και Τερματισμός Mutex
    3. Κλείδωμα και Ξεκλείδωμα Mutex
  7. Μεταβλητές Συνθηκών
    1. Επισκόπηση Μεταβλητών Συνθηκών
    2. Δημιουργία και Τερματισμός Μεταβλητών Συνθηκών
    3. Αναμονή και Σηματοδότηση στις Μεταβλητές Συνθηκών
  8. Συνδυασμός MPI με Pthreads
  9. Θέματα που δεν συζητήθηκαν
  10. Βιβλιοθήκη Αναφορών Ρουτινών Pthread
  11. Αναφορές και Περισσότερες Πληροφορίες
  12. Ασκήσεις


Περίληψη


Σε πολυπεξεργαστές με διαμοιραζόμενη μνήμη, όπως τα SMPs και τα muti-core συστήματα, ο παράλληλλισμός μπορεί να υλοποιηθεί με τα νήματα. Ιστορικά, οι κατασκευαστές πολυεπεξεργαστών ανέπτυξαν τις δικές τους εκδόσεις νημάτων, προκαλώντας σημαντικά προβλήματα φορητότητας. Το πρότυπο IEEE POSIX 1003.1c αποτελεί μια πρότυπη διεπαφή προγραμματιστή εφαρμογών για τη διαχείριση νημάτων στην γλώσσα C για συστήματα UNIX (υποστηρίζεται και από τις πρόσφατες εκδόσεις των MS-Windows).  Οι υλοποιήσεις που οφείλονται σε αυτό τον πρότυπο έχουν το όνομα POSIX Threads ή αλλιώς Pthreads.

Ο οδηγός αυτός ξεκινά με μια εισαγωγή στις έννοιες, τα κίνητρα, και τo σκεπτικ;o του σχεδιασμού προγραμμάτων με Pthreads. Καθεμία από τις 3 μεγάλες κλάσεις ρουτινών στο API των Pthreads καλύπτεται: Διαχείριση Νημάτων, Μεταβλητές Mutex, και Μεταβλητές Συνθηκών. Παραδείγματα με κώδικα εμφανίζονται σε όλο τον οδηγό για να δείξουν την χρήση των περισσότερων ρουτινών των Pthreads που χρειάζεται ένας προγραμματιστής. Ο οδηγός καταλήγει σε μια συζήτηση για το πως να συνδυαστεί το MPI με τα Pthreads. Επίσης περιλαμβάνονται αρκετά παραδείγματα σε γλώσσα C.


Επισκόπηση των Pthreads

Τι είναι ένα Νήμα;



Επισκόπηση Pthreads

Τι είναι τα Pthreads;



Επισκόπηση Pthreads

Γιατί Pthreads;



Επισκόπηση Pthreads

Σχεδιασμός Προγραμμάτων με Νήματα

Παράλληλος Προγραμματισμός:

Μοντέλο Διαμοιραζόμενης Μνήμης:

Ασφάλεια Νημάτων:

threadunsafe


Το API των Pthreads
Μεταγλώττιση προγραμμάτων με Νήματα



Διαχείριση Νημάτων

Δημιουργία και Τερματισμός Νημάτων

Ρουτίνες:

Δημιουργία Νημάτων:


Ερώτηση: Αφού δημιουργηθεί το νήμα, πώς μπορούμε να ξέρουμε πότε θα προγραμματιστεί να τρέξει από το λειτουργικό σύστημα;

Ιδιότητες Νημάτων:

Τερματισμός Νημάτων:


Παράδειγμα: Δημιουργία και Τερματισμός Pthread



Διαχείριση Νημάτων

Πέρασμα παραμέτρων στα Νήματα


Ερώτηση: πως μπορούμε να περάσουμε με ασφαλή τρόπο δεδομένα σε νέα νήματα, δεδομένης της περιγραφής τους, την εκκίνησή τους και τον χρονοπρογραμματισμό;



Διαχείριση Νημάτων

Ένωση και Απόσπαση Νημάτων

Ρουτίνες:

Ένωση:

Ένωση ή Όχι;

Απόσπαση:

Προτάσεις:


Παράδειγμα: Ένωση Pthread



Διαχείριση Νημάτων

Διαχείριση Στοίβας

Ρουτίνες:

Αποτροπή προβλημάτων με τις Στοίβες:

Μερικά πρακτικά παραδείγματα συστημάτων:


Παράδειγμα: Διαχείριση Στοίβας



Διαχείριση Νημάτων

Διάφορες Ρουτίνες



Μεταβλητές Αμοιβαίου Αποκλεισμού - Mutex

Επισκόπιση



Μεταβλητές Αμοιβαίου Αποκλεισμού - Mutex

Δημιουργία και Καταστροφή Mutex

Ρουτίνες:

Χρήση:



Μεταβλητές Αμοιβαίου Αποκλεισμού - Mutex

Κλείδωμα και Ξεκλείδωμα Mutex

Ρουτίνες:

Χρήση:


Ερώτηση: Όταν περισσότερα από ένα νήματα περιμένουν για μια κλειδωμένη μεταβλητή mutex, ποιό νήμα θα την πάρει αφού ελευθερωθεί;


Παράδειγμα: Χρήση Mutex



Μεταβλητές Συνθηκών

Επισκόπηση



Μεταβλητές Συνθηκών

Δημιουργία και Καταστροφη Μεταβλητών Σηνθηκών

Ρουτίνες:

Χρηση:



Μεταβλητές Συνθηκών

Αναμονή και Σηματοδότηση στις Μεταβλητές Συνθηκών

Ρουτίνες:

Χρήση:

Κατάλληλα κλειδώματα και ξεκλειδώματα των mutex είναι σημαντικά κατά την χρήση αυτών των ρουτινών. Για παράδειγμα:
  • Αποτυχία κλειδώματος της mutex πριν την κλήση της pthread_cond_wait() μπορεί να προκαλέσει αποτυχία μπλοκαρίσματος.

  • Αποτυχία ξεκλειδώματος της mutex μετά την κλήση της pthread_cond_signal() μπορεί να μην επιτρέψει την ολοκλήρωση της pthread_cond_wait() (αν παραμείνει μπλοκαρισμένη).

Παράδειγμα: Χρήση Μεταβλητών Συνθηκών



Συνδυασμός MPI με Pthreads


Θέματα Που Δεν Καλύφθηκαν


Πολλά χαρακτηριστικά του API των Pthreads δεν συζητήθηκαν σε αυτόν τον οδηγό. Αυτά παρουσιάζονται παρακάτω. Βλέπε το τμήμα Βιβλιοθήκης Αναφορών Ρουτινών Pthread για περισσότερες πληροφορίες.



Βιβλιοθήκη Αναφορών Ρουτινών Pthread




Αναφορές και Περισσότερες Πληροφορίες