ΛΕΙΣΟΤΡΓΙΚΆ ΤΣΉΜΑΣΑ 4 θ Διάλεξθ θμαφόροι
Αντιμετϊπιςθ Προβλθμάτων Σαυτοχρονιςμοφ Σο πρϊτο μεγάλο βιμα για τθν αντιμετϊπιςθ των προβλθμάτων των ταυτόχρονων διεργαςιϊν ςθμειϊκθκε το 1965, ςτθ διατριβι του Dijkstra Σον απαςχόλθςε: Η ςχεδίαςθ του λειτουργικοφ ςυςτιματοσ ωσ ςυλλογι ςυνεργαηόμενων ςειριακϊν διεργαςιϊν Η ανάπτυξθ αποδοτικϊν και αξιόπιςτων μθχανιςμϊν για τθν υποςτιριξθ τθσ ςυνεργαςίασ Για να απλοποιθκοφν οι διαδικαςίεσ που φροντίηουν τισ ταυτόχρονεσ διεργαςίεσ, ο Dijkstra ειςιγαγε τθν ζννοια των σηματοφόρων
Θεμελιϊδθσ Κανόνασ Δφο ι περιςςότερεσ διεργαςίεσ μποροφν να ςυνεργάηονται μζςω απλϊν ςθμάτων, τζτοιασ μορφισ ϊςτε μία διεργαςία να μπορεί να εξαναγκαςτεί να ςταματιςει ςε ςυγκεκριμζνθ κζςθ, μζχρι να λάβει ςυγκεκριμζνο ςιμα Οποιαδιποτε απαίτθςθ πολφπλοκου ςυντονιςμοφ μπορεί να ικανοποιθκεί από τθν κατάλλθλθ δομι ςθμάτων
θμαφόροι (1/5) Σθμαφόροι ι ςθμαφόροι μζτρθςθσ ι γενικοί ςθμαφόροι Είναι ζνασ μθχανιςμόσ ςυγχρονιςμοφ διεργαςιϊν για τθν αποκλειςτικι χριςθ κοινϊν πόρων όπωσ μνιμθσ ι αρχείων Είναι ειδικοφ τφπου ακζραιεσ μεταβλθτζσ με τισ οποίεσ ςυνδζονται κάποιεσ ατομικζσ λειτουργίεσ (δθλαδι όλεσ οι εντολζσ που αντιςτοιχοφν ςτθ λειτουργία εκτελοφνται αδιάςπαςτα από τον πυρινα)
θμαφόροι (2/5) Για τθ μετάδοςθ ςιματοσ διαμζςου του ςθμαφόρου s, μια διεργαςία εκτελεί τθν πρωτογενι λειτουργία semsignal (s) Για τθν παραλαβι ςιματοσ διαμζςου του ςθμαφόρου s, μια διεργαςία εκτελεί τθν πρωτογενι λειτουργία semwait (s) Αν το αντίςτοιχο ςιμα δεν ζχει μεταδοκεί ακόμα, θ διεργαςία αναςτζλλεται μζχρι να λάβει χϊρα θ μετάδοςθ
θμαφόροι (3/5) Οι ατομικζσ λειτουργίεσ των ςθμαφόρων είναι μόνο τρεισ: αρχικοποίθςθ, μείωςθ και αφξθςθ υγκεκριμζνα: Ο ςθμαφόροσ μπορεί να αρχικοποιθκεί, λαμβάνοντασ μθ αρνθτικι ακζραια τιμι Η λειτουργία semwait μειϊνει τθν τιμι του ςθμαφόρου Αν θ τιμι του ςθμαφόρου γίνει αρνθτικι, τότε μπλοκάρεται θ διεργαςία που εκτελεί τθ semwait Διαφορετικά, θ διεργαςία ςυνεχίηει τθν εκτζλεςι τθσ Η λειτουργία semsignal αυξάνει τθν τιμι του ςθμαφόρου Αν θ τιμι που προκφπτει είναι μικρότερθ ι ίςθ με το μθδζν, τότε ξεμπλοκάρεται μια διεργαςία (αν υπάρχει) που ζχει μπλοκαριςτεί από μία λειτουργία semwait
θμαφόροι (4/5) Εξιγθςθ λειτουργιϊν: τθν αρχι, ο ςθμαφόροσ ζχει μθδενικι ι κετικι τιμι Αν θ τιμι είναι κετικι, τότε θ τιμι αυτι ιςοφται με το πλικοσ των διεργαςιϊν που μποροφν να εκδϊςουν αίτθςθ αναμονισ και αμζςωσ να ςυνεχίςουν να εκτελοφνται Αν θ τιμι είναι μθδενικι, είτε εξαιτίασ τθσ αρχικοποίθςθσ είτε επειδι το πλικοσ των διεργαςιϊν που ζχει εκδϊςει αίτθςθ αναμονισ είναι ίςο με τθν αρχικι τιμι του ςθμαφόρου, τότε μπλοκάρεται θ επόμενθ διεργαςία που εκδίδει αίτθςθ αναμονισ και θ τιμι του ςθμαφόρου γίνεται αρνθτικι Η αρνθτικι τιμι ιςοφται με το πλικοσ των διεργαςιϊν που αναμζνουν να ξεμπλοκαριςτοφν
θμαφόροι (5/5) Αναλυτικά: Όταν κζλουμε να ειςζλκουμε ςτο κρίςιμο τμιμα μιασ διεργαςίασ (δθλαδι τθν πρόςβαςθ ςτο κοινό πόρο), τότε εκτελείται μια ενζργεια semwait ςτον αντίςτοιχο ςθμαφόρο Αν ο ςθμαφόροσ ζχει τιμι 0 τότε θ εντολι μπαίνει ςε κατάςταςθ blockwait Αν ο ςθμαφόροσ ζχει τιμι μεγαλφτερθ από 0 τότε ειςζρχεται ςτο κρίςιμο τμιμα αφοφ μειϊςει τθν τιμι κατά 1 Μόλισ βγει από το κρίςιμο τμιμα, τότε εκτελεί μια ενζργεια semsignal και ςτθν περίπτωςθ που περιμζνει μια διεργαςία ςε block-wait ενεργοποιείται και ο ςθμαφόροσ παραμζνει ςτο 0, ενϊ αν δεν περιμζνει μια διεργαςία τότε θ τρζχουςα τιμι αυξάνεται κατά 1
Δυαδικόσ θμαφόροσ (1/2) Είναι μια περιοριςμζνθ ζκδοςθ, θ οποία μπορεί να πάρει μόνο τισ τιμζσ 0 και 1 Προςδιορίηεται από τισ ακόλουκεσ λειτουργίεσ: Ο δυαδικόσ ςθμαφόροσ μπορεί να αρχικοποιθκεί λαμβάνοντασ είτε τθν τιμι 0 είτε τθν τιμι 1 Η λειτουργία semwaitb ελζγχει τθν τιμι του ςθμαφόρου Αν θ τιμι είναι ίςθ με μθδζν, τότε μπλοκάρεται θ διεργαςία που εκτελεί τθ semwaitb Αν θ τιμι είναι ίςθ με ζνα, τότε θ τιμι τροποποιείται και λαμβάνει τθν τιμι μθδζν και θ διεργαςία ςυνεχίηει να εκτελείται Η λειτουργία semsignalb κάνει ζλεγχο για να διαπιςτϊςει αν υπάρχουν διεργαςίεσ που είναι μπλοκαριςμζνεσ ςτο ςθμαφόρο αυτό(θ τιμι του ςθμαφόρου ιςοφται με μθδζν) Αν ιςχφει αυτό, τότε μια διεργαςία που ζχει μπλοκαριςτεί από μία λειτουργία semwaitb ξεμπλοκάρεται Αν δεν υπάρχουν μπλοκαριςμζνεσ διεργαςίεσ, τότε θ τιμι του ςθμαφόρου λαμβάνει τθν τιμι ζνα
Δυαδικόσ θμαφόροσ (2/2) Κατά κανόνα: Είναι ευκολότερθ θ υλοποίθςθ του δυαδικοφ ςθμαφόρου Μπορεί να αποδειχκεί πωσ ζχει τθν ίδια εκφραςτικι δφναμθ με το γενικό ςθμαφόρο Για να ξεχωρίηουν οι δφο τφποι ςθμαφόρων, ο μθ δυαδικόσ ςθμαφόροσ ςυχνά αναφζρεται είτε ωσ ςθμαφόροσ μζτρθςθσ είτε ωσ γενικόσ ςθμαφόροσ
Κλειδαριά Αμοιβαίου Αποκλειςμοφ (1/2) Κλειδαριά Αμοιβαίου Αποκλειςμοφ (mutual exclusion lock, mutex): Η mutex αποτελεί προγραμματιςτικι ςθμαία* που χρθςιμοποιείται για τθν απόκτθςθ και τθν αποδζςμευςθ κάποιου αντικειμζνου Όταν αποκτϊνται δεδομζνα τα οποία δεν μποροφν να αποτελζςουν αντικείμενο διαμοιραςμοφ ι εκκινείται επεξεργαςία θ οποία δε μπορεί να εκτελεςτεί ταυτόχρονα κάπου αλλοφ ςτο ςφςτθμα, τότε θ mutex τίκεται ςε κατάςταςθ κλειδϊματοσ (ςυνικωσ λαμβάνεται θ τιμι μθδζν), γεγονόσ που παρεμποδίηει οποιεςδιποτε άλλεσ προςπάκειεσ χρθςιμοποίθςισ τθσ Η mutex τίκεται ςε κατάςταςθ ξεκλειδϊματοσ όταν δεν απαιτοφνται πλζον τα δεδομζνα ι όταν ολοκλθρωκεί θ ρουτίνα *Λζξθ μνιμθσ που χρθςιμοποιείται ωσ μθχανιςμόσ ςυγχρονιςμοφ
Κλειδαριά Αμοιβαίου Αποκλειςμοφ (2/2) Η βαςικι διαφορά μεταξφ του δυαδικοφ ςθμαφόρου και τθσ mutex: Η διεργαςία που κλειδϊνει τθ mutex (κζτει ςε αυτιν τθν τιμι 0) πρζπει να είναι και αυτι που κα τθν ξεκλειδϊςει (κα κζςει ςε αυτιν τθν τιμι 1) τουσ δυαδικοφσ ςθμαφόρουσ ςυμβαίνει κάποια διεργαςία να κλειδϊςει κάποιον ςθμαφόρο και κάποια άλλθ διεργαςία να το ξεκλειδϊςει
Πολιτικζσ Διαχείριςθσ Ουράσ Σόςο για τουσ ςθμαφόρουσ μζτρθςθσ όςο και για τουσ δυαδικοφσ ςθμαφόρουσ χρθςιμοποιείται ουρά για τθ διατιρθςθ των διεργαςιϊν που αναμζνουν το ςθμαφόρου Με ποια ςειρά αφαιροφνται οι διεργαςίεσ από μία ουρά; Η πιο δίκαιθ πολιτικι απομάκρυνςθσ είναι θ πρϊτο-μζςαπρϊτο-ζξω (FIFO): Η διεργαςία που ζχει μπλοκάρει το μεγαλφτερο χρονικό διάςτθμα απελευκερϊνεται πρϊτθ από τθν ουρά Οι ςθμαφόροι που διακζτουν ςτον οριςμό τουσ τθν πολιτικι αυτι ονομάηονται ισχυροί σημαφόροι Οι ςθμαφόροι που δεν κακορίηουν τθ ςειρά με τθν οποία αφαιροφνται οι διεργαςίεσ από τθν ουρά, ονομάηονται ασθενείς σημαφόροι
Αμοιβαίοσ Αποκλειςμόσ Μόνο μία διεργαςία τθ φορά επιτρζπεται να βρίςκεται ςτο κρίςιμο τμιμα τθσ μεταξφ όλων των διεργαςιών που ζχουν κρίςιμα τμιματα για τον ίδιο πόρο ι για το ίδιο διαμοιραηόμενο αντικείμενο
Πρόβλθμα Αμοιβαίου Αποκλειςμοφ (1/2) Λφςθ προβλιματοσ με τθ χριςθ ενόσ ςθμαφόρου s: Ασ εξετάςουμε n διεργαςίεσ, το ςφνολο των οποίων χρειάηεται πρόςβαςθ ςτον ίδιο πόρο Κάκε διεργαςία ζχει ζνα κρίςιμο τμιμα που χρθςιμοποιείται για τθν πρόςβαςθ ςτον πόρο ε κάκε διεργαςία εκτελείται μια semwait (s), ακριβϊσ πριν το κρίςιμο τμιμα τθσ Αν θ τιμι του s είναι αρνθτικι, θ διεργαςία μπλοκάρεται Αν θ τιμι ιςοφται με 1, τότε μειϊνεται ςε 0 και θ διεργαςία αμζςωσ ζρχεται ςτο κρίςιμο τμιμα τθσ Επειδι ο s δεν είναι πλζον κετικόσ, καμία άλλθ διεργαςία δεν είναι ςε κζςθ να ειςζλκει ςτο κρίςιμο τμιμα τθσ
Πρόβλθμα Αμοιβαίου Αποκλειςμοφ (2/2) Λφςθ προβλιματοσ με τθ χριςθ ενόσ ςθμαφόρου s : Ο ςθμαφόροσ αρχικοποιείται λαμβάνοντασ τιμι ίςθ με 1 επομζνωσ, θ πρϊτθ διεργαςία που εκτελεί τθ semwait μπορεί να ειςζλκει ςτο κρίςιμο τμιμα αμζςωσ, κζτοντασ ςτον s τθν τιμι 0 Οποιαδιποτε άλλθ διεργαςία επιχειριςει να ειςζλκει ςτο κρίςιμο τμιμα, κα τον βρει απαςχολθμζνο και κα μπλοκαριςτεί μειϊνοντασ τον s κατά 1 Όταν θ διεργαςία που αρχικά ειςιλκε ςτο κρίςιμο τμιμα απζρχεται, αυξάνεται ο s και μία από τισ μπλοκαριςμζνεσ διεργαςίεσ, εφόςον υπάρχουν, αφαιρείται από τθν ουρά των μπλοκαριςμζνων διεργαςιϊν που ζχει ςχζςθ με το ςθμαφόρο και τοποκετείται ςτθν «ζτοιμθ» κατάςταςθ Σθν επόμενθ φορά που δρομολογείται από το Λ, μπορεί να ειςζλκει ςτο κρίςιμο τμιμα
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (1/9) Τπάρχει ζνασ ι περιςςότεροι παραγωγοί που παράγουν κάποιο τφπο δεδομζνων (εγγραφζσ, χαρακτιρεσ) και τα τοποκετοφν ςε ζναν απομονωτι Τπάρχει ζνασ καταναλωτισ που αναςφρει ςτοιχεία από τον απομονωτι, ζνα κάκε φορά το ςφςτθμα πρόκειται να τεκοφν κάποιοι περιοριςμοί για τθν παρεμπόδιςθ τθσ επικάλυψθσ των λειτουργιϊν του απομονωτι (οποιαδιποτε χρονικι ςτιγμι μόνο ζνασ ςυντελεςτισ μπορεί να προςπελάςει τον απομονωτι)
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (2/9) Σο πρόβλθμα είναι: Να διαςφαλιςκεί ότι ο παραγωγόσ δε κα προςπακιςει να προςκζςει δεδομζνα ςτον απομονωτι, εάν αυτόσ είναι γεμάτοσ Να διαςφαλιςκεί ότι ο καταναλωτισ δε κα προςπακιςει να αφαιρζςει δεδομζνα από ζναν κενό απομονωτι τθν ςυνζχεια παρουςιάηονται λφςεισ για το προαναφερόμενο πρόβλθμα, οι οποίεσ αναδείχνουν τόςο τα ιςχυρά ςθμεία των ςθμαφόρων όςο και τισ παγίδεσ που κρφβουν
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (3/9) Πρϊτθ πρόταςθ: Ασ υποκζςουμε ότι ο απομονωτισ είναι απεριόριςτοσ και ότι αποτελείται από γραμμικό πίνακα ςτοιχείων Ο παραγωγόσ μπορεί να παράγει ςτοιχεία και να τα αποκθκεφει ςτον απομονωτι με το δικό του ρυκμό κάκε φορά αυξάνεται ζνασ δείκτθσ (in) του απομονωτι Ο καταναλωτισ προχωράει με ανάλογο τρόπο αυξάνοντασ επίςθσ ζνα δείκτθ (out) Ο καταναλωτισ κα πρζπει να βεβαιωκεί ότι δεν επιχειρεί να διαβάςει από ζναν κενό απομονωτι Άρα πριν ξεκινιςει βεβαιϊνεται ότι ο παραγωγόσ προπορεφεται από αυτόν (in>out)
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (4/9) Πρϊτθ πρόταςθ : Αν υλοποιιςουμε το ςφςτθμα αυτό χρθςιμοποιϊντασ δυαδικοφσ ςθμαφόρουσ: Αντί να αςχολθκοφμε με τουσ δείκτεσ in και out, μποροφμε απλά να καταγράψουμε το πλικοσ των ςτοιχείων του απομονωτι ςε μία μεταβλθτι n (=in-out) Ο ςθμαφόροσ s χρθςιμοποιείται για τθν επιβολι του αμοιβαίου αποκλειςμοφ Ο ςθμαφόροσ delay χρθςιμοποιείται για να αναγκάςει τον καταναλωτι να περιμζνει ςτο semwait, αν ο απομονωτισ είναι κενόσ
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (5/9) Πρϊτθ πρόταςθ : Η λφςθ είναι αρκετά ςαφισ: Ο παραγωγόσ είναι ελεφκεροσ να προςκζςει δεδομζνα ςτον απομονωτι οποιαδιποτε χρονικι ςτιγμι Εκτελεί τθ semwaitb(s) πριν τθν προςκικθ και μετά τθ semsignalb(s) για τθν παρεμπόδιςθ είτε του καταναλωτι είτε οποιουδιποτε άλλου παραγωγοφ από τθν προςπζλαςθ του απομονωτι κατά τθ διάρκεια τθσ λειτουργίασ τθσ προςκικθσ Επίςθσ, ο παραγωγόσ, ενϊ βρίςκεται ςτο κρίςιμο τμιμα, αυξάνει τθν τιμι τθσ n Αν θ n=1, τότε ο απομονωτισ ιταν κενόσ πριν τθν προςκικθ και επομζνωσ ο παραγωγόσ εκτελεί τθ semsignalb(delay) ϊςτε να ειδοποιιςει τον καταναλωτι για το γεγονόσ αυτό Ο καταναλωτισ ξεκινά, αναμζνοντασ τθν παραγωγι του πρϊτου ςτοιχείου, χρθςιμοποιϊντασ τθ semwaitb(delay) Ζπειτα παίρνει ζνα ςτοιχείο και μειϊνει τθν τιμι τθσ n ςτο κρίςιμο τμιμα του Αν ο παραγωγόσ είναι ςε κζςθ να προθγείται του καταναλωτι (θ πιο ςυχνι περίπτωςθ), τότε θ n κα είναι κετικι, ςπάνια κα μπλοκαριςτεί ςτο ςθμαφόρο delay και καταναλωτισ και παραγωγόσ κα εκτελοφνται ομαλά
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (6/9) Μειονζκτθμα πρόταςθσ: Όταν ο καταναλωτισ ζχει εξαντλιςει τον απομονωτι, χρειάηεται να μθδενίςει το ςθμαφόρο delay, ζτςι ϊςτε να αναγκαςτεί να βρίςκεται ςε αναμονι μζχρι ο παραγωγόσ να τοποκετιςει περιςςότερα ςτοιχεία ςτον απομονωτι (αυτό γίνεται με τον ζλεγχο if n==0 semwaitb(delay)) Τπάρχει περίπτωςθ να ςυμβεί: Ο καταναλωτισ αποτυγχάνει νε εκτελζςει τθ λειτουργία semwaitb Ο καταναλωτισ πράγματι εξάντλθςε τον απομονωτι και ζκεςε ςτθ n τθν τιμι 0 αλλά ο παραγωγόσ αφξθςε τον n πριν να είναι ςε κζςθ να τον ελζγξει ο καταναλωτισ Άρα ο καταναλωτισ ζχει καταναλϊςει ςτοιχείο που δεν υπάρχει αδιζξοδο
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (7/9) Δεφτερθ πρόταςθ: Επίλυςθ του προαναφερόμενου προβλιματοσ είναι θ ειςαγωγι μια βοθκθτικισ μεταβλθτισ που μπορεί να οριςτεί ςτο κρίςιμο τμιμα του καταναλωτι, ϊςτε να χρθςιμοποιθκεί αργότερα Η προςζγγιςθ αυτι δεν οδθγεί ςε αδιζξοδο
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (8/9) Σρίτθ πρόταςθ: Μια πιο ξεκάκαρθ λφςθ μπορεί να δοκεί με τθ χριςθ γενικϊν ςθμαφόρων Η μεταβλθτι n αυτι τθ φορά αποτελεί ςθμαφόρο και θ τιμι τθσ εξακολουκεί να είναι ίςθ με το πλικοσ των ςτοιχείων του απομονωτι Η χριςθ των γενικϊν ςθμαφόρων επιλφει το πρόβλθμα που προαναφζρκθκε αλλά μπορεί να οδθγιςει πάλι ςε αδιζξοδο το ςφςτθμα Αν κατά λάκοσ οι λειτουργίεσ semwait(n) και semwait(s) αντιςτραφοφν και ο καταναλωτισ ειςζλκει ςτο κρίςιμο τμιμα του όταν ο απομονωτισ είναι κενόσ τότε κανζνασ παραγωγόσ δεν κα μπορεί ποτζ να προςκζςει ςτον απομονωτι και το ςφςτθμα καταλιγει ςε αδιζξοδο
Πρόβλθμα του Παραγωγοφ/Καταναλωτι (9/9) τθν πραγματικότθτα ο απομονωτισ διακζτει πεπεραςμζνθ χωρθτικότθτα: Η λφςθ ςτο πρόβλθμα δίνεται με τθ χριςθ ενόσ επιπλζον ςθμαφόρου e που θ τιμι του είναι ίςθ με το πλικοσ των κενϊν κζςεων ςτον απομονωτι
Βιβλιογραφία Stallings, W. (2017). Λειτουργικά Συςτιματα: Αρχζσ Σχεδίαςθσ. Εκδόςεισ Σηιόλα: Θεςςαλονίκθ.