Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «ιεργασίες και Νήµατα» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 1
ιεργασίες Μια διεργασία περιλαµβάνει Ένα πεδίο διευθύνσεων, που αποτελείται από τα τµήµατα: κώδικα, δεδοµένων, σωρού και στοίβας Πληροφορίες που διατηρεί το λειτουργικό σύστηµα εσωτερικά (κατάσταση διεργασίας, προτεραιότητα, δεσµευµένοι πόροι, στατιστικά). Σαν κατάσταση διεργασίας αναφέρουµε κάθε στιγµιότυπο κατά το οποίο τα παραπάνω δεδοµένα έχουν συγκεκριµένες τιµές. Η κατάσταση µνήµης αντιστοιχεί στην κατάσταση του χώρου διευθύνσεων Η κατάσταση επεξεργαστή αντιστοιχεί στις τιµές των καταχωρητών Heap Data Code Registers E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 2
Εναλλαγή ιεργασιών Γιανα εκτελεστεί µια διεργασία σε έναν επεξεργαστή πρέπει να φορτωθεί σε αυτόν η κατάσταση επεξεργαστή της διεργασίας Κατά την εκτέλεση της διεργασίας η κατάσταση επεξεργαστή µεταβάλλεται Για να σταµατήσει η εκτέλεση µιας διεργασίας και να ξεκινήσει µια άλλη (context switching): Αποθηκεύεται η κατάσταση επεξεργαστή της τρέχουσας διεργασίας Φορτώνεται η κατάσταση επεξεργαστή της προς εκτέλεση διεργασίας E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 3
Μνήµη ιεργασίας Κάθεδιεργασία διαθέτει το δικό της (ιδιωτικό) χώρο µνήµης στον οποίο έχει πρόσβαση µόνο αυτή Το λειτουργικό σύστηµα έχει πρόσβαση στη µνήµη όλων των διεργασιών Η αποµόνωση των διεργασιών Εξασφαλίζει ότι µια διεργασία δεν θα έχει πρόσβαση στη µνήµη µιας άλλης διεργασίας Παρέχει στοιχειώδη ασφάλεια σε ένα σύστηµα που εξυπηρετεί πολλούς χρήστες ταυτόχρονα E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 4
ιαµοίρασημνήµης Παράτην αποµόνωση µεταξύ των διεργασιών, σε πολλές περιπτώσεις υπάρχει ανάγκη για επικοινωνία µεταξύ τους Απώτερος σκοπός είναι η συνεργασία και ο συντονισµός των διεργασιών για την επίλυση κάποιου προβλήµατος Το λειτουργικό σύστηµα υλοποιεί διάφορους µηχανισµούς διαδιεργασιακήςεπικοινωνίας: σύνολο τεχνικών για την ανταλλαγή δεδοµένων µεταξύ δύο ή περισσότερων διεργασιών: σήµατα, αρχεία, σωληνώσεις ανταλλαγή µηνυµάτων, κοινή µνήµη, σηµαφόροι Tα νήµατα εκµεταλλεύονται την ιδέα της κοινής µνήµης για να διευκολύνουν τον προγραµµατισµό E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 5
ΟργάνωσηΜνήµης Προγράµµατος Παράµετροιγραµµής εντολών & µεταβλητές περιβάλλοντος Στοίβα Σωρός Μη αρχικοποιηµένα εδοµένα Αρχικοποιηµένα εδοµένα Κώδικας E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 6
ιευθέτησημνήµης (Πρόγραµµα C) Τµήµα κώδικα (text segment) Οι εντολές που εκτελεί o επεξεργαστής. Μπορεί να διαµοιράζεται ανάµεσα σε διεργασίες. Συνήθως είναι ανάγνωσης µόνο (?) Τµήµα αρχικοποιηµένωνδεδοµένων (initialised data segment) Καθολικές µεταβλητές µε αρχική τιµή π.χ. int Pi = 3.1415; static char message[] = hello world!"; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 7
ιευθέτησημνήµης (Πρόγραµµα C) Τµήµαµη αρχικοποιηµένωνδεδοµένων (uninitialized data segment) Καθολικές µεταβλητές χωρίς αρχική τιµή π.χ. int result; double Matrix[512][512]; Ο πυρήνας γράφει µηδενικά στο τµήµα αυτό πριν ξεκινήσει η εκτέλεση του προγράµµατος Στοίβα Τοπικές µεταβλητές, παράµετροι συναρτήσεων και διευθύνσεις επιστροφής Σωρός Για δυναµική διαχείριση µνήµης (malloc, calloc,...) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 8
Νήµατα Ένανήµα είναι µια ανεξάρτητη ακολουθία εκτέλεσης εντολών ενός προγράµµατος εντός µιας διεργασίας Φιλοσοφία: Αντιγραφή και διαχωρισµός µόνο των απαραίτητων δεδοµένων Κοινή διαµοίραση των υπόλοιπων Μια διεργασία µπορεί να δηµιουργήσει πολλαπλά νήµατα, τα οποία εκτελούν µια συγκεκριµένη συνάρτηση Κάθε τέτοιο νήµα έχει ξεχωριστή κατάσταση εκτέλεσης όλα µπορούν να εκτελεστούν ταυτόχρονα σε διαφορετικούς επεξεργαστές. Κάθε νήµα χρησιµοποιεί τον ίδιο χώρο διευθύνσεων, οπότε όλα επενεργούν στα ίδια δυναµικά και στατικά δεδοµένα. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 9
Νήµατα Ένα νήµα συχνά καλείται ελαφριά διεργασία εν είναι όµως διεργασία αλλά κάτι µικρότερο από αυτή Το περιβάλλον εκτέλεσης µιας διεργασίας περιλαµβάνει Μνήµη, εντολές, µετρητή προγράµµατος, δείκτη στοίβας, καταχωρητές, περιγραφείς αρχείων κλπ. Ένα νήµα διαθέτει λιγότερα χαρακτηριστικά Μετρητή προγράµµατος, στοίβα, σύνολο καταχωρητών E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 10
Τα νήµατα µοιράζονται Νήµατα Εντολές διεργασίες, τα περισσότερα δεδοµένα, τα ανοιχτά αρχεία, χειριστές σηµάτων, τρέχων κατάλογος εργασίας, ταυτότητα χρήστη και οµάδας εν µοιράζονται Ταυτότητα νήµατος, σύνολο καταχωρητών (που περιλαµβάνει τον µετρητή προγράµµατος (pc) και τον δείκτη στοίβας (sp)), στοίβα, errno, µάσκα σηµάτων, προτεραιότητα Πρότυπο POSIX: pthreads Καθορίζει τη διεπαφή και τον τρόπο µε τον οποίο άλλες διεπαφής του προτύπου POSIX σχετίζονται µε τα νήµατα E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 11
ιεργασίεςκαι Νήµατα Παραδοσιακή ιεργασία Νήµατα Εκτέλεσης Πολυνηµατική ιεργασία Μιαροή εκτέλεσης εντολών Πεδίο ιευθύνσεων Πολλαπλέςροές εκτέλεσης εντολών E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 12
ιεργασίεςκαι Νήµατα Process ID Program Counter Signal Mask Registers Process Priority Pointer & Heap Memory Map File Descriptor Table Thread ID Program Counter Signal Mask Registers Thread Priority Pointer & Τανήµατα µοιράζονται την ίδια µνήµη, σωρό, χειριστές σηµάτων και περιγραφείς αρχείων E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 13
ιεργασίεςκαι Νήµατα Βασικά πλεονεκτήµατα νηµάτων Μικρότερο κόστος δηµιουργίας και διαχείρισης Η επικοινωνία µεταξύ νηµάτων είναι απλούστερη και φτηνότερη σε σύγκριση µε τις διεργασίες Ο προγραµµατισµός νηµάτων µπορεί να είναι επικίνδυνος Είναι ευκολότερο να συµβεί κάποιο προγραµµατιστικό λάθος Μερικές ρουτίνες συστήµατος συµπεριφέρονται διαφορετικά µε τα νήµατα Υπάρχουν διαφορετικές προσεγγίσεις υλοποίησης νήµατα σε επίπεδο χρήστη (user level) νήµατα σε επίπεδο συστήµατος (system/kernel level) Η διαφορά βρίσκεται στο κατά πόσο το ίδιο το λειτουργικό γνωρίζει την ύπαρξη νηµάτων ή όχι E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 14
ΝήµαταΕπιπέδου Πυρήνα Υλοποίηση σε επίπεδο λειτουργικού συστήµατος. Κάθε νήµα είναι ουσιαστικά µια (ελαφριά) διεργασία. Οι πράξεις νηµάτων είναι κλήσεις συστήµατος. Χρονοπρογραµµατισµός γίνεται από το λειτουργικό σύστηµα, όπως και για τις κανονικές διεργασίες. Εύκολη /αυτόµατη παράλληλη εκτέλεση νηµάτωνόταν το υλικό διαθέτει πολλούς επεξεργαστές. Αν ένα νήµα µπλοκάρει (σε κάποια κλήση συστήµατος) τότε τα υπόλοιπα νήµατα (της ίδιας διεργασίας) συνεχίζουν την εκτέλεση τους Όλες σχεδόν οι υλοποιήσεις των POSIX Threads χρησιµοποιούν το συγκεκριµένο µοντέλο E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 15
ΝήµαταΕπιπέδου Πυρήνα Απεικόνιση ένα-προς-ένα (1:1) Νήµα 1 Οντότητα Πυρήνα 1 Registers Νήµα 2 Οντότητα Πυρήνα 2 CPU 1 Registers Registers Νήµα 3 Νήµα 4 Οντότητα Πυρήνα 3 Οντότητα Πυρήνα 4 CPU 2 Heap Data Code E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 16
ΝήµαταΕπιπέδου Χρήστη Υλοποίηση σε επίπεδο χρήστη Στοίβα και καταχωρητές setjmp, ucontext, assembly, fibers Οι πράξεις σε επίπεδο νηµάτων είναι γρήγορες αφούδεν υλοποιούνται µέσω κλήσεων συστήµατος. Τα νήµατα χρονοπρογραµµατίζονταιστον χρόνο τηςδιεργασίας που τα δηµιουργεί, µε φροντίδα τηςυλοποίησης σε επίπεδο χρήστη. Μπορεί να υποστηριχθεί αυτόµατη (alarm) ή αποκλειστικά ελεγχόµενη (εθελοντική) εναλλαγή (yield). εν µπορεί να γίνει εκµετάλλευση πολυεπεξεργαστώνκαθώς το λειτουργικό σύστηµα δεν γνωρίζει τηνύπαρξη νηµάτων µέσα σε µια διεργασία. Αν ένα νήµα µπλοκάρει (π.χ. read) τότε µπλοκάρει όλη η διεργασία. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 17
ΝήµαταΕπιπέδου Χρήστη Απεικόνιση πολλά-προς-ένα (Μ:1) Νήµα 1 Νήµα 2 Νήµα 3 Νήµα 4 Οντότητα Πυρήνα 1 CPU 1 CPU 2 Heap Data Code Registers E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 18
Νήµατα ύο Επιπέδων Συνδυασµός των δύο προηγούµενων προσεγγίσεων. Μια διεργασία µπορεί να δηµιουργήσει νήµατα σεεπίπεδο συστήµατος, σε κάθε ένα από τα οποίαµπορεί να απεικονίσει ένα ή περισσότερα νήµατα σε επίπεδο χρήστη. Το λειτουργικό σύστηµα χρονοπρογραµµατίζειτανήµατα συστήµατος, ενώ η διεργασία (σύστηµα χρόνου εκτέλεσης) είναι ελεύθερη να χρονοπρογραµµατίζει τα νήµατα χρήστη. Προχωρηµένη επικοινωνία εφαρµογής-συστήµατοςγια προσαρµοζόµενη λειτουργία, π.χ. δηµιουργίανηµάτων όταν υπάρχουν αρκετοί διαθέσιµοι πόροι. υνατότητα επέκτασης του αλγόριθµου που χρησιµοποιεί ο χρονοπρογραµµατιστής του συστήµατος. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 19
Νήµατα ύο Επιπέδων Απεικόνισηπολλά-προς-πολλά (Μ:Ν) Νήµα 1 Registers Νήµα 2 Οντότητα Πυρήνα 1 CPU 1 Registers Νήµα 3 Νήµα 4 Οντότητα Πυρήνα 2 CPU 2 Heap Data Code E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 20
ΓενικήΑρχιτεκτονική Χρήστες Πυρήνας Δροµολογητής ΛΣ = Νήµα επιπέδου χρήστη = Νήµα επιπέδου πυρήνα = Επεξεργαστής E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 21