Μηχανισμοί και προγραμματιστικές δομές συγχρονισμού. Προβλήματα συγχρονισμού (και λύσεις)

Σχετικά έγγραφα
CSLab National Technical University of Athens

Συγχρονισμός. Συστήματα Παράλληλης Επεξεργασίας 9ο εξάμηνο ΣΗΜΜΥ ακ. έτος CSLab. Κορνήλιος Κούρτης

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Λειτουργικά Συστήματα Η/Υ

Συγχρονισμός Μέρος Α : Κρίσιμο τμήμα και κλειδώματα

2.4 Κλασσικά Προβλήματα IPC

ΣυγχρονισµόςσεΣυστήµατα ΠολλαπλώνΝηµάτων

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ ΣΥΓΧΡΟΝΙΣΜΟΣ

Λειτουργικά Συστήματα (ΗΥ222)

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

Επικοινωνία µεταξύ ιεργασιών και Σύνδροµες ιεργασίες

Διεργασίες (Processes)

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

Αμοιβαίος αποκλεισμός

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

Δομημένος Προγραμματισμός

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Λειτουργικά Συστήματα

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα

ΔΙΕΡΓΑΣΙΕΣ. Λειτουργικά Συστήματα Ι. Διδάσκων: Καθ. Κ. Λαμπρινουδάκης ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

Μάθημα 4 ο. Κρίσιμα Τμήματα και Αμοιβαίος Αποκλεισμός

Λειτουργικά Συστήματα

Εισαγωγή στα Λειτουργικά Συστήματα

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα

Λειτουργικά Συστήματα

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

ΚΕΦΑΛΑΙΟ 9. Ταυτόχρονος προγραμματισμός και νήματα. 9.1 Εισαγωγή

Λειτουργικά Συστήματα (ΗΥ222)

Προβλήματα Συγχρονισμού (με ελεγκτή) Ταυτόχρονος Προγραμματισμός 1

Ιδιοκτησία Αντικειµένου

Αδιέξοδα Ανάθεση Πόρων (Deadlocks Resource Allocation)

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Αδιέξοδα Ανάθεση Πόρων (Deadlocks Resource Allocation)

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Κεφάλαιο 3. Διδακτικοί Στόχοι

3 η ΕΝΟΤΗΤΑ Συναρτήσεις στο MATLAB

Ενότητα 4 (Κεφάλαιο 5) Συντρέχων Προγραμματισμός

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

Κρίσιμη Περιοχή Υπό Συνθήκη (Conditional Critical Regions) Ταυτόχρονος Προγραμματισμός 1

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1

Αδιέξοδα (Deadlocks)

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Θοδωρής Ανδρόνικος Τμήμα Πληροφορικής, Ιόνιο Πανεπιστήμιο

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Το μάθημα. Λειτουργικά Συστήματα Πραγματικού Χρόνου Βασικές Έννοιες 6. Ενσωματωμένα Συστήματα (embedded systems) Παραδείγματα

Δομές Δεδομένων Ενότητα 3

Σκελετός Παρουσίασης

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός

Δομές Δεδομένων. Ενότητα 12: Κατακερματισμός: Χειρισμός Συγκρούσεων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Λειτουργικά Συστήματα Πραγματικού Χρόνου

Δομές Δεδομένων Ενότητα 4

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Λειτουργικά Συστήματα Η/Υ

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Αντικειμενοστραφής Προγραμματισμός

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές

Λιβανός Γιώργος Εξάμηνο 2017Β

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος Κανονική Εξέταση Λύσεις

Παράλληλη Επεξεργασία

Αρχιτεκτονική Υπολογιστών

Παράλληλη Επεξεργασία Κεφάλαιο 10 ο Αντίγραφα Εργαζομένων

Παράλληλη Επεξεργασία Κεφάλαιο 5 Μοίρασμα Δεδομένων

Προσπέλαση κοινών πόρων Πρωτόκολλα ελέγχου αμοιβαίου αποκλεισμού

Πληροφορική ΙΙ Θεματική Ενότητα 5

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

Βάσεις Δεδομένων ΙΙ Ενότητα 2


Δομές Δεδομένων. Ενότητα 1: Εισαγωγή-Υλοποίηση του ΑΤΔ Σύνολο με Πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Εισαγωγή στον Προγραμματισμό με C++

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι ΙΕΡΓΑΣΙΕΣ ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΙΕΡΓΑΣΙΕΣ

Ηλεκτρονικοί Υπολογιστές

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

Συγχρονισµός: Αδιέξοδο & Παρατεταµένη Στέρηση

Υ- 07 Παράλληλα Συστήματα Transac9onal memory

Εισαγωγή στα Λειτουργικά Συστήματα

Οργάνωση Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Ασκήσεις 7: Πρόγραμμα Συνδεδεμένης Λίστας και Διαδικασιών. Μανόλης Γ.Η.

{ int a = 5; { int b = 7; a = b + 3;

Λειτουργικά Συστήματα (Λ/Σ)

Transcript:

Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς.

Περιεχόμενα 2 Το πρόβλημα του συγχρονισμού Πότε/γιατί χρειάζεται δύο ή περισσότερες διεργασίες να συγχρονιστούν; Μηχανισμοί και προγραμματιστικές δομές συγχρονισμού Κλειδώματα (locks) Σημαφόροι (semaphores) Παρακολουθητές (monitors) Προβλήματα συγχρονισμού (και λύσεις) Σειριοποίηση (ordering) Παραγωγός - Καταναλωτής Αναγνώστες - Εγγραφείς Συνδαιτημόνες συγγραφείς (dining philosophers) Επιπλέον ζητήματα Αλληλεπίδραση με το υλικό Στρατηγικές συγχρονισμού Αδιέξοδα

Μοιραζόμενοι πόροι μεταξύ διεργασιών 3 Μοιραζόμενοι πόροι Συνεργασία διεργασιών (χώρος χρήστη) πχ πρόβλημα παραγωγού-καταναλωτή Πρόσβαση σε πόρους του ΛΣ (χώρος πυρήνα) πχ πρόσβαση στο σύστημα αρχείων Πρόσβαση διεργασιών σε μοιραζόμενους πόρους/δεδομένα Πιθανή δημιουργία ασυνεπειών Σημείωση: ο όρος διεργασία περιλαμβάνει και τα νήματα

4 Παράδειγμα: Παραγωγός-Καταναλωτής δομή: Κυκλικός πίνακας (μεγέθους N) Καταναλωτής: αφαιρεί δεδομένα από το "τέλος" #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0;

4 Παράδειγμα: Παραγωγός-Καταναλωτής δομή: Κυκλικός πίνακας (μεγέθους N) Καταναλωτής: αφαιρεί δεδομένα από το "τέλος" #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; void enqueue(item_t item){ item_t item; item_t dequeue(void){ item_t item; buffer[in] = item; in = NEXT(in); count++; item = buffer[out]; out = NEXT(out); count--; return item

4 Παράδειγμα: Παραγωγός-Καταναλωτής δομή: Κυκλικός πίνακας (μεγέθους N) Καταναλωτής: αφαιρεί δεδομένα από το "τέλος" #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; void enqueue(item_t item){ item_t item; while (count == N) ; // wait buffer[in] = item; in = NEXT(in); count++; item_t dequeue(void){ item_t item; while (count == 0) ; // wait item = buffer[out]; out = NEXT(out); count--; return item

4 Παράδειγμα: Παραγωγός-Καταναλωτής δομή: Κυκλικός πίνακας (μεγέθους N) Καταναλωτής: αφαιρεί δεδομένα από το "τέλος" #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; void enqueue(item_t item){ item_t item; while (count == N) ; // wait buffer[in] = item; in = NEXT(in); count++; item_t dequeue(void){ item_t item; while (count == 0) ; // wait item = buffer[out]; out = NEXT(out); count--; return item

5 Κατάσταση συναγωνισμού race condition t count++ count-- 1 LOAD r, count 2 ADD 1, r 3 LOAD r, count 4 SUB 1, r 5 STORE r, count 6 STORE r, count

5 Κατάσταση συναγωνισμού race condition t count++ count-- 1 LOAD r, count 2 ADD 1, r 3 LOAD r, count 4 SUB 1, r 5 STORE r, count 6 STORE r, count Αν για t = 0, count = c, τότε για t = 7, count = c 1 Ασυνέπεια στη δομή του κυκλικού πίνακα Κατάσταση συναγωνισμού: κατάσταση κατά την οποία το αποτέλεσμα ενός υπολογισμού εξαρτάται από την σειρά που πραγματοποιούνται οι προσπελάσεις.

Παράδειγμα: Διπλά συνδεδεμένη λίστα 6 struct list_head { struct list_head *next; struct list_head *prev; ; list_del(prev, next) { prev->next = next; next->prev = prev; A. B C D

6 Παράδειγμα: Διπλά συνδεδεμένη λίστα struct list_head { struct list_head *next; struct list_head *prev; ; list_del(prev, next) { prev->next = next; next->prev = prev; Διαγραφή B (1 διεργασία) 1. t0: prev->next = next; 2. t0: next->prev = prev; 3. OK! A B C D A B C D A B C D

6 Παράδειγμα: Διπλά συνδεδεμένη λίστα struct list_head { struct list_head *next; struct list_head *prev; ; list_del(prev, next) { prev->next = next; next->prev = prev; Διαγραφή B,C (2 διεργασίες) 1. t0: prev->next = next; 2. t1: prev->next = next; A B C D A B C D A B C D

6 Παράδειγμα: Διπλά συνδεδεμένη λίστα struct list_head { struct list_head *next; struct list_head *prev; ; list_del(prev, next) { prev->next = next; next->prev = prev; Διαγραφή B,C (2 διεργασίες) 1. t0: prev->next = next; 2. t1: prev->next = next; 3. ΑΣΥΝΕΠΕΙΑ A B C D A B C D A B C D

Πρόσβαση σε μοιραζόμενες πόρους/δεδομένα 7 Πιθανή δημιουργία ασυνεπειών - Διακοπτή χρονοδρομολόγηση (preemptive scheduling) Ο χρονοδρομολογητής μπορεί να διακόψει την τρέχουσα διεργασία σε οποιοδήποτε σημείο. - Πολυεπεξεργασία (συστήματα μοιραζόμενης μνήμης) Ταυτόχρονη πρόσβαση σε κοινές δομές δεδομένων. Ανάγκη για συγχρονισμό διεργασιών Χώρος χρήστη Χώρος πυρήνα

8 1 επεξεργαστής, Διακοπτή χρονοδρομολόγηση (χώρος χρήστη) Δ0 p0-ins0 p0-ins1. p0-ins2... Δ1 p1-ins0 p1-ins1 p1-ins2... Δ2 p2-ins0 p2-ins1 p2-ins2... Χρονοδρομολογητής KME p2-ins0 p2-ins1 p0-ins0 p1-ins0...

>1 επεξεργαστές, πολυεπεξεργασία (χώρος χρήστη) Δ0 p0-ins0 p0-ins1. p0-ins2... Δ1 p1-ins0 p1-ins1 p1-ins2... Δ2 p2-ins0 p2-ins1 p2-ins2... Χρονοδρομολογητής ΚΜΕ0 $ ΚΜΕ1 $ Μνήμη 9

10 Κρίσιμο τμήμα (ΚΤ) critical section Λύση στο πρόβλημα της ταυτόχρονης πρόσβασης σε μοιραζόμενους πόρους Διαισθητικά: ορίζονται τμήματα κώδικα στα οποία μπορεί να βρίσκεται το πολύ μια διεργασία τη φορά Επιτρέπει την ατομική εκτέλεση τμημάτων Απαιτήσεις: Αμοιβαίος αποκλεισμός (mutual exclusion) Πρόοδος Πεπερασμένη αναμονή Παραδοχές μη-μηδενικές ταχύτητες εκτέλεσης διεργασιών καμία παραδοχή για την σχετική ταχύτητα των διεργασιών

11 Κλειδώματα Locks Ορισμός κρίσιμων τμημάτων: Είσοδος στο ΚΤ: κλείδωμα (lock) Έξοδος από το ΚΤ: ξεκλείδωμα (unlock) do { lock(mylock); /* critical section */ code unlock(mylock); remainder section while (TRUE);

11 Κλειδώματα Locks Ορισμός κρίσιμων τμημάτων: Είσοδος στο ΚΤ: κλείδωμα (lock) Έξοδος από το ΚΤ: ξεκλείδωμα (unlock) do { do { lock(mylock); lock(mylock); /* critical section */ /* critical section */ code other code unlock(mylock); unlock(mylock); remainder section other remainder section while (TRUE); while (TRUE); μεταβλητή lock: ορίζει instances του ΚΤ

12 Μια πρώτη λύση στο πρόβλημα του συγχρονισμού για 2 διεργασίες bool flag[2] = { FALSE, FALSE ; do { flag[me] = TRUE; while (flag[other]) ; critical section flag[me] = FALSE; remainder section while (TRUE);

12 Μια πρώτη λύση στο πρόβλημα του συγχρονισμού για 2 διεργασίες bool flag[2] = { FALSE, FALSE ; do { flag[me] = TRUE; while (flag[other]) ; critical section flag[me] = FALSE; remainder section while (TRUE); t me=0 me=1 1 flag[0] = TRUE 2 flag[1] = TRUE

12 Μια πρώτη λύση στο πρόβλημα του συγχρονισμού για 2 διεργασίες bool flag[2] = { FALSE, FALSE ; do { flag[me] = TRUE; while (flag[other]) ; critical section flag[me] = FALSE; remainder section while (TRUE); t me=0 me=1 1 flag[0] = TRUE 2 flag[1] = TRUE Αδιέξοδο! (αδύνατο να συνεχιστεί η εκτέλεση)

13 Η λύση του Peterson do { flag[me] = TRUE; turn = other; while (flag[other] && turn == other) ; critical section flag[me] = FALSE; remainder section while (TRUE); Περιορίζεται σε δύο διεργασίες Θεωρητικά ικανοποιεί τις απαραίτητες συνθήκες Πρακτικά δεν μπορεί να χρησιμοποιηθεί

14 Ζητήματα Υλοποίησης στην πράξη... Ο μεταγλωττιστής μπορεί να αναδιατάξει τις εντολές Ο Επεξεργαστής μπορεί να εκτελέσει εντολές εκτός σειράς (Out of Order Execution) Σε πολυεπεξεργαστικά συστήματα μοιραζόμενης μνήμης, δεν είναι προφανές πότε θα φανούν οι αλλαγές που έκανε ένας επεξεργαστής σε μια θέση μνήμης στους υπόλοιπους.

15 Μηχανισμοί Συγχρονισμού Ατομικές εντολές (Atomic Operations) Περιστροφικά Κλειδώματα (Spinlocks) Κλειδώματα αμοιβαίου αποκλεισμού (Mutexes) Σημαφόροι (Semaphores) Ελεγκτές/Παρακολουθητές (Monitors)

16 Ατομικές Εντολές Atomic Operations Εγγυημένες να λειτουργούν ατομικά Υλοποιούνται στο υλικό Χρησιμοποιούνται για τη δημιουργία μηχανισμών συγχρονισμού Παραδείγματα: TestAndSet: Θέτει την τιμή μιας μεταβλητής σε TRUE και επιστρέφει την προηγούμενη τιμή. Swap: Ανταλλάσσει την τιμή δύο μεταβλητών

Spinlocks 17 Υλοποίηση αμοιβαίου αποκλεισμού με: Ατομικές εντολές Βρόχους ενεργού αναμονής (busy-wait loops)

Spinlocks 17 Υλοποίηση αμοιβαίου αποκλεισμού με: Ατομικές εντολές Βρόχους ενεργού αναμονής (busy-wait loops) Παραδείγματα: do { while (TestAndSet(lock)) ; critical section UnSet(lock); remainder section while (TRUE);

Spinlocks 17 Υλοποίηση αμοιβαίου αποκλεισμού με: Ατομικές εντολές Βρόχους ενεργού αναμονής (busy-wait loops) Παραδείγματα: do { while (TestAndSet(lock)) ; critical section UnSet(lock); remainder section while (TRUE); do { key = TRUE; while (key) Swap(lock,key); critical section UnSet(lock); remainder section while (TRUE);

Spinlocks 17 Υλοποίηση αμοιβαίου αποκλεισμού με: Ατομικές εντολές Βρόχους ενεργού αναμονής (busy-wait loops) Παραδείγματα: do { while (TestAndSet(lock)) ; critical section UnSet(lock); remainder section while (TRUE); do { key = TRUE; while (key) Swap(lock,key); critical section UnSet(lock); remainder section while (TRUE); Δεν ικανοποιούν την απαίτηση πεπερασμένης αναμονής

18 Υλοποίηση spinlock που ικανοποιεί όλες τις απαιτήσεις για το κρίσιμο τμήμα #define NEXT(x) ((x + 1) % N) bool waiting[n], lock; Lock: Set(waiting[me]); key = TRUE; while (Test(waiting[me]) && key) key = TestAndSet(&lock); UnSet(waiting[me]); Unlock: for (j = NEXT(me); ; j = NEXT(j)){ if (j == me){ UnSet(lock); break; if (Test(waiting[j])){ UnSet(waiting[j]); break;

19 Τακτικές αμοιβαίου αποκλεισμού Ενεργός Αναμονή Καταναλώνει υπολογιστικούς πόρους, όσο μια άλλη διεργασία βρίσκεται στο κρίσιμο τμήμα. Η ΚΜΕ μπορεί να χρησιμοποιηθεί για άλλες εργασίες Κατανάλωση ενέργειας Αμοιβαίος αποκλεισμός με αναστολή εκτέλεσης (Mutex) Αν το ΚΤ είναι κατειλημμένο η διεργασία αναστέλλει την λειτουργία της και τίθεται υπό αναμονή (state = WAITING). Ο επεξεργαστής ελευθερώνεται και ο Χρονοδρομολογητής επιλέγει άλλη διεργασία. Κατά την έξοδο από το ΚΤ, ενεργοποιείται μια υπό αναμονή διεργασία (state = READY)

20 Σημαφόροι Semaphores Τα spinlocks και mutexes λύνουν το πρόβλημα του κρίσιμου τμήματος, αλλά: Είναι "low-level" primitives και δυσχεραίνουν τον προγραμματισμό Δεν επιλύουν πιο σύνθετα προβλήματα συγχρονισμού (π.χ. > 1 διεργασίες στο κρίσιμο τμήμα) Οι σημαφόροι επινοήθηκαν από τον Dijkstra Αποτελούν προγραμματιστικές δομές συγχρονισμού υψηλότερου επιπέδου Είναι πιο ευέλικτοι από τα locks και μπορούν να χρησιμοποιηθούν για επίλυση πιο σύνθετων προβλημάτων (βλ. συνέχεια)

21 Σημαφόροι Λειτουργίες Ο σημαφόρος είναι ένας ακέραιος αριθμός στον οποίο επιτρέπεται η πρόσβαση μόνο με τρεις αυστηρά ορισμένες λειτουργίες: αρχικοποίηση, wait και signal. Λειτουργίες: Αρχικοποιείται σε μία ακέραιη τιμή. Μετά την αρχικοποίηση επιτρέπονται μόνο η wait() και η signal() wait(): Αν ο σημαφόρος είναι <= 0, η διεργασία περιμένει ("κολλάει"). Αν είναι > 0 ο σημαφόρος μειώνεται κατά 1 και η διεργασία συνεχίζει την εκτέλεσή της. signal(): Ο σημαφόρος αυξάνεται κατά 1.

22 Σημαφόροι Λειτουργίες wait (S) { while (S <= 0) ; S--; signal (S) { S++;

22 Σημαφόροι Λειτουργίες wait (S) { while (S <= 0) ; S--; signal (S) { S++; Όλες οι αλλαγές στην τιμή του σημαφόρου είναι ατομικές!

23 Σημαφόροι Υλοποίηση με ενεργό αναμονή wait (S) { while (1) { lock(s_lock); if (S > 0) { S--; unlock(s_lock); break; unlock(s_lock); signal (S) { lock(s_lock); S++; unlock(s_lock);

24 Σημαφόροι Υλοποίηση χωρίς ενεργό αναμονή typedef struct { int value; lock s_lock; struct process *list; Semaphore; wait (Semaphore *S) { lock(s->s_lock); S->value--; if (S->value < 0) { add proc to S->list; unlock(s->s_lock); block(); unlock(s->s_lock); signal (Semaphore *S) { lock(s->s_lock); S->value++; if (S->value <= 0) { remove P from S->list; wakeup(p); unlock(s->s_lock);

25 Σημαφόροι Σημειώσεις Μια διεργασία δεν μπορεί να ξέρει την τιμή του σημαφόρου και συγκεκριμένα δεν ξέρει αν θα χρειαστεί να περιμένει ή όχι σε περίπτωση που καλέσει την wait() Δεν υπάρχει κάποιος κανόνας για το ποιο νήμα από αυτά που περιμένουν, θα συνεχίσει την λειτουργία του μετά από κλήση της signal() Ένα mutex ισοδυναμεί με έναν σημαφόρο αρχικοποιημένο στο 1 (unlocked) Οι λειτουργίες στους σημαφόρους παραδοσιακά αναφέρονται και ως P() (wait()) και V() (signal()).

26 Πρόβλημα σειριοποίησης (ordering) Θέλουμε η διεργασία P 1 να εκτελέσει τη ρουτίνα S 1 πριν η διεργασία P 2 εκτελέσει τη ρουτίνα S 2. Αρχικοποιούμε το σημαφόρο sema στην τιμή 0. // P1 S1(); signal(sema); // P2 wait(sema); S2();

Πρόβλημα Παραγωγού-Καταναλωτή 27 #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; void enqueue(item_t item){ item_t item; while (count == N) ; // wait buffer[in] = item; in = NEXT(in); count++; item_t dequeue(void){ item_t item; while (count == 0) ; // wait item = buffer[out]; out = NEXT(out); count--; return item

Πρόβλημα Παραγωγού-Καταναλωτή 27 #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; sema_t mutex = semaphore(1); void enqueue(item_t item){ wait(mutex); item_t item; while (count == N) ; // wait buffer[in] = item; in = NEXT(in); count++; signal(mutex); item_t dequeue(void){ wait(mutex); item_t item; while (count == 0) ; // wait item = buffer[out]; out = NEXT(out); count--; signal(mutex); return item

27 Πρόβλημα Παραγωγού-Καταναλωτή #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; sema_t mutex = semaphore(1); void enqueue(item_t item){ wait(mutex); item_t item; while (count == N) ; // wait buffer[in] = item; in = NEXT(in); count++; signal(mutex); ΑΔΙΕΞΟΔΟ! (deadlock) item_t dequeue(void){ wait(mutex); item_t item; while (count == 0) ; // wait item = buffer[out]; out = NEXT(out); count--; signal(mutex); return item

Πρόβλημα Παραγωγού-Καταναλωτή (Σωστή λύση) #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; sema_t mutex = semaphore(1); sema_t items = semaphore(0); sema_t space = semaphore(n); void enqueue(item_t item){ item_t item; item_t dequeue(void){ item_t item; buffer[in] = item; in = NEXT(in); count++; item = buffer[out]; out = NEXT(out); count--; return item 28

Πρόβλημα Παραγωγού-Καταναλωτή (Σωστή λύση) #define NEXT(x) ((x + 1) % N) item_t buffer[n]; int in=0, out=0, count=0; sema_t mutex = semaphore(1); sema_t items = semaphore(0); sema_t space = semaphore(n); void enqueue(item_t item){ item_t item; wait(space); wait(mutex); buffer[in] = item; in = NEXT(in); count++; signal(mutex); signal(items); item_t dequeue(void){ item_t item; wait(items); wait(mutex); item = buffer[out]; out = NEXT(out); count--; signal(mutex); signal(space); return item 28

29 Πρόβλημα Αναγνωστών - Εγγραφέων readers-writers problem Δύο κλάσεις προσβάσεων: Αναγνώστες: Δεν αλλάζουν τα δεδομένα Εγγραφείς: Αλλάζουν τα δεδομένα Κανόνες: Επιτρέπονται πολλαπλοί Αναγνώστες ταυτόχρονα Οι Εγγραφείς πρέπει να έχουν αποκλειστική πρόσβαση Χρησιμοποιείται για δομές που δεν αλλάζουν συχνά Προτεραιότα: Στους Eγγραφείς Στους Αναγνώστες Πιθανή λιμοκτονία (starvation) και στις δύο περιπτώσεις

30 Πρόβλημα Αναγνωστών - Εγγραφέων προτεραιότητα στους αναγνώστες sema_t mutex = semaphore(1); sema_t write = semaphore(1); int readcount = 0; read_lock: wait(mutex); if (++readcount == 1) wait(write); signal(mutex); write_lock: wait(write); write_unlock: signal(write); read_unlock: wait(mutex); if (--readcount == 0) signal(write); signal(mutex);

31 Το πρόβλημα των συνδαιτυμόνων φιλοσόφων Dining philosophers problem - 5 φιλόσοφοι (τρώνε και σκέφτονται) - 5 ξυλάκια φαγητού P1 - Όταν ένας φιλόσοφος πεινάει, χρειάζεται 2 ξυλάκια για να φάει P5 P2 - Δεν μπορούν 2 φιλόσοφοι να χρησιμοποιούν το ίδιο ξυλάκι - Aποφυγή αδιεξόδου - Αποφυγή λιμοκτονίας P4 P3

Λύση στο πρόβλημα των συνδαιτυμόνων φιλοσόφων 32 #define NEXT(x) ((x+1) % N) sema_t F[N]; //forks do { think(); wait(f[i]); wait(f[next(i)]); eat(); signal(f[next(i)]); signal(f[i]); while (TRUE); P5 P1 P2 P4 P3

Λύση στο πρόβλημα των συνδαιτυμόνων φιλοσόφων 32 #define NEXT(x) ((x+1) % N) sema_t F[N]; //forks do { think(); wait(f[i]); wait(f[next(i)]); eat(); signal(f[next(i)]); signal(f[i]); while (TRUE); P5 P1 P2 1. P1 παίρνει F1 2. P2 παίρνει F2 3. P3 παίρνει F3 4. P4 παίρνει F4 5. P5 παίρνει F5 P4 P3

Λύση στο πρόβλημα των συνδαιτυμόνων φιλοσόφων 32 #define NEXT(x) ((x+1) % N) sema_t F[N]; //forks do { think(); wait(f[i]); wait(f[next(i)]); eat(); signal(f[next(i)]); signal(f[i]); while (TRUE); P5 L W L P1 W L W P2 1. P1 παίρνει F1 2. P2 παίρνει F2 3. P3 παίρνει F3 4. P4 παίρνει F4 5. P5 παίρνει F5 Αδιέξοδο! W P4 L W P3 L

33 Λύσεις στο πρόβλημα των συνδαιτυμόνων φιλοσόφων (σωστές) Λύσεις P1 P5 P2 P4 P3

33 Λύσεις στο πρόβλημα των συνδαιτυμόνων φιλοσόφων (σωστές) Λύσεις 1. Χρήση σημαφόρου, αρχικοποιημένου στην τιμή 4, ώστε σε κάθε περίπτωση να μην διεκδικούν και οι 5 φιλόσοφοι τα ξυλάκια. P5 P1 P2 P4 P3

33 Λύσεις στο πρόβλημα των συνδαιτυμόνων φιλοσόφων (σωστές) Λύσεις 1. Χρήση σημαφόρου, αρχικοποιημένου στην τιμή 4, ώστε σε κάθε περίπτωση να μην διεκδικούν και οι 5 φιλόσοφοι τα ξυλάκια. P5 P1 P2 2. Σε περίπτωση που ένας από τους φιλόσοφους ξεκινάει να πάρει ένα ξυλάκι με διαφορετική σειρά από ότι οι υπόλοιποι, τότε δεν μπορεί να δημιουργηθεί αδιέξοδο. P4 P3

34 Ελεγκτές/Παρακολουθητές (Monitors) Οι σημαφόροι παρέχουν βολικό και αποτελεσματικό μηχανισμό συγχρονισμού Ωστόσο: βάρος χρήσης στον προγραμματιστή (που δεν είναι ποτέ καλή ιδέα )

34 Ελεγκτές/Παρακολουθητές (Monitors) Οι σημαφόροι παρέχουν βολικό και αποτελεσματικό μηχανισμό συγχρονισμού Ωστόσο: βάρος χρήσης στον προγραμματιστή (που δεν είναι ποτέ καλή ιδέα ) Ελεγκτές/Παρακολουθητές: Υψηλού επιπέδου σχήματα συγχρονισμού που παρέχονται από τις γλώσσες προγραμματισμού Αφηρημένος τύπος δεδομένων (abstract data type -- ADT) Κρύβει λεπτομέρειες υλοποίησης Δεν επιτρέπει απευθείας πρόσβαση στα δεδομένα (ιδιωτικά δεδομένα) Ο προγραμματιστής ορίζει λειτουργίες (μεθόδους)

Ελεγκτές/Παρακολουθητές (παράδειγμα δομής) monitor MyMonitor { // shared variables int a; // methods procedure P_1(...) {... procedure P_2(...) {... // initialization initialize() { a =...... 35

36 Ελεγκτές/Παρακολουθητές Μηχανισμοί που παρέχονται Αμοιβαίος Αποκλεισμός (mutual exclusion) Μεταβλητές συνθήκης (condition variables)

36 Ελεγκτές/Παρακολουθητές Μηχανισμοί που παρέχονται Αμοιβαίος Αποκλεισμός (mutual exclusion) Όταν μια διεργασία εκτελεί μια λειτουργία, τότε η διεργασία βρίσκεται μέσα στον παρακολουθητή Είναι εγγυημένο ότι μόνο μια διεργασία μπορεί να είναι ενεργή μέσα στον παρακολουθητή Μεταβλητές συνθήκης (condition variables)

36 Ελεγκτές/Παρακολουθητές Μηχανισμοί που παρέχονται Αμοιβαίος Αποκλεισμός (mutual exclusion) Όταν μια διεργασία εκτελεί μια λειτουργία, τότε η διεργασία βρίσκεται μέσα στον παρακολουθητή Είναι εγγυημένο ότι μόνο μια διεργασία μπορεί να είναι ενεργή μέσα στον παρακολουθητή Μεταβλητές συνθήκης (condition variables) Μηχανισμός, ώστε μια διεργασία να αναστέλλει την λειτουργία της έως ότου ικανοποιηθεί μια συνθήκη (πχ Παραγωγός-Καταναλωτής) Λειτουργίες: wait(): Η διεργασία αδρανοποιείται μέχρι να κληθεί η signal(). signal(): Ενεργοποιεί (ακριβώς) μια αδρανοποιημένη διεργασία. (Πότε ;)

37 Παράδειγμα Παρακολουθητή Παραγωγός-Καταναλωτής #define NEXT(x) ((x + 1) % N) monitor ProducerConsumer { // end ProducerConsumer

37 Παράδειγμα Παρακολουθητή Παραγωγός-Καταναλωτής #define NEXT(x) ((x + 1) % N) monitor ProducerConsumer { item_t buffer[n]; int in=0, out=0, count=0; condition full, empty; void enqueue(item_t item){ item_t dequeue(void){ // end ProducerConsumer

37 Παράδειγμα Παρακολουθητή Παραγωγός-Καταναλωτής #define NEXT(x) ((x + 1) % N) monitor ProducerConsumer { item_t buffer[n]; int in=0, out=0, count=0; condition full, empty; void enqueue(item_t item){ item_t item; if (count == N) full.wait(); buffer[in] = item; in = NEXT(in); if (++count == 1) empty.signal(); // end ProducerConsumer item_t dequeue(void){

37 Παράδειγμα Παρακολουθητή Παραγωγός-Καταναλωτής #define NEXT(x) ((x + 1) % N) monitor ProducerConsumer { item_t buffer[n]; int in=0, out=0, count=0; condition full, empty; void enqueue(item_t item){ item_t item; if (count == N) full.wait(); buffer[in] = item; in = NEXT(in); if (++count == 1) empty.signal(); // end ProducerConsumer item_t dequeue(void){ item_t item; if (count == 0) empty.wait(); item = buffer[out]; out = NEXT(out); if (count-- == N) full.signal(); return item;

38 Παράδειγμα Παρακολουθητή Πρόβλημα των συνδαιτυμόνων φιλοσόφων monitor DiningPhilosophers { enum {T, H, E state[5]; condition cond[n]; void pickup(int i) { void putdown(int i) { state[i] = H; state[i] = T; test(i); test(prev(i)); if (state[i]!= E) test(next(i)); cond[i].wait(); void test(int i){ if (state[i] == H && state[prev(i)]!= E && state[next(i)]!= E){ state[i] = E; cond[i].signal(); // end of DiningPhilosophers

39 Ατομικές Συναλλαγές Atomic Transactions Η έννοια της συναλλαγής (transaction) χρησιμοποιείται στις βάσεις δεδομένων Σύνολο εντολών που υλοποιεί μια λογική λειτουργία Ορίζεται από τον προγραμματιστή Μπορεί να: Επιτύχει και να κατοχυρωθεί (COMMIT) Αποτύχει και να ακυρωθεί (ABORT, ROLLBACK) Μοντέλο μνήμης με συναλλαγές (Transactional Memory)

40 Στρατηγικές συγχρονισμού σε ΛΣ (και όχι μόνο) (Εξέλιξη) Απενεργοποίηση διακοπών Ένα κεντρικό κλείδωμα (BKL)

40 Στρατηγικές συγχρονισμού σε ΛΣ (και όχι μόνο) (Εξέλιξη) Απενεργοποίηση διακοπών Δεν αρκεί για πολυεπεξεργαστικά συστήματα Ένα κεντρικό κλείδωμα (BKL) Δεν έχει καλή κλιμάκωση

40 Στρατηγικές συγχρονισμού σε ΛΣ (και όχι μόνο) (Εξέλιξη) Απενεργοποίηση διακοπών Δεν αρκεί για πολυεπεξεργαστικά συστήματα Ένα κεντρικό κλείδωμα (BKL) Δεν έχει καλή κλιμάκωση Σπάσιμο σε περισσότερα κλειδώματα (fine-grain locking) Διαμοιρασμός των δεδομένων και ανταλλαγή μηνυμάτων (partitioning, message passing)

41 Κεντρικό και πολλαπλά κλειδώματα για κοινούς πόρους Big lock vs fine-grain locking - Θεωρούμε: Διεργασίες ( x) Πόρους (Πx) Δ0 Δ2 Δ1 Π0 Π1. Π3 Π2

41 Κεντρικό και πολλαπλά κλειδώματα για κοινούς πόρους Big lock vs fine-grain locking - Θεωρούμε: Διεργασίες ( x) Πόρους (Πx) - Κεντρικό κλείδωμα (ΚΚ): Όποια διεργασία πάρει το ΚΚ μπορεί να χρησιμοποιήσει όλους τους πόρους Δ0 Δ2 Δ1 KK Π0 Π1. Π3 Π2

41 Κεντρικό και πολλαπλά κλειδώματα για κοινούς πόρους Big lock vs fine-grain locking - Θεωρούμε: Διεργασίες ( x) Πόρους (Πx) - Κεντρικό κλείδωμα (ΚΚ): Όποια διεργασία πάρει το ΚΚ μπορεί να χρησιμοποιήσει όλους τους πόρους Δ0 Δ2 Δ1 - Πολλαπλά κλειδώματα (fine-grain locking) 1 κλείδωμα ανά διαθέσιμο πόρο + Δυνατότητα παραλληλίας Π0 Π1. Π3 Π2

41 Κεντρικό και πολλαπλά κλειδώματα για κοινούς πόρους Big lock vs fine-grain locking - Θεωρούμε: Διεργασίες ( x) Πόρους (Πx) - Κεντρικό κλείδωμα (ΚΚ): Όποια διεργασία πάρει το ΚΚ μπορεί να χρησιμοποιήσει όλους τους πόρους Δ0 Δ2 Δ1 - Πολλαπλά κλειδώματα (fine-grain locking) 1 κλείδωμα ανά διαθέσιμο πόρο + Δυνατότητα παραλληλίας - Κίνδυνος αδιεξόδου (Δ0 έχει Π0 και περιμένει Π3, Δ2 έχει Π3 και περιμένει Π0) Π0 Π1. Π3 Π2

Αναγκαίες συνθήκες για δημιουργία αδιεξόδου Αμοιβαίος αποκλεισμός Ένας τουλάχιστον πόρος να μην υποστηρίζει διαμοιραζόμενο τρόπο λειτουργίας Κράτημα και αναμονή Κατά την απόκτηση πρόσβασης στους πόρους που χρειάζεται οι διεργασίες θα πρέπει να μην απελευθερώνουν πόρους που έχουν δεσμεύσει και να περιμένουν να απελευθερωθούν οι υπόλοιποι Χωρίς Διακοπή Οι πόροι μπορούν να απελευθερωθούν μόνο εθελοντικά από τις διεργασίες που τους έχουν δεσμεύσει Κυκλική Αναμονή P 1 αναμένει πόρο της P 2... P n 1 αναμένει πόρο της P n P n αναμένει πόρο της P 1 42

Γράφος εκχώρησης πόρων 43 Π 1 Π 3 - Πόροι Πx (στιγμιότυπα) - Διεργασίες x - Ακμή αίτησης x Πx - Ακμή ανάθεσης Πx x - Αφορά συγκεκριμένη χρονική στιγμή του συστήματος - Αν δεν υπάρχει κύκλος δεν υπάρχει αδιέξοδο - Αν υπάρχει κύκλος τότε μπορεί να υπάρχει αδιέξοδο 1. 2 3 Π 2 Π 4

Γράφος εκχώρησης πόρων 43 Π 1 Π 3 - Πόροι Πx (στιγμιότυπα) - Διεργασίες x - Ακμή αίτησης x Πx - Ακμή ανάθεσης Πx x - Αφορά συγκεκριμένη χρονική στιγμή του συστήματος - Αν δεν υπάρχει κύκλος δεν υπάρχει αδιέξοδο - Αν υπάρχει κύκλος τότε μπορεί να υπάρχει αδιέξοδο 1. 2 3 Π 2 Π 4

Γράφος εκχώρησης πόρων 43 Π 1 Π 3 - Πόροι Πx (στιγμιότυπα) - Διεργασίες x - Ακμή αίτησης x Πx - Ακμή ανάθεσης Πx x - Αφορά συγκεκριμένη χρονική στιγμή του συστήματος - Αν δεν υπάρχει κύκλος δεν υπάρχει αδιέξοδο - Αν υπάρχει κύκλος τότε μπορεί να υπάρχει αδιέξοδο 1. 2 3 Π 2 Π 4

44 Αποτροπή αδιεξόδων αφετηρία: αναγκαίες συνθήκες Αμοιβαίος αποκλεισμός Χρήση πόρων που μπορούν να διαμοιραστούν (πχ αρχεία για ανάγνωση) Κράτημα και αναμονή & Χωρίς Διακοπή Εναλλακτικά πρωτόκολλα Κυκλική Αναμονή Διάταξη πόρων και πραγματοποίηση αιτήσεων με συγκεκριμένη σειρά

Τέλος 45

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα» του ΕΜΠ έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.