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

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

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

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

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

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

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

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

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

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

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

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

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

Διάλεξη 8: Πρόβλημα Αμοιβαίου Αποκλεισμού. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΛΥΜΕΝΑ ΠΡΟΒΛΗΜΑΤΑ. Γράψτε τις επόμενες διαδικασίες σε όποια γλώσσα προγραμματισμού προτιμάτε:

Κεφάλαιο 3: Λειτουργικά Συστήµατα

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

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

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

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

Οργάνωση επεξεργαστή (2 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

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

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

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

Ε-85: Ειδικά Θέµατα Λογισµικού

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

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

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

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

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

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

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

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

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

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

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

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Οργάνωση Υπολογιστών

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

Βασικές Δομές μοντέλων Petri Nets. C.A. Petri

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

Ανάλυση Επιδόσεων Συστημάτων Πραγματικού Χρόνου

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

Υ- 07 Παράλληλα Συστήματα Συνέπεια και συνοχή μνήμης

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

Άρα, Τ ser = (A 0 +B 0 +B 0 +A 0 ) επίπεδο 0 + (A 1 +B 1 +A 1 ) επίπεδο 1 + +(B 5 ) επίπεδο 5 = 25[χρονικές µονάδες]

Λύσεις για τις ασκήσεις του lab5

ΤΜΗΜΑ ΜΗΥΤΔ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ (ΗΥ222) ΔΙΔΑΣΚΩΝ: ΧΡΗΣΤΟΣ Δ. ΑΝΤΩΝΟΠΟΥΛΟΣ Τελική Εξέταση Σεπτεμβρίου 2009, Χρόνος: 2:30

Κεφάλαιο 4 Διεργασίες Β Τάξη ΕΠΑΛ

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

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

Πληροφορική Ι. Μάθημα 6 ο Εκτέλεση πράξεων, Αρχιτεκτονική Η/Υ. Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας

3.1 Λειτουργικό Σύστηµα. Λειτουργικό Σύστηµα (2) ΚΕΦΑΛΑΙΟ 3: Λειτουργικά Συστήµατα. Ο υπολογιστής σαν σκέτο hardware έχει περιορισµένη χρησιµότητα

ΙΔΕΟΚΑΤΑΣΚΕΥΕΣ: ΣΚΕΦΤΟΜΑΙ ΚΑΙ ΓΡΑΦΩ

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

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

Γεννηθήκαμε και υπήρξαμε μωρά. Κλαίγαμε, τρώγαμε, γελάγαμε, κοιμόμασταν, ξυπνάγαμε, λερωνόμασταν.

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

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

Κεφάλαιο 4 Σύνδεση Μικροεπεξεργαστών και Μικροελεγκτών ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

Θέματα Προγραμματισμού Η/Υ

ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

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

Λειτουργικά συστήματα πραγματικού χρόνου

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

Το βιβλίο της Μ. Autism Resource CD v Resource Code RC115

Αδιέξοδα (Deadlocks)

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

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

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

Μάθημα 3.8 Τεχνικές μεταφοράς δεδομένων Λειτουργία τακτικής σάρωσης (Polling) Λειτουργία Διακοπών DMA (Direct Memory Access)

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

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA

Προγραμματισμός Ι (HY120)

Unity Editor #02 Κεντρικό Μενού: File, Build Settings και Build & Run

ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

Διάλεξη 12 Καθυστερήσεις (Stalls) Εκκενώσεις Εντολών (Flushing)

ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Πώς γίνεται το debug? Το debug γίνεται με δύο τρόπους, ως επί το πλείστον. Τουλάχιστον, εγώ δύο έμαθα, και αυτούς αναφέρω.

Εικονική Μνήμη (Virtual Μemory)

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

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

SMPcache. Ένα εργαλείο για προσομοίωση-οπτικοποίηση κρυφής μνήμης (Cache)

Transcript:

Λειτουργικά Συστήματα (ΗΥ222) Ταυτοχρονισμός, Συγχρονισμός

Πολλαπλές Διεργασίες/Νήματα σε 1 Κοινωνία: Προβλήματα; «Κοινωνικές Γιάννης διεργασίες/νήματα»: Διαβάζουν/γράφουν στον ίδιο χώρο. Αποτέλεσμα; Πιθανότατα χάος Πότε να νιώσω ασφάλεια; Απομονωμένες διεργασίες/νήματα Σπάνιο Αν μόνο διαβάζουν; Αναφορά Project ΛΣ 2 Μαρία

Η Πτώχευση της Τράπεζας Υπόλοιπο λογαριασμού: 5000.00 3 balance(5000) = account balance Χρήστος Ελένη Τράπεζα Ανάληψη 1000 balance(4000) = balance-withdrawal balance(5000) = account balance Ανάληψη 2000 balance(3000) = balance-withdrawal account balance(3000) = balance account balance(4000) = balance Υπόλοιπο Λογαριασμού : 4000 ~@#$&^@!#

Ο Τρελός Μετρητής (1/2) Αρχικά: i = 0; j τοπική μεταβλητή P1, P2: for (j = 0; j<500; j++) i++; i++: read (&i) -> reg inc(reg) write reg -> (&i) 4 Αποτέλεσμα; Γιατί; Μα αφού εγώ εκτελώ μια απλή εντολή!

i++: Ο Τρελός Μετρητής (2/2) read (&i) -> reg inc(reg) write reg -> (&i) P1 read (&i) (5) -> reg inc(reg) write reg -> (&i) (6) P2 read (&i) (6) -> reg inc (reg) write reg-> (&i) (7) 5 read (&i) (5) -> reg inc(reg) write reg -> (&i) (6) read (&i) (5) -> reg inc(reg) write reg-> (&i) (6) Πρόβλημα συγχρονισμού (race condition) Δύσκολο να βρεθεί Άλλοτε εμφανίζεται, άλλοτε όχι

Λύσεις; 6 Αδιαφορούμε Απλό Λίγες οι περιπτώσεις που δε μας ενδιαφέρει η ακριβής τιμή. Δουλεύουμε σε αντίγραφα. Απλό Όταν είναι δυνατό Λύνουμε το πρόβλημα! Και ποιο είναι το πρόβλημα; «Κακές» εναλλαγές διεργασιών

Ατομικότητα 7 Κάνε πολλές εντολές να εκτελούνται σαν μία! Μονάδα ατομικότητας: Οι εντολές που πρέπει να εκτελεστούν μαζί. Καλλιτεχνικό ψευδώνυμο: Κρίσιμη περιοχή. Αν δύο νήματα επιχειρήσουν να εκτελέσουν ταυτόχρονα κώδικα στην κρίσιμη περιοχή, το ένα περιμένει μέχρι να βγει το άλλο P1 read (&i) (5) -> reg inc(reg) write reg -> (&i) (6) P2 read (&i) (6) -> reg inc (reg) write reg-> (&i) (7)

Αλλά ΠΩΣ; (Μονοεπεξεργαστικά Συστήματα) 8 Μονοεπεξεργαστικά συστήματα: Αρκεί να μη διακοπεί το νήμα όταν βρίσκεται στην κρίσιμη περιοχή Έλεγχος από το χρονοδρομολογητή του λειτουργικού while(1) { Σταμάτησε το νήμα που εκτελείται Αν pc εκτός κρίσιμης περιοχής { Σώσε την κατάσταση του προηγούμενου νήματος Διάλεξε νέο νήμα Φόρτωσε την κατάσταση του νέου νήματος Ξεκίνησε το νέο νήμα Δουλεύει; Τι απαιτεί;

Αλλά ΠΩΣ; 9 Μονοεπεξεργαστικά συστήματα: Σταμάτησε τις διακοπές από το ΛΣ disable_interrupts() i = i + 1 enable_interrupts() Απλό Καλό; Τι δουλειά κάνουν οι διακοπές; Αν πέσει σε άπειρο loop; Αν ξεχάσει ο προγραμματιστής να ενεργοποιήσει τις διακοπές;

Αλλά ΠΩΣ; (Πολυεπεξεργαστικά Συστήματα) 10 Δουλεύουν οι προηγούμενες λύσεις; Πρέπει να εμποδιστούν πολλαπλά νήματα (ίσως σε διαφορετικούς επεξεργαστές) να εκτελέσουν ταυτόχρονα κώδικα στην κρίσιμη περιοχή Ρίξε το μπαλάκι στον κατασκευαστή Να μου φτιάξει ατομική εντολή που να αυξάνει τον counter Και αν θέλεις να αλλάξεις μια εγγραφή σε βάση δεδομένων; Βάλε πορτιέρη (lock): Μόνο ένα νήμα περνάει. Τα υπόλοιπα «τρώνε πόρτα» έως ότου βγει lock unlock

Πώς το χρησιμοποιώ; 11 Δύο εντολές πάρε(lock) άφησε(lock) πάρε (lock) Προστατευμένος κώδικας άφησε(lock) Αμοιβαία αποκλειόμενη πρόσβαση (mutual exclusion) Για τους φίλους mutexes Κανόνες: Προστάτευσε κάθε κοινή μεταβλητή με lock Κάθε φορά που θα αγγίξεις κοινή μεταβλητή πάρε το lock πριν την αγγίξεις Αν θέλεις να προσπελάσεις ατομικά πολλές μεταβλητές, πάρε όλα τα locks πριν αρχίσεις και μην τα αφήσεις πριν τελειώσεις

Πώς τα Φτιάχνω; (Μονοεπεξεργαστικό Σύστημα, Σκηνή 1) 12 Απλό; πάρε (lock) { Όσο (lock == ΠΙΑΣΜΕΝΟ) ; lock = ΠΙΑΣΜΕΝΟ; άφησε (lock) { lock = ΕΛΕΥΘΕΡΟ; Δουλεύει;

Πώς τα Φτιάχνω; (Μονοεπεξεργαστικό Σύστημα, Σκηνή 2) 13 Τα μεγάλα όπλα: Απαγόρευση διακοπής πάρε(lock) { απενεργοποίησε_διακοπή(); όσο (lock == ΠΙΑΣΜΕΝΟ); lock = ΠΙΑΣΜΕΝΟ; ενεργοποίησε_διακοπή(); άφησε(lock) { lock = ΕΛΕΥΘΕΡΟ; Δουλεύει; Κι αν το lock βρεθεί όντως πιασμένο;

Πώς τα Φτιάχνω; (Μονοεπεξεργαστικό Σύστημα, Σκηνή 3, Τελική!) πάρε(lock) { δικό_μου = ΟΧΙ; Όσο(!δικό_μου){ απενεργοποίησε_διακοπή(); Αν(lock == ΕΛΕΥΘΕΡΟ) { δικό_μου = ΝΑΙ; lock = ΠΙΑΣΜΕΝΟ; ενεργοποίησε_διακοπή(); 14 άφησε(lock) { lock = ΕΛΕΥΘΕΡΟ; Δουλεύει; Κανένα πρόβλημα (επίδοσης);

Και αν δεν Απενεργοποιούνται οι Διακοπές; (Αλγόριθμος Φούρναρη) 15 Κάνε ότι γίνεται στην τράπεζα Πάρε χαρτάκι με αριθμό Περίμενε έως ότου εξυπηρετηθούν όλοι οι προηγούμενοι. Κανένα πρόβλημα; Μπορούν 2 να πάρουν το ίδιο εισιτήριο; Στην τράπεζα όχι Στον υπολογιστή; Χρησιμοποίησε και κάτι άλλο για να σπάσεις τις ισοπαλίες (π.χ. ποιος έχει το μικρότερο process ID)

Αλγόριθμος Φούρναρη 16 Φάση 1 Κοίταξε όλα τα νούμερα που κυκλοφορούν. Βρες το μεγαλύτερο. Πρόσθεσε 1. Αυτό είναι το νούμερό σου. Φάση 2 Περίμενε έως ότου το δικό σου να είναι το χαμηλότερο νούμερο Αν βρεις κι άλλο ίδιο νούμερο, κοίτα τον αριθμό ταυτότητας ;-) Κερδίζει αυτός που έχει το μικρότερο (ο πιο ηλικιωμένος)

Και σε Πολυεπεξεργαστικά Συστήματα; 17 Απενεργοποίηση διακοπής σε όλους τους επεξεργαστές: Δύσκολο Δεν επιτρέπεται Και τι γίνεται με αυτούς που τρέχουν σε διαφορετικούς επεξεργαστές; Ρίξε το μπαλάκι στον κατασκευαστή Ειδικές απλές, ατομικές εντολές π.χ. Διάβασμα και εγγραφή σε μία κίνηση atomic_swap (mem, reg) Άλλαξε σε μία κίνηση τα περιεχόμενα μιας θέσης μνήμης με αυτά ενός καταχωρητή

Πώς το Φτιάχνω; (ξανά ) 18 πάρε(lock) { δικο_μου = ΠΙΑΣΜΕΝΟ; Όσο (δικό_μου == ΠΙΑΣΜΕΝΟ) atomic_swap (δικο_μου, lock); άφησε(lock) { lock = ΕΛΕΥΘΕΡΟ; Δουλεύει; Καλλιτεχνικό ψευδώνυμο: spin lock (ενεργής αναμονής), γνωστό και ως test and set lock Είναι καλό (αποδοτικό);

Ενεργή Αναμονή ή Εθελοντική Διακοπή; 19 Μειονεκτήματα; Ενεργής αναμονής Εθελοντικής διακοπής Πλεονεκτήματα; Ενεργής αναμονής Εθελοντικής διακοπής Και τι είναι το καλύτερο; Θα απελευθερωθεί το lock γρήγορα; Ναι: Ενεργή αναμονή Όχι: Εθελοντική διακοπή Και που να ξέρω; Ενεργή αναμονή για 2 φορές το κόστος της εθελοντικής διακοπής Μετά διακοπή Φράζει το κόστος σε 2 φορές το πολύ από το βέλτιστο Εφαρμόζεται και στη ζωή σας

Απαιτήσεις!!! 20 Απαιτήσεις Αμοιβαίος αποκλεισμός Δηλαδή να δουλεύει Λογικό Πρόοδος Δε θα πρέπει να σταματούν όλοι. Κάποιος θα πρέπει να προχωράει. Δε θα πρέπει να επιτρέπουμε σε αυτούς που δεν «παίζουν» να μας χαλάνε το «παιχνίδι» Μη απεριόριστη αναμονή Ε, δε θα είμαστε εδώ και για πάντα Ναι, τίποτα άλλο; Ε, καλό θα ήταν Δικαιοσύνη Αποδοτικότητα (μην πετάξεις τίποτα ) Απλότητα (τώρα μάλιστα )

Τρώγοντας Έρχεται η Όρεξη Λίγο Αποδοτικότερα Spin Locks 21 πάρε(lock) { δικό_μου = ΠΙΑΣΜΕΝΟ; Όσο (δικό_μου == ΠΙΑΣΜΕΝΟ) atomic_swap (δικό_μου, lock); άφησε(lock) { lock = ΕΛΕΥΘΕΡΟ; Γνωστό και ως test and test and set lock Είναι καλό (αποδοτικό); To lock, πού αποθηκεύεται; Ικανοποιεί τις απαιτήσεις; πάρε(lock) { δικό_μου = ΠΙΑΣΜΕΝΟ; όσο (δικό_μου == ΠΙΑΣΜΕΝΟ) { όσο (lock == ΠΙΑΣΜΕΝΟ); atomic_swap (δικό_μου,lock); άφησε(lock) { lock = ΕΛΕΥΘΕΡΟ;

Κάτι Πιο Ντετερμινιστικό πάρε(lock) { περιμένω[i] = ΝΑΙ; δικό_μου = ΠΙΑΣΜΕΝΟ; όσο (περιμένω[i] == NAI && δικό_μου == ΠΙΑΣΜΕΝΟ) { όσο (περιμένω[i] == ΝΑΙ && lock == ΠΙΑΣΜΕΝΟ); atomic_swap (δικό_μου, lock); περιμένω [i] = ΟΧΙ; 22 άφησε(lock) { κάνε { j = (i+1)%n όσο (j!= i && περιμένω[i] == ΟΧΙ); Αν (j == i) lock = ΕΛΕΥΘΕΡO; διαφορετικά περιμένω[i] = ΟΧΙ;

Δύσκολο Είναι Απλούστερες Ιδέες; - Σηματοφόροι 23 Τι θέλουμε; Κάτι απλούστερο από τα mutexes (locks). Δε θέλω να ξέρω πώς να το φτιάξω! Το θέλω έτοιμο! Αλλά όχι τόσο απλό που να μην είναι αποδοτικό Τι είναι; Μετρητής >=0, τον οποίο μπορείς να αυξήσεις ή να μειώσεις ατομικά. Αν κάποιος πάει να τον κάνει <0, μπλοκάρει Λειτουργίες; p()/down()/wait() (proberen) Μείωσε κατά 1 το μετρητή. Αν τον βρεις 0, κοιμήσου (μπλόκαρε) αντί να τον μειώσεις. v()/up()/signal() (verhogen) Αύξησε κατά 1 το μετρητή. Αν πριν ήταν 0, ξύπνα τυχόν υπναράδες init() Kάπως πρέπει να ξεκινήσει κανείς στη ζωή Υλοποίηση p (mutex) Μετρητής Προστατευμένος κώδικας Ουρά αναμονής v (mutex)

Πώς να Καταστρέψετε το Πρόγραμμά σας με Σηματοφόρους v (mutex) Προστατευμένος κώδικας p (mutex) Προστατευμένος κώδικας v (mutex) p (mutex) Προστατευμένος κώδικας p (mutex) Προστατευμένος κώδικας p (mutex) Προστατευμένος κώδικας 24 Κάτι σε λίγο υψηλότερο επίπεδο;

Monitors (Ελεγκτές) 25 Ρίξε το μπαλάκι Αυτή τη φορά στο μεταγλωττιστή Τι είναι; Κατασκευή σε υψηλού επιπέδου γλώσσα Κάτι σαν τις κλάσεις στις αντικειμενοστρεφείς γλώσσες Τι περιέχει; Δεδομένα, συναρτήσεις που μπορούν να τα μεταβάλλουν Όλα προστατευμένα από ένα (υποννοούμενο) lock. monitor Queue { int head, tail; // Διαμοιραζόμενα // δεδομένα void enq(val) { // Βάλε το val στην int deq() { // ουρά // Βγάλε κάτι από // την ουρά

Ελεγκτές: Όλα ή Τίποτα; Μεταβλητές Συνθήκης 26 Μόνο μια διεργασία στο monitor Και αν θέλουμε πιο «λεπτό» συγχρονισμό; Μεταβλητές συνθήκης (condition variables) wait (condition) Άφησε το lock του monitor, κοιμήσου, ξαναπάρε το lock του monitor όταν ξυπνήσεις. signal (condition) Ξύπνησε μία υπναρού (αν υπάρχει) Και ποιά θα συνεχίσει; Αυτή που έτρεχε ή αυτή που ξύπνησε; Hoare: Αυτή που ξύπνησε MESA: Αυτή που έτρεχε

Διάσημα Προβλήματα: Πεπερασμένος Buffer 27 n θέσεις στον buffer Ανεξάρτητοι παραγωγοί καταναλωτές Παραγωγοί: Περιμένουν αν ο buffer γεμίσει Καταναλωτές: Περιμένουν αν ο buffer είναι άδειος empty = n; full = 0; ΠΑΡΑΓΩΓΟΙ do { φτιάξε στοιχείο p(empty) p(mutex) βάλε στοιχείο στον buffer v(mutex) v(full) while(1) ΚΑΤΑΝΑΛΩΤΕΣ do { p(full) p(mutex) βγάλε στοιχείο από τον buffer v(mutex) v(empty) κατανάλωσε στοιχείο while(1)

Διάσημα Προβλήματα: Εγγραφείς / Αναγνώστες 28 Κοινά δεδομένα Προσπελαύνονται από αναγνώστες και εγγραφείς Πολλοί αναγνώστες: ΟΚ Πολλοί αναγνώστες και εγγραφέας: Πρόβλημα Πολλοί εγγραφείς: Πρόβλημα Ένας εγγραφέας: OK Ποιος έχει προτεραιότητα; Εγγραφείς; Αναγνώστες;

Διάσημα Προβλήματα: Εγγραφείς / Αναγνώστες (Λύση) mutex=1; wrt_mutex=1; int readcount = 0; 29 ΕΓΓΡΑΦΕΙΣ ΑΝΑΓΝΩΣΤΕΣ p (wrt_mutex) Γράψε v (wrt_mutex) p (mutex) readcount++ if (readcount == 1) p (wrt_mutex) v (mutex) Διάβασε p (mutex) readcount-- if (readcount == 0) v (wrt_mutex) v (mutex)

Διάσημα Προβλήματα: Συνδαιτυμόνες Φιλόσοφοι 30 Ν κινέζοι φιλόσοφοι Φιλοσοφούν Πεινάνε Τρώνε Τους αρέσει (φυσικά) το ρύζι Το τρώνε (φυσικά) με ξυλάκια Ξαναφιλοσοφούν Σκυλίσια ζωή Μπορούν να φάνε όλοι μαζί;

Διάσημα Προβλήματα: Συνδαιτυμόνες Φιλόσοφοι (Λύση;) 31 chopstick_mutex[n] = {1,1,1,1 ΦΙΛΟΣΟΦΟΣ i do { Σκέψου p(chopstick[i]) p(chopstick[(i+1)%n]) Φάε v(chopstick[(i+1)%n]) v(chopstick[i] Σωστό; Παίζουμε; Καθήστε όλοι σε έναν κύκλο. Πιάστε όλοι πρώτα το δεξί και μετά το αριστερό chopstick! Μην κοιτάς το chopstick ΜΟΥ. Ούτε να το σκέφτεσαι! Oops αδιέξοδο (deadlock)!