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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Λειτουργικό Σύστημα (Operating System) 1o μέρος
Advertisements

Τι είναι ο προγραμματισμός
Ερωτηματολόγιο Συλλογής Απαιτήσεων Εφαρμογών Υψηλών Επιδόσεων
ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΔΙΕΡΓΑΣΙΩΝ
Μάρτιος 2011 Βαρόμετρο ΕΒΕΘ - Καταναλωτές. “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι.
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι
7.3.8 Μεταφραστές Ελληνογαλλική Σχολή Καλαμαρί - Τίκβα Χριστίνα.
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11.
Εφαρμογές Υπολογιστών Ά Λυκείου Κεφ. 4 Λογισμικό Συστήματος
1 Α. Βαφειάδης Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ.Ε.Ι Θεσσαλονίκης Μάθημα Προηγμένες Αρχιτεκτονικές Υπολογιστών Κεφαλαίο Δεύτερο.
Η επιστήμη των υπολογιστών
Λειτουργικά Συστήματα
Slide 1 Δίκτυα Τηλεπικοινωνιών ENOTHTA 7 η ΔΙΑΚΙΝΗΣΗ ΤΗΛΕΦΩΝΙΚΩΝ ΚΛΗΣΕΩΝ (ΜΕΡΟΣ Α’) 1. ΘΕΩΡΙΑ ΤΗΣ ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΗΣ ΚΙΝΗΣΗΣ  Εκτός από τις τερματικές.
Διαχείριση Έργου Οργάνωση, σχεδιασμός και προγραμματισμός έργων ανάπτυξης λογισμικού.
-Στοίβα-Ουρά - Πλεονεκτήματα πινάκων -Δομές δεδομένων δευτερεύουσας μνήμης -Πληροφορική και δεδομένα -Παραδείγματα-Προβλήματα ψευδοκώδικα.
1 Α. Βαφειάδης Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ.Ε.Ι Θεσσαλονίκης Μάθημα Προηγμένες Αρχιτεκτονικές Υπολογιστών Κεφαλαίο Πρώτο Αρχιτεκτονική.
Λειτουργικό Σύστημα 2ο μέρος.
Πιθανοκρατικοί Αλγόριθμοι
Κεφάλαιο 1ο: ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΤΩΝ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
Πρόγραμμα Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ. Ε
Λογισμικο συστηματοσ Κεφάλαιο 4ο
Κλασσικά Προβλήματα Επικοινωνίας Σύνδρομων Διεργασιών
Επικοινωνία μεταξύ Διεργασιών και Σύνδρομες Διεργασίες
Εκτέλεση Αλγορίθμων σε ψευδογλώσσα
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι
Βαρόμετρο ΕΒΕΘ - Καταναλωτές Σεπτέμβριος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι.
1 Εισαγωγή στις Βάσεις Δεδομένων  Ανάγκη Αποθήκευσης και Διαχείρισης Δεδομένων  Συστήματα Αρχείων  Συστήματα Βάσεων Δεδομένων  Παραδοσιακές και Σύγχρονες.
Λειτουργικά Συστήματα ΑΔΙΕΞΟΔΑ. 3.1 Εισαγωγή  Αδιέξοδο = ένα σύνολο από διεργασίες που δημιουργούν μια κυκλική αλυσίδα όπου κάθε process στην αλυσίδα.
Προγραμματισμός ΙΙ Διάλεξη #7: Περισσότερες Δομές Ελέγχου Δρ. Νικ. Λιόλιος.
Ενότητα Η Δομή Επανάληψης
Κεφάλαιο 2ο Πεπερασμένα αυτόματα.
ΙΣΟΛΟΓΙΣΜΟΣ ΒΑΣΕΙ Δ.Λ.Π. (ΕΝΑΡΞΗΣ)
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(λ,ι)=α, κκπ(τ,σ)=ν, κκπ(λ,π)=η κκπ(π,σ)=γ, κκπ(ξ,ο)=κ ξο κκπ(ι,ξ)=β, κκπ(τ,θ)=θ, κκπ(ο,μ)=α.
Εξάσκηση στην προπαίδεια
Βαρόμετρο ΕΒΕΘ Μάρτιος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι του Νομού Θεσσαλονίκης”
2006 GfK Praha CORRUPTION CLIMATE IN EUROPE % % % %0 - 10% % % % % % ΚΛΙΜΑ ΔΙΑΦΘΟΡΑΣ Η.
Βαρόμετρο ΕΒΕΘ Μάρτιος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι του Νομού Θεσσαλονίκης”
Βάσεις Δεδομένων II Διαχείριση Δοσοληψιών Πάνος Βασιλειάδης Σεπτέμβρης 2002
Εισαγωγή στις Αρχές της Επιστήμης των Η/Υ» Β΄ τάξης Γενικού Λυκείου
Βαρόμετρο ΕΒΕΘ Σεπτέμβριος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι του Νομού.
Τι είναι διεργασία Ένα πρόγραμμα σε εκτέλεση Η διεργασία περιλαμβάνει:
Χρονοδρομολόγηση CPU Βασικές Αρχές Κριτήρια Χρονοδρομολόγησης
Προγραμματισμός ΙΙ Διάλεξη #6: Απλές Δομές Ελέγχου Δρ. Νικ. Λιόλιος.
Βαρόμετρο ΕΒΕΘ Μάρτιος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι του Νομού Θεσσαλονίκης”
Ηλεκτρονική Ενότητα 5: DC λειτουργία – Πόλωση του διπολικού τρανζίστορ
Δομές Δεδομένων 1 Στοίβα. Δομές Δεδομένων 2 Στοίβα (stack)  Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή – πρώτη εξαγωγή)  Περιορισμένος.
Προγραμματισμός ΙΙ Διάλεξη #5: Εντολές Ανάθεσης Εντολές Συνθήκης Δρ. Νικ. Λιόλιος.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Κληρονομικότητα.
Ανάπτυξη Πρωτοτύπου Λογισμικού
2-1 Ανάλυση Αλγορίθμων Αλγόριθμος Πεπερασμένο σύνολο εντολών που, όταν εκτελεστούν, επιτυγχάνουν κάποιο επιθυμητό αποτέλεσμα –Δεδομένα εισόδου και εξόδου.
Ενότητα Α.4. Δομημένος Προγραμματισμός
Βαρόμετρο ΕΒΕΘ - Καταναλωτές Μάρτιος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι.
Προχωρημένα Θέματα Τεχνολογίας και Εφαρμογών Βάσεων Δεδομένων Διαχείριση Συναλλαγών Πάνος Βασιλειάδης Μάρτιος 2014
Επικοινωνία μεταξύ Διεργασιών και Σύνδρομες Διεργασίες Interprocess Communication and Concurrent Processes.
Βάσεις Δεδομένων II Ενότητα 7: Ταυτοχρονισμός Γεωργία Γκαράνη
Πρωτόκολλο αμοιβαίου αποκλεισμού (mutual exclusion) για δύο διεργασίες-CPN Tools Νάνος Λέανδρος 156 Τζιαλαμάνη Βιργινία 166.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Βαρόμετρο ΕΒΕΘ Σεπτέμβριος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι του Νομού.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι
Κατανεμημένα Συστήματα
Συγχρονισμός Διεργασιών
Τι είναι διεργασία Ένα πρόγραμμα σε εκτέλεση Η διεργασία περιλαμβάνει:
Λειτουργικά Συστήματα και Ασφάλεια Πληροφοριακών Συστημάτων ΔΙΕΡΓΑΣΙΕΣ
ΔΙΕΡΓΑΣΙΕΣ.
ΣΥΓΧΡΟΝΑ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Τρίτη Έκδοση ANDREW S
Μεταγράφημα παρουσίασης:

5. Αμοιβαίος αποκλεισμός Εισαγωγή Κρίσιμα τμήματα (Critical Sections) Υλοποίηση του αμοιβαίου αποκλεισμού Προσεγγίσεις λογισμικού Υποστήριξη εκ μέρους του υλικού Σηματοφορείς Κλασσικά προβλήματα συγχρονισμού ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

1. Εισαγωγή Ο αμοιβαίος αποκλεισμός είναι ο αποκλεισμός μιας διεργασίας από μια ενέργεια που επιτελεί ταυτοχρόνως κάποια άλλη διεργασία. Απαιτεί μόνο μία διεργασία να πραγματοποιεί λειτουργίες σε κοινούς πόρους. Αν δύο διεργασίες προσπαθήσουν να αποκτήσουν ένα κοινό πόρο, τότε η μία θα πρέπει να αναμένει. Για την αποφυγή των παρενεργειών λόγω ανταγωνισμού είναι ζωτικής σημασίας η πρόβλεψη και η αποτροπή χρήσης διαμοιραζόμενων πόρων από περισσότερες από μια διεργασίες την ίδια χρονική στιγμή. Είναι απαραίτητος για την προστασία των κρισίμων τμημάτων των διεργασιών. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Η διαχείριση του αμοιβαίου αποκλεισμού γίνεται μέσω : Η επιλογή των κατάλληλων λειτουργιών για την επίτευξη του αμοιβαίου αποκλεισμού είναι σημαντικό θέμα κατά το σχεδιασμό των Λ.Σ. Η διαχείριση του αμοιβαίου αποκλεισμού γίνεται μέσω : Προστασίας πρόσβασης σε πόρους μέσω μηχανισμών συγχρονισμού Ενδεχόμενου συγχρονισμού (σε πολλές περιπτώσεις) μέσω των κλήσεων συστήματος, χωρίς η μέθοδος αυτή να είναι πάντοτε αποτελεσματική επειδή πολλές κλήσεις συστήματος είναι επανεισαγόμενες (reentrant). Όταν δύο ή περισσότερες διεργασίες είναι πιθανό να ζητήσουν και να εκτελέσουν συγχρόνως μια κοινή διαδικασία ο κώδικας της διαδικασίας χαρακτηρίζεται ως επανεισαγόμενος. Τέτοιες διαδικασίες πρέπει να χρησιμοποιούν επανεισαγόμενο κώδικα για να αποθηκεύουν τα συγκεκριμένα δεδομένα κάθε διεργασίας σε θέσεις μνήμης που είναι τοπικές στην κάθε διεργασία. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Παράδειγμα - 1 Κατάθεση 100 € Απαίτηση ανάληψης 100 € Ανάγνωση τρέχοντος υπολοίπου = 500 € Νέο υπόλοιπο= 500 + 100 = 600 Εγγραφή νέου υπολοίπου στο δίσκο = 600 € Απαίτηση ανάληψης 100 € Ανάγνωση τρέχοντος υπολοίπου = 500 € Νέο υπόλοιπο= 500 - 100 = 400 Εγγραφή νέου υπολοίπου στο δίσκο = 400 € Χρονική καθυστέρηση Χρονική καθυστέρηση ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Παράδειγμα – 1 (συνέχεια) Κατάθεση 100 € Απαίτηση για δέσμευση του λογαριασμού Ανάγνωση υπολοίπου από το δίσκο = 500 € υπόλοιπο = 500 + 100 = 600 Εγγραφή νέου υπολοίπου στο δίσκο = 600 € Απελευθέρωση λογαριασμού Απαίτηση ανάληψης 100 € Απαίτηση για κλείδωμα του λογαριασμού Αναμονή Δέσμευση λογαριασμού Ανάγνωση υπολοίπου = 600 Νέο υπόλοιπο = 600 - 100 = 500 Εγγραφή νέου υπολοίπου στο δίσκο = 500 € ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 7 Υποθέστε ότι δύο διεργασίες A & B ενημερώνουν έναν κοινό τραπεζικό λογαριασμό ( A ανάληψη και B κατάθεση). Αρχικό υπόλοιπο λογαριασμού (balance) = 100 € Process A Process B 1. load R1, balance 1. load R3, balance 2. load R2, 50 2. load R4, 50 3. sub R1, R2 3. add R3, R4 4. store R1, balance 4. store R3, balance Να βρεθούν όλες οι πιθανές τιμές για το υπόλοιπο 50, 150 και 100 ! ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

load R2, amount (- for withdrawal) add R1, R2 store R1, balance Υποθέστε ότι έχουμε τον ακόλουθο κώδικα για τις κινήσεις ενός τραπεζικού λογαριασμού authenticate user open account load R1, balance load R2, amount (- for withdrawal) add R1, R2 store R1, balance close account display account info ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

load R2, amount (- for withdrawal) add R1, R2 store R1, balance Υποθέστε ότι έχουμε τον ακόλουθο κώδικα για τις κινήσεις ενός τραπεζικού λογαριασμού authenticate user open account load R1, balance load R2, amount (- for withdrawal) add R1, R2 store R1, balance close account display account info Critical section ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

2. Κρίσιμα τμήματα (Critical Sections) Μια ακολουθία εντολών μιας διεργασίας που πρέπει να εκτελείται αδιαίρετα, ονομάζεται κρίσιμο τμήμα. Η εκτέλεση του κρισίμου τμήματος θα πρέπει να είναι “όλα ή τίποτα” Δεν θα πρέπει να διακόπτεται στο μέσον Η αποτελεσματικότητα της πολυεπεξεργασίας εξαρτάται από το μήκος του κρίσιμου τμήματος κάθε ανταγωνιστικής διεργασίας και πρέπει να είναι όσο το δυνατόν μικρότερο. Το πλέον αναποτελεσματικό σενάριο Όλο το πρόγραμμα είναι ένα κρίσιμο τμήμα – δεν υπάρχει πολυπρογραμματισμός! ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Μια καλή λύση προϋποθέτει τις παρακάτω συνθήκες : Όταν μια διεργασία εκτελεί το κρίσιμο τμήμα της (ΚΤ), σε καμιά άλλη δεν μπορεί να επιτραπεί να εκτελεί το δικό της κρίσιμο τμήμα. Αν μπορούσε να διασφαλισθεί ότι ποτέ δύο ή περισσότερες διεργασίες δεν θα βρίσκονται ταυτόχρονα σε κρίσιμα τμήματα, τότε θα είχε επιτευχθεί η αποφυγή των συνθηκών ανταγωνισμού. Ωστόσο αυτό δεν είναι αρκετό για τη σωστή και αποδοτική συνεργασία δύο ή περισσοτέρων παράλληλων διεργασιών. Μια καλή λύση προϋποθέτει τις παρακάτω συνθήκες : ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Συνθήκες για το πρόβλημα του αμοιβαίου αποκλεισμού Κάθε διεργασία μπορεί να διαιρεθεί σε δύο ακολουθίες (τμήματα ή περιοχές εντολών) : το κρίσιμο τμήμα, δηλ. αυτό που προσπελάζει τον κοινό πόρο και δεν πρέπει να καταμεριστεί και το μη κρίσιμο τμήμα. Δυο διεργασίες δεν μπορούν να βρίσκονται ταυτόχρονα στα κρίσιμα τμήματά τους. Μια διεργασία μπορεί να σταματήσει μόνον μέσα στο μη κρίσιμο τμήμα της, χωρίς να επηρεάσει (να αναστείλει) άλλες διεργασίες. Δεν επιτρέπονται υποθέσεις σε ότι αφορά την ταχύτητα ή το πλήθος των επεξεργαστών. Όταν μια διεργασία δεν εκτελεί το κρίσιμο τμήμα της δεν μπορεί να αναστείλει την εκτέλεση άλλης διεργασίας. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Το πρόγραμμα δεν επιτρέπεται να καταλήξει σε αδιέξοδο Το πρόγραμμα δεν επιτρέπεται να καταλήξει σε αδιέξοδο. Αν περισσότερες της μιας διεργασίες προσπαθήσουν να εισέλθουν ταυτόχρονα στις κρίσιμες περιοχές τους, τότε μόνο μια πρέπει να επιτύχει. Δεν επιτρέπεται η επ’ αόριστον αναμονή μιας διεργασίας, μέχρι να εισέλθει στο κρίσιμο τμήμα της. Στην περίπτωση έλλειψης συναγωνισμού για ταυτόχρονη είσοδο σε κρίσιμες περιοχές, μια διεργασία που επιθυμεί να εισέλθει στην κρίσιμη περιοχή της θα πρέπει να το επιτύχει με την ελάχιστη δυνατή επιβάρυνση. Μια διεργασία παραμένει μέσα στο κρίσιμο τμήμα της για ορισμένο χρονικό διάστημα. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Αμοιβαίος αποκλεισμός χρησιμοποιώντας κρίσιμα τμήματα ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Κίνδυνοι λόγω του αμοιβαίου αποκλεισμού Οι λανθασμένες ή ελλιπείς λύσεις στο πρόβλημα του αμοιβαίου αποκλεισμού μπορούν να οδηγήσουν σε Παρατεταμένη στέρηση (starvation) Αδιέξοδο (deadlock) Ανεπάρκεια του συστήματος ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

3. Υλοποίηση του αμοιβαίου αποκλεισμού Προσεγγίσεις λογισμικού με παραχώρηση της ευθύνης στις διεργασίες χωρίς υποστήριξη από τη γλώσσα προγραμματισμού ή το Λ.Σ. (αλγόριθμοι Dekker και Peterson) Υποστήριξη εκ μέρους του υλικού με χρήση εντολών μηχανής ειδικού σκοπού (ατομικές λειτουργίες test και set) Παροχή κάποιου επιπέδου υποστήριξης από το Λ.Σ. ή τη γλώσσα προγραμματισμού : σηματοφορείς (semaphores), παρακολουθητές(monitors), μεταβίβαση μηνυμάτων Όλες οι λύσεις περιλαμβάνουν συνήθως κρίσιμα τμήματα ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

I. Προσεγγίσεις λογισμικού Υλοποιούνται για ταυτόχρονες διεργασίες που εκτελούνται σε έναν ή πολλαπλούς επεξεργαστές με διαμοιραζόμενη κύρια μνήμη. Οι ταυτόχρονες προσβάσεις (ανάγνωσης ή εγγραφής) στην ίδια περιοχή της μνήμης διατάσσονται σειριακά, με κάποιο τρόπο διαχείρισης. Η παραχώρηση της πρόσβασης δεν είναι εκ των προτέρων καθορισμένη. Δεν υπάρχει υποστήριξη σε επίπεδο υλικού, λειτουργικού συστήματος ή γλώσσας προγραμματισμού. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ο αλγόριθμος του Dekker Κάθε προσπάθεια για αμοιβαίο αποκλεισμό πρέπει να στηρίζεται σε βασικούς μηχανισμούς απαγορεύσεων σε επίπεδο υλικού. Ο πλέον συνήθης : Σε μια περιοχή (θέση) μνήμης επιτρέπεται μια πρόσβαση κάθε φορά. Υλοποίηση του αλγορίθμου Dekker με προσπάθειες αυξανόμενης δυσκολίας, όχι πάντοτε ορθές, για την ανίχνευση των λαθών. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

1η προσπάθεια Process 0: Process 1: var turn: 0..1; /* shared */ while (turn != 0) do nothing; <critical section> turn = 1; Process 1: while (turn != 1) do nothing; <critical section> turn = 0; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Υλοποιείται ο αμοιβαίος αποκλεισμός Μειονεκτήματα : Καταναλώνει χρόνο του επεξεργαστή (ενεργός αναμονή) Αυστηρή εναλλαγή των διεργασιών κατά την εκτέλεση των κρίσιμων τμημάτων τους Ο ρυθμός εκτέλεσης καθορίζεται από την πιο αργή διεργασία Αν μια διεργασία αποτύχει η άλλη αναστέλλεται για πάντα, είτε αυτή βρίσκεται στο κρίσιμο τμήμα της, είτε όχι. Κάθε διεργασία θα πρέπει να έχει το δικό της κλειδί για το κρίσιμο τμήμα έτσι ώστε αν μια διεργασία αποτύχει, η άλλη να μπορεί να έχει πρόσβαση στο κρίσιμο τμήμα της. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

var flag: array[0..1] of Boolean; /* initialize both to false */ 2η προσπάθεια var flag: array[0..1] of Boolean; /* initialize both to false */ /* shared */ Process 0: while (flag[1]) do nothing; flag[0] = true; <critical section> flag[0] = false; Process 1: while (flag[0]) do nothing; flag[1] = true; <critical section> flag[1] = false; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Εξασφαλίζεται ο αμοιβαίος αποκλεισμός; Μια διεργασία μπορεί να μεταβάλλει την κατάστασή της αφού έχει ελεγχθεί από την άλλη, αλλά πριν η άλλη διεργασία εισέλθει στο κρίσιμο τμήμα της. Παρατηρήσεις : Αν μια διεργασία αποτύχει στο μη κρίσιμο τμήμα της η άλλη διεργασία δεν αναστέλλεται Αν μια διεργασία αποτύχει ενώ βρίσκεται στο κρίσιμο τμήμα της, η άλλη διεργασία αναστέλλεται. Εξασφαλίζεται ο αμοιβαίος αποκλεισμός; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Θεωρείστε την παρακάτω ακολουθία : Η Process 0 εκτελεί την εντολή while και βρίσκει την τιμή της flag[1] = false Η Process 1 εκτελεί την εντολή while και βρίσκει την τιμή της flag[0] = false Η Process 0 θέτει flag[0]=true και εισέρχεται στο κρίσιμο τμήμα της Η Process 1 θέτει flag[1]=true και εισέρχεται στο κρίσιμο τμήμα της ΚΑΙ ΟΙ ΔΥΟ ΔΙΕΡΓΑΣΙΕΣ ΒΡΙΣΚΟΝΤΑΙ ΣΤΟ ΚΡΙΣΙΜΟ ΤΜΗΜΑ ΤΟΥΣ!!! ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

var flag: array[0..1] of Boolean; /* initialize both to false */ 3η προσπάθεια var flag: array[0..1] of Boolean; /* initialize both to false */ /* shared */ Process 0: flag[0] = true; while (flag[1]) do nothing; <critical section> flag[0] = false; Process 1: flag[1] = true; while (flag[0]) do nothing; <critical section> flag[1] = false; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Εξασφαλίζεται ο αμοιβαίος αποκλεισμός; Παρατηρήσεις : Αν μια διεργασία αποτύχει ενώ βρίσκεται στο κρίσιμο τμήμα της τότε η άλλη διεργασία αναστέλλεται Μια διεργασία ρυθμίζει την κατάστασή της χωρίς να γνωρίζει την κατάσταση της άλλης διεργασίας. Εξασφαλίζεται ο αμοιβαίος αποκλεισμός; Μπορεί να δημιουργηθεί αδιέξοδο; Αν και οι δύο διεργασίες θέσουν την τιμή TRUE στην flag πριν οποιαδήποτε από τις δύο εκτελέσει την εντολή while τότε η κάθε μια θα θεωρεί ότι η άλλη έχει εισέλθει στο κρίσιμο τμήμα της και έτσι θα προκληθεί ΑΔΙΕΞΟΔΟ ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

var flag: array[0..1] of Boolean; /* initialize both to false */ 4η προσπάθεια var flag: array[0..1] of Boolean; /* initialize both to false */ /* shared */ Process 0: flag[0] = true; while (flag[1]) do { flag[0] = false; <delay for short time> } <critical section> Process 1: flag[1] = true; while (flag[0]) do { flag[1] = false; <delay for short time> } <critical section> ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Εξασφαλίζεται ο αμοιβαίος αποκλεισμός; Παρατηρήσεις : Κάθε διεργασία είναι έτοιμη να υποχωρήσει στην άλλη διεργασία Εξασφαλίζεται ο αμοιβαίος αποκλεισμός; Μπορεί να δημιουργηθεί αδιέξοδο; Κατάσταση livelock (υπάρχουν πιθανές ακολουθίες εκτέλεσης των διεργασιών που είναι επιτυχείς) ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Οι 4 προσπάθειες του αλγορίθμου του Dekker ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

boolean flag [2]; /* ΑΛΓΟΡΙΘΜΟΣ DEKKER */ int turn; void P0() { while (true) flag [0] = true; while (flag [1]) if (turn == 1) flag [0] = false; while (turn == 1) /* do nothing */; } /* critical section */; turn = 1; /* remainder */; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

/* critical section */; turn = 0; /* remainder */; void P1( ) { while (true) flag [1] = true; while (flag [0]) if (turn == 0) flag [1] = false; while (turn == 0) /* do nothing */; } /* critical section */; turn = 0; /* remainder */; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

void main () { flag [0] = false; flag [1] = false; turn = 1; parbegin (P0, P1); } ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Η δήλωση parbegin(P1,P2,..Pn) εκτελεί τα ακόλουθα : parbegin - parend : Οι εντολές parbegin (parallel begin) και parend (parallel end) είναι εντολές υψηλού επιπέδου για την περιγραφή του ταυτοχρονισμού και προτάθηκαν από τον Dijkstra (1965). Η δήλωση parbegin(P1,P2,..Pn) εκτελεί τα ακόλουθα : Ανέστειλε την εκτέλεση του κυρίως προγράμματος Αρχικοποίησε την ταυτόχρονη εκτέλεση όλων των διεργασιών P1,P2,…,Pn. Όταν ολοκληρωθούν όλες οι διεργασίες P1,P2,…, Pn συνέχισε το κυρίως πρόγραμμα. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ο αλγόριθμος του Peterson ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

ΙΙ. Υποστήριξη εκ μέρους του υλικού Προβλήματα με τις προσεγγίσεις λογισμικού: Ενεργός αναμονή (busy waiting) είναι ο επαναλαμβανόμενος έλεγχος μιας μεταβλητής με αποτέλεσμα να δαπανάται χρόνος της CPU πρέπει να αποφεύγεται Σύνθετοι αλγόριθμοι Και οι δύο αλγόριθμοι (Dekker, Peterson) είναι ορθοί αλλά δουλεύουν μόνον με 2 διεργασίες. Μπορούν να επεκταθούν και σε n διεργασίες αλλά: Το πλήθος n πρέπει να είναι εξ αρχής γνωστό Οι αλγόριθμοι γίνονται ακόμη πιο σύνθετοι Η εφαρμογή ενός μηχανισμού αμοιβαίου αποκλεισμού είναι ΔΥΣΚΟΛΗ! ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Μπορεί το υλικό (hardware) να βοηθήσει; Μπορεί να κάνει τη λύση περισσότερο αποτελεσματική; Η λύση θα μπορεί να εφαρμοστεί σε περισσότερες από δύο διεργασίες; Το υλικό που απαιτείται για να υποστηρίξει κρίσιμα τμήματα πρέπει κατ’ ελάχιστο να έχει: Αδιαίρετες εντολές Ατομικές (atomic) εντολές load, store, test. Αν δύο ατομικές εντολές εκτελεστούν ταυτόχρονα, πρέπει να συμπεριφερθούν σαν να εκτελούνται σειριακά. Οι σύγχρονοι μικροεπεξεργαστές διαθέτουν εντολές υλικού που υποστηρίζουν τον αμοιβαίο αποκλεισμό ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

1. Απενεργοποίηση Διακοπών while (true) { /* disable interrupts */; /* critical section */; /* enable interrupts */; /* remainder */;} Οι διακοπές απενεργοποιούνται κατά τη χρονική περίοδο που απαιτείται ο αμοιβαίος αποκλεισμός Χωρίς διακοπές δεν μπορεί να συμβεί εναλλαγή διεργασιών Είναι επικίνδυνη: μια διεργασία μπορεί να διακρατήσει όλο το σύστημα Χρησιμοποιείται σε συστήματα ειδικής χρήσης με περιορισμένο hardware ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Μειονεκτήματα Έχει υψηλό κόστος Μειώνεται η αποτελεσματικότητα της εκτέλεσης διότι περιορίζεται η δυνατότητα του επεξεργαστή να εναλλάσσει προγράμματα Είναι μια χρήσιμη τεχνική για τον πυρήνα, αλλά δεν ενδείκνυται ως γενικός μηχανισμός αμοιβαίου αποκλεισμού για τις διεργασίες χρήστη Σε συστήματα πολλών επεξεργαστών δεν εγγυάται ο αμοιβαίος αποκλεισμός (γιατί?) Η απενεργοποίηση διακοπών επηρεάζει μόνον την υπεύθυνη CPU ενώ οι υπόλοιπες επιτρέπουν τη μεταβολή των περιεχομένων της κοινής περιοχής μνήμης. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

2. Ειδικές Εντολές Μηχανής Πολλές CPU παρέχουν εντολές υλικού για την ανάγνωση, τροποποίηση και την εγγραφή μιας θέσης μνήμης ατομικά. Οι πιο κοινές εντολές με αυτή τη δυνατότητα είναι : TAS—Test-And-Set (Motorola 68K) XCHG—exchange (x86) Η βασική ιδέα είναι η δυνατότητα ανάγνωσης του περιεχομένου μιας θέσης μνήμης και η μεταβολή του, όλα σε έναν μη διακοπτόμενο κύκλο εντολής. Οι λειτουργίες αυτές πραγματοποιούνται σε ένα κύκλο μηχανής και επομένως δεν υπόκεινται σε παρεμβολές από άλλες εντολές. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Test & Set Instruction /*test & set instruction */ boolean testset (int i) { if (i==0){ i=1; return TRUE; } else{ return FALSE; void proc(int i){ while (TRUE){ while (!testset(bolt)) /*critical section*/ bolt = 0; something_else(); } /*number of processes*/ const int n = 2; int bolt; main(){ int i; i=n; bolt = 0; while (i >0){ init_proc(&proc1(i), …); i--; } } Η διαμοιραζόμενη μεταβλητή bolt αρχικοποιείται με τιμή 0. Η μόνη διεργασία που μπορεί να εισέλθει στο κρίσιμο τμήμα της είναι αυτή που βρίσκει την bolt = 0 Όλες οι διεργασίες που προσπαθούν να εισέλθουν στο κρίσιμο τμήμα τους περιέρχονται σε κατάσταση ενεργού αναμονής Όταν μια διεργασία εγκαταλείπει το κρίσιμο τμήμα της,επαναφέρει τη bolt = 0. Στο σημείο αυτό μόνο σε μία από τις διεργασίες που είναι σε αναμονή παρέχεται το δικαίωμα πρόσβασης στο κρίσιμο τμήμα της ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Exchange Instruction /*exchange instruction */ void exchange ( int register, int memory) { int temp; temp = memory; memory = register; register = temp; } void proc(int i){ int keyi; while (TRUE){ keyi=1; while (keyi != 0){ exchange(keyi, bolt);} /*critical section*/ exchange (keyi, bolt); something_else(); } } /*number of processes*/ const int n = 2; int bolt; main(){ int i; i=n; bolt = 0; while (i >0){ init_proc(&proc1(i), …); i--; } Η εντολή εναλλάσσει τα περιεχόμενα ενός καταχωρητή με αυτά μιας θέσης μνήμης. Κατά τη διάρκεια εκτέλεσης της εντολής η πρόσβαση σε αυτή τη θέση μνήμης αποκλείεται για οποιαδήποτε άλλη εντολή. Η διαμοιραζόμενη μεταβλητή bolt αρχικοποιείται με τιμή 0. Κάθε διεργασία διατηρεί μια τοπική μεταβλητή key που αρχικοποιείται με τιμή 1. Η μόνη διεργασία που εισέρχεται στο κρίσιμο τμήμα της είναι αυτή που βρίσκει τη μεταβλητή bolt ίση με 0. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ιδιότητες της προσέγγισης της εντολής μηχανής Πλεονεκτήματα: Εφαρμόσιμη σε οποιοδήποτε αριθμό διεργασιών Μπορεί να χρησιμοποιηθεί με έναν ή πολλούς επεξεργαστές που διαμοιράζονται μια κοινή μνήμη Απλή και εύκολη στην επαλήθευση Μπορεί να χρησιμοποιηθεί για να υποστηρίξει πολλαπλά κρίσιμα τμήματα, π.χ. ορίζοντας μια ξεχωριστή μεταβλητή για κάθε κρίσιμο τμήμα. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Μειονεκτήματα: Απασχόληση ενεργούς αναμονής (busy waiting)– καθώς μια διεργασία αναμένει για πρόσβαση στο κρίσιμο τμήμα, συνεχίζει να καταναλώνει χρόνο του επεξεργαστή Παρατεταμένη στέρηση είναι πιθανή (starvation) – η επιλογή για είσοδο σε μια διεργασία είναι αυθαίρετη όταν πολλαπλές διεργασίες συναγωνίζονται για να εισέλθουν στο κρίσιμο τμήμα Πιθανότητα αδιεξόδου – αν μια διεργασία χαμηλής προτεραιότητας P1 εκτελεί την ειδική εντολή μηχανής, εισέρχεται στο κρίσιμο τμήμα της και μια μεγαλύτερης προτεραιότητας διεργασία P2 πάρει τον έλεγχο του επεξεργαστή, η P2 θα περιμένει να αποκτήσει τον έλεγχο του πόρου, εισερχόμενη σε βρόγχο ενεργού αναμονής ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Προσεγγίσεις ενεργού αναμονής Οι διατυπώσεις αμοιβαίου αποκλεισμού που παρουσιάσθηκαν βασίζονται στην ενεργό αναμονή Η ενεργός αναμονή δεν είναι επιθυμητή. Υποθέστε ότι τρέχουν δύο διεργασίες H: high priority και L: low priority Ο δρομολογητής εκτελεί πάντοτε την H , κάθε φορά που είναι σε κατάσταση ready Σε μια συγκεκριμένη στιγμή η L είναι στο κρίσιμο τμήμα της και η H γίνεται εκτελέσιμη H ξεκινά την ενεργό αναμονή περιμένοντας να εισέλθει στο κρίσιμο τμήμα της L δεν δρομολογείται ποτέ να εγκαταλείψει το κρίσιμο τμήμα της υπάρχει αδιέξοδο ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Προσεγγίσεις Sleep/Wakeup Εφαρμόζεται από τους σημαφόρους ή σηματοφορείς (semaphores) δηλ. γίνεται προσέγγιση χρησιμοποιώντας μηχανισμούς του Λ.Σ. και των γλωσσών προγραμματισμού. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 8 Ένας υπολογιστής έχει 3 επαναχρησιμοποιούμενους πόρους Α, Β, C. Τρεις διεργασίες X, Y, Z εκτελούνται στον υπολογιστή και κάθε μια χρησιμοποιεί περιοδικά 2 από τους 3 πόρους. Η διεργασία Χ αποκτά τον Α, μετά τον Β, χρησιμοποιεί και τους 2 και μετά τους απελευθερώνει Η διεργασία Υ αποκτά τον Β, μετά τον C, χρησιμοποιεί και τους 2 και μετά τους απελευθερώνει Η διεργασία Ζ αποκτά τον C, μετά τον A, χρησιμοποιεί και τους 2 και μετά τους απελευθερώνει ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Αν δύο από αυτές τις διεργασίες εκτελούνται ταυτόχρονα, μπορεί να συμβεί αδιέξοδο; Αν ναι, περιγράψτε το σενάριο Περιγράψτε ένα σενάριο στο οποίο προκύπτει αδιέξοδο αν και οι 3 διεργασίες εκτελούνται ταυτόχρονα. Τροποποιείστε τον αλγόριθμο απόκτησης των πόρων έτσι ώστε να μην υπάρχει αδιέξοδο με την εκτέλεση των 3 διεργασιών. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

ΙΙΙ. Σηματοφορείς (semaphores) Dijkstra (1965) : σχεδίαση του Λ.Σ. ως μια συλλογή συνεργαζόμενων σειριακών διεργασιών μαζί με έναν αποτελεσματικό μηχανισμό για την υποστήριξη της συνεργασίας. Οι μηχανισμοί αυτοί θα χρησιμοποιούνται και από διεργασίες χρηστών, αρκεί να τους παρέχει ο επεξεργαστής και το Λ.Σ. Η βασική αρχή : δύο ή περισσότερες διεργασίες μπορούν να συνεργαστούν με τη χρήση απλών σημάτων. Κάθε διεργασία επιβάλλεται να σταματήσει σε μια συγκεκριμένη θέση, μέχρι να παραλάβει ένα συγκεκριμένο σήμα. Για τη δημιουργία σημάτων χρησιμοποιούνται ειδικές μεταβλητές, οι σηματοφορείς ή σημαφόροι. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Βασικές (πρωταρχικές) λειτουργίες : Ένας σημαφόρος είναι μια μεταβλητή συγχρονισμού που λαμβάνει ακέραιες θετικές τιμές ή μηδέν και μπορεί να αρχικοποιηθεί με μια μη-αρνητική τιμή. Οι σημαφόροι ανακαλύφθηκαν από τον Dijkstra στα μέσα της δεκαετίας του 1960 για να επιλύουν προβλήματα συγχρονισμού μεταξύ διεργασιών Οι σημαφόροι είναι απλοί και κομψοί και επιλύουν πολλά ενδιαφέροντα προβλήματα και όχι μόνον τον αμοιβαίο αποκλεισμό. Βασικές (πρωταρχικές) λειτουργίες : P ή wait V ή signal ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

V( semaphore ) - signal: P( semaphore ) - wait: ατομική λειτουργία που αναμένει για τον σημαφόρο να γίνει θετικός, έπειτα τον μειώνει κατά 1 (“proberen” in Dutch) V( semaphore ) - signal: ατομική λειτουργία που αυξάνει τον σημαφόρο κατά 1 ( “verhogen” in Dutch) οι πρωταρχικές λειτουργίες θεωρούνται ατομικές ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Παράδειγμα σημαφόρου Έστω οι διεργασίες P1 και P2 Χρησιμοποιείται ένας κοινός σημαφόρος με όνομα synch για να συγχρονίσει τις λειτουργίες των δύο σύγχρονων διεργασιών Οι εντολές wait, signal χρησιμοποιούνται για να καθυστερήσουν την P2 μέχρι να ολοκληρωθεί η P1 Ο σημαφόρος synch αρχικοποιείται με τιμή 0 ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05 5

wait(synch); P1 P2 αφού synch = 0, παραμένει ανενεργή μέχρις ότου εκτελεστεί η signal στη P1 wait(synch); εντολές της P1 signal(synch); Ολοκλήρωση εκτέλεσης Λαμβάνει signal από P1 εντολές της P2 ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05 6

Οι σημαφόροι ως εργαλείο συγχρονισμού Εκτέλεση του τμήματος Β στη διεργασία Pj μετά από την εκτέλεση του τμήματος Α στη διεργασία Pi Χρήση ενός σημαφόρου flag με αρχική τιμή 0 Κώδικας : Pi Pj A wait(flag) signal(flag) B ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Οι μεταβλητές που αναπαριστούν σημαφόρους μπορούν να πάρουν μόνο μη αρνητικές ακέραιες τιμές και οι μόνες «αδιαίρετες» πράξεις που μπορούν να εκτελεστούν είναι οι wait και signal Αν σε οποιαδήποτε στιγμή η τιμή ενός σημαφόρου είναι αρνητική, τότε η απόλυτη τιμή του αντιπροσωπεύει το πλήθος των διεργασιών που παραμένουν αποκλεισμένες Για τη μετάδοση ενός σήματος μέσω ενός σημαφόρου, μια διεργασία εκτελεί τη λειτουργία signal Για την παραλαβή ενός σήματος μέσω ενός σημαφόρου, μια διεργασία εκτελεί τη λειτουργία wait ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

wait(s) & signal(s) αν s>0 τότε s = s - 1 (και η διεργασία που εκτελεί την εντολή wait(s) μπορεί να συνεχίσει την εκτέλεσή της) αλλιώς (αν s=0) η διεργασία εμποδίζεται να προχωρήσει (αναγκάζεται να περιμένει, αποκοιμίζεται) μέχρις ότου κάποια άλλη διεργασία εκτελέσει την εντολή signal(s) (κάνει το s >0). αν υπάρχουν (άλλες) διεργασίες που έχουν εμποδιστεί (περιμένουν) πάνω στον σημαφόρο s, τότε μία από αυτές ελευθερώνεται (αφυπνίζεται) και της επιτρέπει να συνεχίσει την εκτέλεσή της , αλλιώς s=s+1 ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Για κάθε σημαφόρο s ισχύει: ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Είδη σημαφόρων Δυαδικοί σημαφόροι (binary semaphores) - τιμές 0 και 1 Χρησιμοποιούνται για να επιτευχθεί ο αμοιβαίος αποκλεισμός Μετρητές σημαφόροι (counting semaphores) Μπορούν να λάβουν οποιαδήποτε μη αρνητική τιμή Χρησιμοποιούνται για τη διαχείριση των περιορισμένων πόρων των συστημάτων ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ιδιότητες σημαφόρων Ανεξάρτητοι του υλικού Απλοί Λειτουργούν με πολλές διεργασίες Μπορούν να υπάρχουν πολλά κρίσιμα τμήματα στον κώδικα, το καθένα με τον δικό του σημαφόρο Μπορούν να αποκτούν πολλούς πόρους ταυτόχρονα Κάθε σημαφόρος έχει μια ακέραια τιμή και μια λίστα από συσχετιζόμενες διεργασίες τις οποίες εξυπηρετεί ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Όταν μια διεργασία μπλοκάρεται από μόνη της σε ένα σημαφόρο, τότε προστίθεται σε μια ουρά που περιλαμβάνει τις διεργασίες που αναμένουν Η λειτουργία signal σε ένα σημαφόρο αφαιρεί μια διεργασία από την ουρά και την αφυπνίζει Η πιο δίκαιη πολιτική διαχείρισης της ουράς είναι η FIFO (ισχυροί σημαφόροι). Ασθενής σημαφόρος : δεν καθορίζει τη σειρά με την οποία εξέρχονται οι διεργασίες από την ουρά Οι ισχυροί σημαφόροι εγγυώνται την απαλλαγή από την παρατεταμένη στέρηση. Είναι το είδος των σημαφόρων που παρέχουν τα Λ.Σ. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Αδιέξοδο με σημαφόρους Οι σημαφόροι πρέπει να χρησιμοποιούνται με προσοχή: P0 P1 wait(S); wait(Q); wait(Q); wait(S); P0 περιμένει την P1 να εκτελέσει signal(Q) P1 περιμένει την P0 να εκτελέσει signal(S) Και οι δύο διεργασίες βρίσκονται σε αδιέξοδο! ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ενεργός αναμονή (Busy waiting) Αν η P2 πρέπει να περιμένει για την P1, τότε η P2 ανακυκλώνεται συνεχώς μέχρι να ολοκληρωθεί η P1 Οι περισσότερες λύσεις στο πρόβλημα του αμοιβαίου αποκλεισμού έχουν ως παρενέργεια την ενεργό αναμονή (busy waiting) Λύση : η διεργασία P2 σταματά (blocks) από μόνη της και θα ενεργοποιηθεί (“wakes up”) μέσω μιας λειτουργίας wakeup ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05 8

Παράδειγμα Τρεις διεργασίες διαμοιράζονται έναν πόρο στον οποίο Μία σχεδιάζει ένα A Μία σχεδιάζει ένα B Μία σχεδιάζει ένα C Να υλοποιήσετε μια μορφή συγχρονισμού έτσι ώστε να εμφανίζονται κατά σειρά τα γράμματα A B C Process A Process B Process C think(); think(); think(); draw_A(); draw_B(); draw_C(); ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

? A B C Χωρίς σημαφόρους think(); draw_A(); think(); draw_B(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

A B C Χωρίς σημαφόρους think(); draw_A(); think(); draw_B(); think(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

A A B C Χωρίς σημαφόρους think(); draw_A(); think(); draw_B(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

C A B C Χωρίς σημαφόρους think(); draw_A(); think(); draw_B(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

B A B C Χωρίς σημαφόρους think(); draw_A(); think(); draw_B(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Semaphore b = 0, c = 0; Process A Process B Process C think(); b.wait(); c.wait(); draw_A(); think(); think(); b.signal(); draw_B(); draw_C(); c.signal(); ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

b = 0, c = 0; Semaphore A B C b.wait(); think(); think(); draw_A(); b.signal(); A b.wait(); think(); draw_B(); c.signal(); B c.wait(); think(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

b = -1, c = -1; Semaphore A B C b.wait(); think(); think(); draw_A(); b.signal(); A b.wait(); think(); draw_B(); c.signal(); B c.wait(); think(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

A b = 0, c = -1; Semaphore A B C b.wait(); think(); think(); draw_A(); b.signal(); A b.wait(); think(); draw_B(); c.signal(); B A c.wait(); think(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

B b = 0, c = 0; Semaphore A B C b.wait(); think(); think(); draw_A(); b.signal(); A b.wait(); think(); draw_B(); c.signal(); B B c.wait(); think(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

C b = 0, c = 0; Semaphore A B C b.wait(); think(); think(); draw_A(); b.signal(); A b.wait(); think(); draw_B(); c.signal(); B C c.wait(); think(); draw_C(); C ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Λειτουργίες wait & signal struct semaphore { int count; queueType queue; } void wait(semaphore s) { s.count--; if (s.count < 0) place this process in s.queue; block this process void signal(semaphore s) s.count++; if (s.count <= 0) remove a process P from s.queue; place process P on ready list; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

struct binary_semaphore { enum (zero, one) value; queueType queue; }; void waitB(binary_semaphore s) { if (s.value == 1) s.value = 0; else place this process in s.queue; block this process; } void signalB(semaphore s) if (s.queue.is_empty()) s.value = 1; remove a process P from s.queue; place process P on ready list; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Αμοιβαίος αποκλεισμός με χρήση ενός σημαφόρου /* program mutualexclusion */ const int n = /* number of processes */; semaphore s = 1; void P(int i) { while (true) wait(s); /* critical section */; signal(s); /* remainder */; } void main() parbegin (P(1), P(2), . . ., P(n)); ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ο σημαφόρος s αρχικά έχει τιμή 1. Η 1η διεργασία που θα εκτελέσει μια εντολή wait(s) μειώνει την τιμή του s σε 0 (μη αρνητική τιμή) και εισέρχεται στο κρίσιμο τμήμα της. Όσες διεργασίες στη συνέχεια εκτελέσουν μια εντολή wait(s) μειώνουν την τιμή του s. Όταν η διεργασία που εισήλθε στο κρίσιμο τμήμα της εξέλθει η τιμή του s θα αυξηθεί κατά 1 και μια από τις διεργασίας που βρισκόταν σε κατάσταση αναστολής εξέρχεται από την ουρά των υπό αναστολή διεργασιών και εισέρχεται στην ουρά των έτοιμων διεργασιών. Όταν στη συνέχεια δρομολογηθεί από το Λ.Σ. θα μπορέσει να εισέλθει στο κρίσιμο τμήμα της. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 9 (ΑΣΕΠ 2005) Διεργασία (process) είναι: Άσκηση - 9 (ΑΣΕΠ 2005) Διεργασία (process) είναι: α) ένα πρόγραμμα. β) ένας επεξεργαστής. γ) ένα ειδικό αρχείο. δ) ένα πρόγραμμα σε εκτέλεση. Η λίστα έτοιμων διεργασιών (ready list) περιλαμβάνει: α) τις διεργασίες (processes) που περιμένουν για είσοδο/έξοδο. β) τις διεργασίες που περιμένουν σε κάποιο σηματοφορέα (semaphore). γ) τις διεργασίες που περιμένουν επιπλέον μνήμη. δ) τις διεργασίες που περιμένουν για εξυπηρέτηση από την κεντρική μονάδα επεξεργασίας. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 10 (ΑΣΕΠ 2005) Κρίσιμα τμήματα (critical sections) διεργασιών (processes): α) απαγορεύεται να εκτελούνται ταυτόχρονα από πολλές διεργασίες, χωρίς να αποκλείεται κάποιες να εκτελούν ταυτόχρονα μη κρίσιμα τμήματά τους. β) απαγορεύεται να εκτελούνται ταυτόχρονα από πολλές διεργασίες και αποκλείεται κάποιες να εκτελούν ταυτόχρονα μη κρίσιμα τμήματά τους. γ) επιτρέπεται να εκτελούνται ταυτόχρονα από πολλές διεργασίες. δ) όταν εκτελούνται τερματίζονται οι αντίστοιχες διεργασίες. Οι σηματοφορείς (semaphores) χρησιμεύουν για να: α) γίνεται πιο εύκολα η μετάφραση προγραμμάτων. β) συγχρονίζονται οι διεργασίες. γ) επιταχύνεται η εκτέλεση προγραμμάτων. δ) αντικαταστήσουν πολύπλοκες δομές δεδομένων. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 11 (ΑΣΕΠ 2005) Η εντολή fork στο UNIX δημιουργεί μία διεργασία (process), η οποία: α) δε μοιράζεται κοινές μεταβλητές (shared variables) με τη διεργασία που τη δημιούργησε. β) μοιράζεται κοινές μεταβλητές με τη διεργασία που τη δημιούργησε. γ) εξαρτάται από την έκδοση του UNIX εάν μοιράζεται ή όχι κοινές μεταβλητές. δ) εξαρτάται από το μέγεθος της μνήμης εάν μοιράζεται ή όχι κοινές μεταβλητές. Σε ποιο λειτουργικό σύστημα δεν υπάρχουν εντολές για τη δημιουργία ελαφρών (lightweight) διεργασιών (processes): α) Στο DOS. β) Στα WINDOWS. γ) Στο SOLARIS. δ) Σε κανένα από τα παραπάνω. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 12 Οι παρακάτω τρεις διεργασίες έχουν πρόσβαση σε 2 διαμοιραζόμενους σημαφόρους : semaphore U = 3; semaphore V = 0; [Process 1] [Process 2] [Process 3] L1:wait(U) L2:wait(V) L3:wait(V) type("C") type("A") type("D") signal(V) type("B") goto L3 goto L1 signal(V) goto L2 ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Εντός κάθε διεργασίας οι εντολές εκτελούνται σειριακά, αλλά εντολές από διαφορετικές διεργασίες μπορούν να παρεμβληθούν με οποιαδήποτε σειρά που είναι σύμφωνη με τους περιορισμούς που τίθενται από τους σημαφόρους. Για να απαντήσετε τις παρακάτω ερωτήσεις υποθέστε ότι όταν ξεκινά η εκτέλεση οι διεργασίες επιτρέπεται να εκτελούνται μέχρις ότου και οι τρεις εισέλθουν σε κατάσταση wait(), στο σημείο αυτό η εκτέλεση σταματά. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

υποθέτοντας ότι η εκτέλεση τελικά σταματά, πόσα ‘C’ θα εκτυπωθούν; υποθέτοντας ότι η εκτέλεση τελικά σταματά, πόσα ‘D’ θα εκτυπωθούν; Πόσα είναι τα λιγότερα ‘Α’ που μπορούν να εκτυπωθούν; Η ακολουθία ‘CABABDDCABCABD’ είναι δυνατόν να εμφανισθεί; Η ακολουθία ‘CABACDBCABDD’ είναι δυνατόν να εμφανισθεί; είναι δυνατόν να σταματήσει η εκτέλεση και κάποιο από τα U,V να έχουν μη μηδενικές τιμές; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 13 Το παρακάτω ζεύγος διεργασιών διαμοιράζεται μια κοινή μεταβλητή X: Process A Process B int Y; int Z; A1: Y = X*2; B1: Z = X+1; A2: X = Y; B2: X = Z; Η τιμή της X γίνεται ίση με 5 πριν ξεκινήσει η εκτέλεση οποιασδήποτε διεργασίας. Οι εντολές εντός κάθε διεργασίας εκτελούνται σειριακά, αλλά οι εντολές της διεργασίας Α είναι δυνατόν να εκτελεσθούν με οποιαδήποτε σειρά ως προς τις εντολές της διεργασίας Β. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Πόσες διαφορετικές τιμές της μεταβλητής Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών; Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό σημαφόρο S (αρχική τιμή 1), και Χ=5. Process A Process B int Y; int Z; wait(S); wait(S); A1: Y = X*2; B1: Z = X+1; A2: X = Y; B2: X = Z; signal(S); signal(S); Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό δυαδικό σημαφόρο T (αρχική τιμή 0), και Χ=5. Process A Process B int Y; int Z; A1: Y = X*2; B1: wait(T); A2: X = Y; B2: Z = X+1; signal(T); X = Z; Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 14 Το παρακάτω ζεύγος διεργασιών διαμοιράζεται τις μεταβλητές: counter, tempA, tempB Process A Process B ... ... A1: tempA = counter + 1; B1: tempB = counter + 2; A2: counter = tempA; B2: counter = tempB; ... ... Η μεταβλητή counter έχει αρχική τιμή 10, πριν ξεκινήσει η εκτέλεση οποιασδήποτε διεργασίας. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Πόσες διαφορετικές τιμές της counter είναι πιθανές όταν και οι δύο διεργασίες ολοκληρώσουν την εκτέλεσή τους; Να δώσετε ένα παράδειγμα εκτέλεσης των εντολών των διεργασιών Α και Β που θα δικαιολογούν τις τιμές της counter που θα υπολογίσετε. Π.χ. η αλληλουχία εκτέλεσης A1,A2,B1,B2 δίνει counter=13. Τροποποιήστε τα παραπάνω προγράμματα για τις διεργασίες Α και Β προσθέτοντας κατάλληλες λειτουργίες wait και signal στον δυαδικό σημαφόρο sync έτσι ώστε η μόνη δυνατή τελική τιμή της counter να είναι 13. Ποια θα είναι η αρχική τιμή του σημαφόρου sync; Σχεδιάστε ένα γράφημα προτεραιοτήτων που περιγράφει όλες τις δυνατές διατάξεις εκτέλεσης των εντολών Α1,Α2, Β1,Β2 που οδηγεί σε τελική τιμή της counter ίσης με 11. Τροποποιήστε τα αρχικά προγράμματα για τις διεργασίες Α και Β προσθέτοντας δυαδικούς σημαφόρους και λειτουργίες wait και signal ώστε το τελικό αποτέλεσμα να είναι counter=11. Να δώσετε τις αρχικές τιμές των σημαφόρων. Η λύση που θα προτείνετε να έχει τους λιγότερους δυνατούς περιορισμούς για την προτεραιότητα εκτέλεσης των εντολών. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 15 Δίνονται οι παρακάτω διεργασίες P, Q που συνεργάζονται για τον υπολογισμό του Ν2. Process P Process Q N = 5; Sqr = 0; loopP: loopQ: if (N==0) Sqr = Sqr + 2*N + 1; goto endP; N = N - 1; goto loopQ; goto loopP; endP: print(Sqr); ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Προσθέστε κατάλληλες δηλώσεις σημαφόρων και λειτουργίες wait και signal ώστε να εκτυπώνεται η σωστή τιμή του αθροίσματος Sqr. Ποια θα είναι η αρχική τιμή κάθε σημαφόρου; Να εισάγετε τις λειτουργίες των σημαφόρων ώστε να διαφυλάξετε τον μέγιστο βαθμό ταυτοχρονισμού μεταξύ των δύο διεργασιών. Να μην εισάγετε οποιουσδήποτε μη αναγκαίους περιορισμούς στη σειρά εκτέλεσης των εντολών (2 σημαφόροι είναι αρκετοί για τη επίλυση). (ΥΠΟΔΕΙΞΗ : Να βρείτε με ποια τιμή του N πρέπει να ξεκινήσει η εκτέλεση της διεργασίας Q). ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Λύση άσκησης - 15 Παρατηρώντας τον κώδικα της διεργασίας Q, βλέπουμε ότι, για να προκύψει σωστό αποτέλεσμα (δηλαδή 52=25) πρέπει η διεργασία Q να εκτελεσθεί με N=4,3,2,1 και 0. Στη διεργασία Q χρησιμοποιείται η επαναληπτική σχέση : N2=1+2+3+4+5+4+3+2+1=25 ΔΗΛΑΔΗ ο τύπος : Sqr=Sqr+2*N+1 δεν περιλαμβάνει την τιμή N=5. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άρα θέλουμε η μείωση της τιμής του N να συμβεί πριν από την πρώτη εκτέλεση της διεργασίας Q. Μπορούμε να χρησιμοποιήσουμε καταρχήν ένα σημαφόρο για τον έλεγχο της διεργασίας Q, έστω Q, με αρχική τιμή Semaphore Q=0 Και να προσθέσουμε μια wait(Q) ώστε να μην εκτελείται η διεργασία Q για N=5. Μετά τη μείωση της τιμής του N η διεργασία Q θα πρέπει να μπορεί να εκτελείται δηλαδή signal(Q). ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ποια θα είναι η αρχική τιμή του σημαφόρου P; Για να μπορεί να εκτελείται η τελευταία κλήση της διεργασίας Q για την τιμή Ν=0, (υπάρχει η εντολή if (N==0) goto endP) θα πρέπει η εντολή print(Sqr) να περιμένει την τελευταία εκτέλεση της Q. Άρα πριν από την εντολή print(Sqr) θα απαιτηθεί μια εντολή wait για τη διεργασία P, οπότε απαιτείται η χρήση και 2ου σημαφόρου που θα ελέγχει τη διεργασία P, έστω P. Θα εκτελείται λοιπόν πριν από την εντολή print(Sqr) μια wait(P). Ποια θα είναι η αρχική τιμή του σημαφόρου P; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Για να μπορεί να εκτελείται μετά την wait(P) η επόμενη εντολή print(Sqr) θα πρέπει να είναι τουλάχιστον : semaphore P=1 Επιπλέον η διεργασία Q θα πρέπει, μετά τον υπολογισμό της τιμής Sqr για την τρέχουσα τιμή του N να ενεργοποιεί την εκτέλεση της διεργασίας P, άρα απαιτείται μια signal(P) μετά από τον υπολογισμό της τιμής Sqr. Ταυτόχρονα η διεργασία P θα πρέπει να αναμένει τον υπολογισμό της τιμής Sqr πριν από τη μείωση της τιμής του N , δηλαδή θα υπάρχει μια εντολή wait(P) πριν από τη μείωση της τιμής του N. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Semaphore Q=0; //has to wait for first N value Semaphore P=1; Process P Process Q N = 5; Sqr = 0; loopP: loopQ: wait(Q); if (N==0) Sqr = Sqr + 2*N + 1; goto endP; signal(P); wait(P); N = N - 1; goto loopQ; signal(Q); goto loopP; endP: print(Sqr); ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

4. Κλασσικά προβλήματα συγχρονισμού Οι συνεργαζόμενες διεργασίες πρέπει να συγχρονίζονται ώστε να αποφεύγονται απρόβλεπτες καταστάσεις. Όταν αρκετές διεργασίες έχουν πρόσβαση και διαχειρίζονται συγχρόνως διαμοιραζόμενα δεδομένα τότε επικρατούν συνθήκες ανταγωνισμού και το αποτέλεσμα της εκτέλεσης εξαρτάται από τη σειρά με την οποία γίνεται η πρόσβαση στους κοινούς πόρους Οι συνθήκες ανταγωνισμού προκαλούνται από : τη διαίρεση των δραστηριοτήτων σε πολλές ξεχωριστές λειτουργίες (multitasking σε σύστημα με μία CPU) ταυτόχρονες λειτουργίες σε διαμοιραζόμενους πόρους σε συστήματα πολλών επεξεργαστών είναι δυνατόν να συμβούν σπάνια και γι’ αυτό είναι πολύ δύσκολο να ανιχνευθούν και να αναπαραχθούν ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Η σημασία του συγχρονισμού κατά την εκτέλεση ταυτόχρονων διεργασιών είναι σπουδαιότατη διότι: Αποτρέπει ή ελαχιστοποιεί τις συνθήκες ανταγωνσιμού, τα αδιέξοδα και την παρατεταμένη στέρηση Εξασφαλίζει την ακεραιότητα και τη σταθερότητα των δεδομένων Επιτυγχάνει τη συνεργασία των διεργασιών και αυξάνει την αποτελεσματικότητα των συστημάτων Τα κλασσικά προβλήματα συγχρονισμού αντιπροσωπεύουν ένα μεγάλο πλήθος προβλημάτων συγχρονισμού και χρησιμοποιούνται για τον έλεγχο νέων λύσεων που προτείνονται ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Το πρόβλημα του παραγωγού – καταναλωτή (producer – consumer). Χρησιμοποιείται συχνά για να καταδείξει την ισχύ των θεμελιωδών χαρακτηριστικών του συγχρονισμού. Το πρόβλημα των αναγνωστών και συγγραφέων Το πρόβλημα των συνδαιτημόνων φιλοσόφων Είναι μια απλή αναπαράσταση της ανάγκης για κατάλληλη εκχώρηση πόρων (απαλλαγμένη από αδιέξοδα και παρατεταμένη στέρηση). Χρησιμοποιείται για τον έλεγχο λύσεων που αφορούν αδιέξοδα Το πρόβλημα του κοιμώμενου κουρέα ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Το πρόβλημα του παραγωγού – καταναλωτή ( Producer – Consumer ) Αποτελεί μοντέλο εξέτασης για συνεργαζόμενες διεργασίες Ο παραγωγός “παράγει” ένα προϊόν και ο καταναλωτής το “καταναλώνει” Υπάρχουν ένας ή περισσότεροι παραγωγοί (producer) που παράγουν κάποιο τύπο δεδομένων (εγγραφές, χαρακτήρες) και τα τοποθετούν σε έναν ενδιάμεσο αποθηκευτικό χώρο (buffer). Υπάρχει επίσης ένας καταναλωτής (consumer) που παίρνει κάθε φορά ένα αντικείμενο από τον αποθηκευτικό χώρο. Μόνον ένας (παραγωγός ή καταναλωτής) μπορεί να έχει πρόσβαση στο buffer κάθε φορά. Περιπτώσεις επίλυσης : Απεριόριστο(unbounded) buffer ως γραμμικός πίνακας στοιχείων Το buffer είναι περιορισμένης χωρητικότητας (bounded) και υλοποιείται με κυκλικό τρόπο ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Απεριόριστο buffer ως γραμμικός πίνακας στοιχείων producer: while (true) { /* produce item v */ Buff[in] = v; in++; } consumer: while (true) { while (in <= out) {;}/*do nothing */; w = Buff[out]; out++; /* consume item w */ } ο καταναλωτής πρέπει να είναι βέβαιος ότι δεν θα διαβάσει δεδομένα από άδειο buffer (πρέπει να είναι in >out) Οι σκιασμένες περιοχές δείχνουν δεσμευμένες θέσεις ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Ένας παραγωγός, ένας καταναλωτής, απεριόριστο buffer void producer(){ while (TRUE){ produce_object(); append(); signal(product); something_else(); } void consumer{ while (TRUE){ wait(product); take(); consume_object(); something else(); } main(){ create_semaphore(product); init_proc(&producer(), …); init_proc(&consumer(), …); } product : είναι ένας σημαφόρος που μετρά το πλήθος των αντικειμένων που έχουν τοποθετηθεί buffer και δεν έχουν ακόμη καταναλωθεί product = (in – out) ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

πολλοί παραγωγοί, πολλοί καταναλωτές, απεριόριστο buffer void producerX(){ while (TRUE){ produce_object(); wait(buff_access_prod); append(); signal(buff_access_prod); signal(product); something_else(); } void consumerY{ while (TRUE){ wait(product); wait(buff_access_cons); take(); signal(buff_access_cons); consume_object(); something else(); } main(){ create_semaphore(product); create_semaphore(buff_access_prod); create_semaphore(buff_access_cons); init_proc(&producer1(), …); init_proc(&producer2(), …); /*…*/ init_proc(&producerN(), …); init_proc(&consumer1(), …); init_proc(&consumer2(), …); init_proc(&consumerM(), …); } buff_access_prod : είναι ένας σημαφόρος που συγχρονίζει την πρόσβαση των παραγωγών στο buffer buff_access_cons : είναι ένας σημαφόρος που συγχρονίζει την πρόσβαση των καταναλωτών στο buffer product : είναι ένας σημαφόρος που μετρά τα αντικείμενα που έχουν παραχθεί και δεν έχουν ακόμη καταναλωθεί ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Περιορισμένο buffer out in Shared data #define BUFFER_SIZE 10 typedef struct { . . . } item; item buffer[BUFFER_SIZE]; int in = 0; int out = 0; Το buffer είναι κενό όταν in == out Το buffer είναι πλήρες όταν ((in+1) % BUFFER_SIZE) == out Η λύση είναι σωστή, αλλά μπορεί να χρησιμοποιήσει μόνον BUFFER_SIZE-1 στοιχεία out in 0 1 2 3 4 5 6 7 8 9 ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Περιορισμένο buffer Producer Process out in Consumer Process 0 1 2 3 4 5 6 7 8 9 Producer Process item nextProduced; while (1) { while (((in + 1) % BUFFER_SIZE) == out) /* do nothing */; buffer[in] = nextProduced; in = (in + 1) % BUFFER_SIZE; } Consumer Process item nextConsumed; while (1) { while (in == out) /* do nothing */; nextConsumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; } ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Παρατηρήσεις Η λύση στο πρόβλημα με χρήση διαμοιραζόμενης μνήμης με περιορισμένο buffer επιτρέπει κατά μέγιστο να βρίσκονται στο buffer n – 1 αντικείμενα την ίδια στιγμή. Μια λύση που θα χρησιμοποιεί όλες τις θέσεις (=n) ΔΕΝ είναι απλή. Προσθέτουμε τη μεταβλητή counter, με αρχική τιμή 0 που θα αυξάνεται κάθε φορά που ένα νέο αντικείμενο θα προστίθεται buffer ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Περιορισμένο buffer Shared data #define BUFFER_SIZE 10 typedef struct { . . . } item; item buffer[BUFFER_SIZE]; int in = 0; int out = 0; int counter = 0; ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Περιορισμένο buffer out in Producer process item nextProduced; 0 1 2 3 4 5 6 7 8 9 Producer process item nextProduced; while (1) { while (counter == BUFFER_SIZE) ; /* do nothing */ buffer[in] = nextProduced; in = (in + 1) % BUFFER_SIZE; counter++; } Consumer process item nextConsumed; while (1) { while (counter == 0) ; /* do nothing */ nextConsumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; counter--; } ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Οι εντολές counter++; counter--; Πρέπει να εκτελούνται ατομικά. Περιορισμένο buffer Οι εντολές counter++; counter--; Πρέπει να εκτελούνται ατομικά. Μια ατομική λειτουργία σημαίνει μια λειτουργία που πρέπει να ολοκληρωθεί πλήρως χωρίς διακοπές ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Περιορισμένο buffer Η εντολή “count++” μπορεί να υλοποιηθεί σε γλώσσα μηχανής ως εξής : register1 = counter register1 = register1 + 1 counter = register1 register2 = counter register2 = register2 – 1 counter = register2 ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Περιορισμένο buffer Αν και ο παραγωγός και ο καταναλωτής προσπαθήσουν ταυτόχρονα να ενημερώσουν το buffer, οι εντολές της γλώσσας μηχανής ενδέχεται να αλληλοκαλυφθούν. Η αλληλοκάλυψη εξαρτάται από τον τρόπο δρομολόγησης των διεργασιών παραγωγού και καταναλωτή. ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Περιορισμένο buffer Έστω ότι αρχικά counter = 5. Μια πιθανή σειρά εκτέλεσης είναι… Η τιμή του count θα είναι 6 (ίσως και 4 με μια μικρή αλλαγή στη σειρά εκτέλεσης), ενώ το σωστό αποτέλεσμα είναι 5. Producer Consumer register1=counter (register1 = 5) register1=register1 + 1 (register1 = 6) counter = register1 (counter = 6) register2 = counter (register2 = 5) register2=register2–1 (register2= 4) counter = register2 (counter = 4) ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05

Άσκηση - 16 Θεωρείστε το παρακάτω πρόγραμμα: const n = 50; var result : integer; procedure total;     var count : integer;     begin       for count := 1 to n do result := result + 1;     end;    begin (* main program *)       result := 0;       parbegin             total; total;       parend             print (result);  end. Να προσδιορίσετε το κάτω και το πάνω όριο για την τελική τιμή που μπορεί να λάβει η διαμοιραζόμενη μεταβλητή result. Να υποθέσετε ότι κάθε μία διεργασία μπορεί να εκτελείται με οποιαδήποτε ταχύτητα. Η λύση πρέπει να περιλαμβάνει και σειρά εκτέλεσης των εντολών καθώς και τις διαδοχικές τιμές των μεταβλητών. Low=2, upper=100 ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι / 05