Υλοποίηση Σηματοφόρων

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

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

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

Συγχρονισμός & σηματοφόροι. Προγραμματισμός II 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Σύγχρονη επικοινωνία με ανταλλαγή μηνυμάτων (CSP message passing model) Ταυτόχρονος Προγραμματισμός 1

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

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

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

Ορθότητα λειτουργίας τμημάτων λογισμικού & δομών δεδομένων υπό ταυτόχρονη εκτέλεση

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

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

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

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

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

Νήµατα. Πολύ σηµαντικό

Ορθότητα λειτουργίας τμημάτων λογισμικού & δομών δεδομένων υπό ταυτόχρονη εκτέλεση

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

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

Εργαστήριο 14. Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t)

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

Ουρές Μηνυμάτων (Message Queues in System V) Προγραμματισμός II 1

Σύγχρονη επικοινωνία με ανταλλαγή μηνυμάτων (CSP message passing model) Ταυτόχρονος Προγραμματισμός 1

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

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

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

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

Συστηματικός έλεγχος ορθότητας ταυτόχρονων προγραμμάτων μέσω γράφου καταστάσεων

Προγραμματισμός Ι (ΗΥ120)

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

Εισαγωγή στους Αλγορίθμους Ενότητα 3η

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

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

Εισαγωγή στους Αλγορίθμους

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Γραμμικές Δομές Δεδομένων

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

Εισαγωγικά & Βασικές Έννοιες

Εισαγωγή στον Προγραμματισμό (με. τη C)

ιαφάνειες παρουσίασης #5 (β)

Εργασία 3 Σκελετοί Λύσεων

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Δομές Δεδομένων & Αλγόριθμοι

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Ουρά Προτεραιότητας: Heap

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

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

i : 0<=i<N-1 => data[i] <= data[i+1] 25/10/2009

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

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

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

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Συστηματικός έλεγχος ορθότητας ταυτόχρονων προγραμμάτων μέσω γράφου καταστάσεων

Κατηγορίες Νηµάτων. Νήµατα Επιπέδου Πυρήνα. Νήµατα Επιπέδου Χρήστη. «Νήµατα Επιπέδου Χρήστη» Ε-85: Ειδικά Θέµατα Λογισµικού

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 3: ΑΤΔ Ουρά. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΠΛΗ111. Ανοιξη Μάθηµα 8 ο. Αναζήτηση. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Ανάπτυξη και Σχεδίαση Λογισμικού

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

Μη ανασταλτική/πολυπλεξία Ε/Ε (non-blocking/multiplexed I/O) Προγραμματισμός II 1

Λειτουργικά Συστήματα. Ενότητα # 2: Διεργασίες και Νήματα Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Λειτουργικά Συστήματα. Ενότητα # 2: Διεργασίες και Νήματα Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Συλλογές, Στοίβες και Ουρές

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Ανάπτυξη και Σχεδίαση Λογισμικού

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Κατανεμημένα Συστήματα

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

Διάλεξη 9: Αλγόριθμοι Αμοιβαίου Αποκλεισμού με τη χρήση μεταβλητών Ανάγνωσης/Εγγραφής. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

ιαφάνειες παρουσίασης #4

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Transcript:

Υλοποίηση Σηματοφόρων 1 lalis@inf.uth.gr

Υλοποίηση σε επίπεδο συστήματος Εσωτερική κατάσταση: Ένας ακέραιος για την αποθήκευση της τιμής του σηματοφόρου Μια ουρά αναμονής που τοποθετείται ένα νήμα όταν επιχειρήσει να μειώσει την τιμή του σηματοφόρου ενώ αυτή είναι 0 Υποθέτουμε τις εξής λειτουργίες: ATOMIC_BEG / ATOMIC_END (έλεγχος εναλλαγής) Q_INIT / Q_WAIT / Q_WAKEUP (αρχικοποίηση, αναμονή, αφύπνιση σε ξεχωριστή ουρά αναμονής) H Q_WAIT οδηγεί σε εναλλαγή 2 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου */ QUEUE q; /* ουρά αναμονής */ int qlen; /* # νημάτων που περιμένουν στην q */ gsem; void init(gsem *s, int val) { s->val = val; Q_INIT(&s->q); s->qlen=0; void down(gsem *s) { ATOMIC_BEG if (s->val >= 1) { s->val--; else { s->qlen++; Q_WAIT(&s->q); ATOMIC_END void up(gsem *s) { ATOMIC_BEG if (s->qlen == 0) { s->val++; else { s->qlen--; Q_WAKEUP(&s->q); ATOMIC_END 3 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου και < 0 => #νημάτων σε αναμονή */ QUEUE q; /* ουρά αναμονής */ gsem; void init(gsem *s, int val) { s->val = val; Q_INIT(&s->q); void down(gsem *s) { ATOMIC_BEG s->val--; if (s->val < 0) { Q_WAIT(&s->q); ATOMIC_END void up(gsem *s) { ATOMIC_BEG s->val++; if (s->val <= 0) { Q_WAKEUP(&s->q); ATOMIC_END 4 lalis@inf.uth.gr

Υλοποίηση σε επίπεδο εφαρμογής Δεν υπάρχει έλεγχος της εναλλαγής Τα κρίσιμα τμήματα της υλοποίησης πρέπει να «προστατευτούν» σε επίπεδο εφαρμογής 5 lalis@inf.uth.gr

Υλοποίηση γενικών σηματοφόρων με test-and-set int val για την αποθήκευση της τιμής αυξάνεται / μειώνεται μέσω της up / down int lock για το κλείδωμα του κρίσιμου τμήματος του κώδικα των up / down γίνεται 1 μέσω TAS πριν την είσοδο στο ΚΤ γινεται 0 μετά την έξοδο από το ΚΤ Η αναμονή μέσα στην down είναι ενεργή Το ξεμπλοκάρισμα των νημάτων μέσω up γίνεται με τυχαία επιλογή (δεν υπάρχει ρητή σειρά αναμονής) 6 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου */ int lock; /* αμοιβαίος αποκλεισμός */ gsem; void init(gsem *s, int val) { s->lock = 0; s->val = val; void down(gsem *s) { int done=0; do { while (TAS(&s->lock)) { yield(); if (s->val > 0) { s->val--; done = 1; s->lock = 0; while (!done); void up(gsem *s) { while (TAS(&s->lock)) { yield(); s->val++; s->lock = 0; 7 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου, #νημάτων σε αναμονή */ int lock; /* αμοιβαίος αποκλεισμός */ QUEUE q; /* ουρά αναμονής */ gsem; void init(gsem *s, int val) { s->lock = 0; s->val = val; Q_ΙΝΙΤ(s->q); void down(gsem *s) { while (TAS(&s->lock)) { yield(); s->val--; if (s->val >= 0) { s->lock = 0; else { s->lock = 0; Q_WAIT(s->q); γιατί αυτό είναι λάθος; void up(gsem *s) { while (TAS(&s->lock)) { yield(); s->val++; if (s->val <= 0) { Q_WAKEUP(s->q); s->lock = 0; 8 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου, #νημάτων σε αναμονή */ int lock; /* αμοιβαίος αποκλεισμός */ QUEUE q; /* ουρά αναμονής */ gsem; void init(gsem *s, int val) { s->lock = 0; s->val = val; Q_ΙΝΙΤ(s->q); void down(gsem *s) { while (TAS(&s->lock)) { yield(); s->val--; if (s->val >= 0) { s->lock = 0; else { s->lock = 0; Q_WAIT(s->q); συνθήκη ανταγωνισμού void up(gsem *s) { while (TAS(&s->lock)) { yield(); s->val++; if (s->val <= 0) { Q_WAKEUP(s->q); s->lock = 0; γιατί αυτό είναι λάθος; 9 lalis@inf.uth.gr

Συνθήκη ανταγωνισμού Η μείωση του μετρητή val και η τοποθέτηση του νήματος στην ουρά q δεν γίνονται ατομικά Λόγω εναλλαγής, ο μετρητής val μπορεί να έχει τιμή που δεν αντικατοπτρίζει την εσωτερική κατάσταση της ουράς μπορεί να είναι <0, χωρίς κάποιο νήμα να έχει μπει ακόμα στην ουρά q (χωρίς να έχει καλέσει ακόμα την λειτουργία Q_WAIT) Ένα άλλο νήμα, αφού αυξήσει και ελέγξει τον μετρητή val, μπορεί να καλέσει Q_WAKEUP χωρίς να υπάρχει νήμα εν αναμονή στην ουρά q Το νήμα που (σε δεύτερο χρόνο) θα καλέσει Q_WAIT και θα μπει στην ουρά, θα μείνει μπλοκαρισμένο εκεί 10 lalis@inf.uth.gr

Υλοποίηση γενικών σηματοφόρων με δυαδικούς σηματοφόρους Υποθέτουμε δυαδικούς σηματοφόρους με λειτουργίες BSEM_INIT, BSEM_DOWN, BSEM_UP int val: τιμή του σηματοφόρου, και #νημάτων εν αναμονή στην ουρά q BSEM q: ουρά αναμονής BSEM mtx: αμοιβαίος αποκλεισμός για val 11 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου, #νημάτων σε αναμονή */ BSEM mtx,q; /* προστασία πρόσβασης, ουρά */ gsem; void init(gsem *s, int val) { s->val = val; BSEM_INIT(s->mtx,1); BSEM_INIT(s->q,0); void down(gsem *s) { s->val--; if (s->val >= 0) { BSEM_UP(s->mtx); else { BSEM_UP(s->mtx); BSEM_DOWN(s->q); γιατί αυτό είναι λάθος; void up(gsem *s) { s->val++; if (s->val <= 0) { BSEM_UP(s->q); BSEM_UP(s->mtx); 12 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου, #νημάτων σε αναμονή */ BSEM mtx,q; /* προστασία πρόσβασης, ουρά */ gsem; void init(gsem *s, int val) { s->val = val; BSEM_INIT(s->mtx,1); BSEM_INIT(s->q,0); void down(gsem *s) { s->val--; if (s->val >= 0) { BSEM_UP(s->mtx); else { BSEM_UP(s->mtx); BSEM_DOWN(s->q); γιατί αυτό είναι λάθος; void up(gsem *s) { s->val++; if (s->val <= 0) { BSEM_UP(s->q); BSEM_UP(s->mtx); συνθήκη ανταγωνισμού 13 lalis@inf.uth.gr

Συνθήκη ανταγωνισμού Η μείωση του μετρητή val και η μείωση του δυαδικού σηματοφόρου q δεν γίνονται ατομικά O μετρητής val μπορεί να έχει τιμή που δεν αντικατοπτρίζει την εσωτερική κατάσταση του σηματοφόρου μπορεί να είναι <0, χωρίς κάποιο νήμα να έχει μπλοκάρει ακόμα στον q (χωρίς να έχει καλέσει ακόμα την λειτουργία BSEM_DOWN) Ένα άλλο νήμα, αφού ελέγξει και μειώσει τον μετρητή val, μπορεί να καλέσει BSEM_UP χωρίς να υπάρχει κάποιο νήμα μπλοκαρισμένο στον q Αν αυτό γίνει παραπάνω από 1 συνεχόμενες φορές, θα προκύψουν χαμένες κλήσεις της BSME_UP και λανθασμένο μπλοκάρισμα νημάτων 14 lalis@inf.uth.gr

typedef struct gs { int val; BSEM mtx,q,q2; /*, αμοιβαίος αποκλεισμός down */ gsem; void init(gsem *s, int val) { s->val = val; BSEM_INIT(s->mtx,1); BSEM_INIT(s->q,0); BSEM_INIT(s->q2,1); void down(gsem *s) { BSEM_DOWN(s->q2); s->val--; if (s->val >= 0) { BSEM_UP(s->mtx); else { BSEM_UP(s->mtx); BSEM_DOWN(s->q); BSEM_UP(s->q2); void up(gsem *s) { s->val++; if (s->val <= 0) { BSEM_UP(s->q); Προγραμματισμός ΙΙΙ 15 lalis@inf.uth.gr

typedef struct gs { int val; BSEM mtx,q,q2; /*, αμοιβαίος αποκλεισμός down */ gsem; void init(gsem *s, int val) { s->val = val; BSEM_INIT(s->mtx,1); BSEM_INIT(s->q,0); BSEM_INIT(s->q2,1); void down(gsem *s) { s->val--; if (s->val >= 0) { BSEM_UP(s->mtx); else { BSEM_DOWN(s->q2); BSEM_UP(s->mtx); BSEM_DOWN(s->q); BSEM_UP(s->q2); void up(gsem *s) { s->val++; if (s->val <= 0) { BSEM_UP(s->q); γιατί αυτό είναι λάθος; Προγραμματισμός ΙΙΙ 16 lalis@inf.uth.gr

Ένα (λίγο) διαφορετικό σκεπτικό Η αναμονή των νημάτων στον σηματοφόρο q σε περίπτωση που ο μετρητής val είναι >=0 μεταφέρεται έξω από το κρίσιμο τμήμα που προστατεύεται μέσω του σηματοφόρου mtx Από τη στιγμή που ένα νήμα «περάσει» από τον σηματοφόρο q, δεν υπάρχει περίπτωση μπλοκαρίσματος μέσα στο κρίσιμο τμήμα που προστατεύεται από τον mtx Αρμοδιότητα αφύπνισης έχουν περνάει πλέον και τα νήματα που μειώνουν τον σηματοφόρο 17 lalis@inf.uth.gr

typedef struct gs { int val; BSEM mtx,q; gsem; Λύση του Barz void init(qsem *s, int val) { s->val = val; BSEM_INIT(s->mtx,1); if (val > 0) {BSEM_INIT(s->q,1); else { BSEM_INIT(s->q,0); void down(qsem *s) { BSEM_DOWN(s->q); s->val--; if (s->val > 0) { BSEM_UP(s->q); BSEM_UP(s->mtx); void up(qsem *s) { s->val++; if (s->val == 1) { BSEM_UP(s->q); BSEM_UP(s->mtx); Προγραμματισμός ΙΙΙ 18 lalis@inf.uth.gr

Υλοποίηση γενικών σηματοφόρων σε επίπεδο εφαρμογής με γενικούς σηματοφόρους σε επίπεδο συστήματος Το κόστος των κλήσεων συστήματος δεν είναι αμελητέο, ιδίως αν αυτές γίνονται συχνά Αν η πιθανότητα ανταγωνισμού των νημάτων στο ΚΤ είναι μικρή, οι περισσότερες κλήσεις για αυξομείωση του σηματοφόρου που χρησιμοποιείται για την προστασία του ΚΤ γίνονται «άσκοπα» Ιδέα: Μεταφορά προκαταρκτικού ελέγχου σε επίπεδο εφαρμογής, και κλήση των (ακριβών) λειτουργιών του συστήματος μόνο αν πραγματικά απαιτείται μπλοκάρισμα και ξεμπλοκάρισμα των νημάτων 19 lalis@inf.uth.gr

typedef struct { int val; /* τιμή σηματοφόρου */ int lock; /* αμοιβαίος αποκλεισμός */ GSEM q; /* γενικός σηματοφόρος συστήματος */ gsem; void init(gsem *s, int val) { s->lock = 0; s->val = val; GSΕΜ_ΙΝΙΤ(s->q,0); void down(gsem *s) { while (TAS(&s->lock)) { yield(); s->val--; if (s->val >= 0) { s->lock = 0; else { s->lock = 0; GSEM_DOWN(s->q); γιατί εδώ δεν υπάρχει συνθήκη ανταγωνισμού void up(gsem *s) { while (TAS(&s->lock)) { yield(); s->val++; if (s->val <= 0) { GSEM_UP(s->q); s->lock = 0; 20 lalis@inf.uth.gr