Περιεχόμενα ΠΡΟΛΟΓΟΣ 25 1 ΕΙΣΑΓΩΓΗ 31



Σχετικά έγγραφα
Περιεχόμενα ΠΡΟΛΟΓΟΣ 25 1 ΕΙΣΑΓΩΓΗ 31

Περιεχόµενα ΠΡΟΛΟΓΟΣ 23

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

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

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

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

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

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

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Τμήμα Πληροφορικής

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

ΚΕΦΑΛΑΙΟ 3: Λειτουργικά Συστήµατα

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

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

Αδιέξοδα (Deadlocks)

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

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

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

Λειτουργικά. Τεχνολογικό Εκπαιδευτικό Ίδρυμα Δυτικής Μακεδονίας Σιώζιος Κων/νος - Πληροφορική Ι

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

Συστήματα πολυμέσων. Εισαγωγή Υλικό συστημάτων πολυμέσων Λογισμικό συστημάτων πολυμέσων Συστήματα πραγματικού χρόνου Χρονοπρογραμματισμός

ΠΕΡΙΕΧΟΜΕΝΑ Υλικό και Λογισμικό Αρχιτεκτονική Υπολογιστών Δομή, Οργάνωση και Λειτουργία Υπολογιστών 6

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

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

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

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

Ένα αφαιρετικό πραγματικού χρόνου μοντέλο λειτουργικού συστήματος για MPSoC

Οργάνωση ενός σύγχρονου Υπολογιστικού Συστήματος ή Ηλεκτρονικού Υπολογιστή (Η/Υ) Τα σύγχρονα συστήματα Η/Υ έχουν την παρακάτω οργάνωση:

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

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

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

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

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

Εισαγωγή στα Λειτουργικά συστήματα Ι. Καθηγητής Κώστας Αναγνωστόπουλος

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

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

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

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

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

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

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

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

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

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

Πληροφορική 2. Λειτουργικά Συστήματα

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

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Αρχιτεκτονική Υπολογιστών Κρυφές Μνήμες. (οργάνωση, λειτουργία και απόδοση)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Μάθημα 6 ο. Χρονοδρομολόγηση (Scheduling)

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

Εικονική Μνήµη. Κεφάλαιο 8. Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

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

Κεφάλαιο 4: Λογισμικό Συστήματος

Ιεραρχία Μνήμης. Ιεραρχία μνήμης και τοπικότητα. Σκοπός της Ιεραρχίας Μνήμης. Κρυφές Μνήμες

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

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

I. ΑΛΓΟΡΙΘΜΟΣ II. ΠΡΑΞΕΙΣ - ΣΥΝΑΡΤΗΣΕΙΣ III. ΕΠΑΝΑΛΗΨΕΙΣ. 1. Τα πιο συνηθισμένα σενάρια παραβίασης αλγοριθμικών κριτηρίων είναι:

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

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

3. Σελιδοποίηση μνήμης 4. Τμηματοποίηση χώρου διευθύνσεων

2 Αποδοτική εργασία στα Windows Vista 103

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

12/5/18. συστημάτων. Το λογισµικό συστηµάτων. Κεφάλαιο 5

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

Εισαγωγή στην Πληροφορική Προγραμματισμός-Λειτουργικά

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

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

Τμήμα Λογιστικής. Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. Μάθημα 8. 1 Στέργιος Παλαμάς

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

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

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

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

Πανεπιστήµιο Θεσσαλίας

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

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

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

i Στα σύγχρονα συστήματα η κύρια μνήμη δεν συνδέεται απευθείας με τον επεξεργαστή

Ψευδοκώδικας. November 7, 2011

Φουκαράκη Χρυσούλα - ΓΕΛ Γαζίου

Τεχνολογίες Κύριας Μνήμης

Είναι το «μυαλό» του υπολογιστή μας. Αυτός κάνει όλους τους υπολογισμούς και τις πράξεις. Έχει δική του ενσωματωμένη μνήμη, τη λεγόμενη κρυφή

Βασικές συσκευές Ε/Ε. Είσοδος Έξοδος στον υπολογιστή. Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (IΙI) Μ.

Ενότητα 3 - Θέματα Εφαρμοσμένης Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

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

επιφάνεια πυριτίου Αναφορά στο Εκπαιδευτικό Υλικό : 5. Αναφορά στο Εργαστήριο :

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

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

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

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

Σελίδα 1 από 11. Απαντήσεις στο φυλλάδιο 57 Ερώτηση: 1 η : Οι ακροδέκτες αυτοί χρησιµοποιούνται για:

Οργάνωση Υπολογιστών (ΙI)

Εξωτερική Αναζήτηση. Ιεραρχία Μνήμης Υπολογιστή. Εξωτερική Μνήμη. Εσωτερική Μνήμη. Κρυφή Μνήμη (Cache) Καταχωρητές (Registers) μεγαλύτερη ταχύτητα

ΛΟΓΙΣΜΙΚΟ (software)

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

Εισαγωγή. Κατανεµηµένα Συστήµατα 01-1

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

ΠΕΡΙΕΧΟΜΕΝΑ ΜΕΡΟΣ Α : ΘΕΜΑΤΑ ΒΑΣΗΣ 1. ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ...30

Transcript:

Περιεχόμενα ΠΡΟΛΟΓΟΣ 25 1 ΕΙΣΑΓΩΓΗ 31 1.1 ΤΙ ΕΙΝΑΙ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ; 34 1.1.1 Το λειτουργικό σύστημα ως επεκτεταμένη μηχανή 34 1.1.2 Το λειτουργικό σύστημα ως διαχειριστής πόρων 36 1.2 Η ΙΣΤΟΡΙΑ ΤΩΝ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ 38 1.2.1 Η πρώτη γενιά (1945-1955): λυχνίες κενού 38 1.2.2 Η δεύτερη γενιά (1955-1965): τρανζίστορ και συστήματα δέσμης 39 1.2.3 Η τρίτη γενιά (1965-1980): ολοκληρωμένα κυκλώματα και πολυπρογραμματισμός 41 1.2.4 Η τέταρτη γενιά (1980-σήμερα): προσωπικοί υπολογιστές 47 1.3 ΓΕΝΙΚΑ ΓΙΑ ΤΟ ΥΛΙΚΟ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ 51 1.3.1 Επεξεργαστές 51 1.3.2 Μνήμη 55 1.3.3 Δίσκοι 58 1.3.4 Ταινίες 60 1.3.5 Συσκευές εισόδου/εξόδου 60 1.3.6 Δίαυλοι 64

8 ΠΕΡΙΕΧΟΜΕΝΑ 1.3.7 Εκκίνηση του υπολογιστή 66 1.4 Ο ΖΩΟΛΟΓΙΚΟΣ ΚΗΠΟΣ ΤΩΝ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ 67 1.4.1 Λειτουργικά συστήματα μεγάλων υπολογιστών 68 1.4.2 Λειτουργικά συστήματα διακομιστών 68 1.4.3 Λειτουργικά συστήματα πολυεπεξεργαστών 69 1.4.4 Λειτουργικά συστήματα προσωπικών υπολογιστών 69 1.4.5 Λειτουργικά συστήματα υπολογιστών χειρός 69 1.4.6 Ενσωματωμένα λειτουργικά συστήματα 70 1.4.7 Λειτουργικά συστήματα κόμβων αισθητήρων 70 1.4.8 Λειτουργικά συστήματα πραγματικού χρόνου 71 1.4.9 Λειτουργικά συστήματα έξυπνων καρτών 71 1.5 ΕΝΝΟΙΕΣ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ 72 1.5.1 Διεργασίες 72 1.5.2 Χώροι διευθύνσεων 75 1.5.3 Αρχεία 76 1.5.4 Είσοδος/Έξοδος 79 1.5.5 Προστασία 79 1.5.6 Το κέλυφος 80 1.5.7 Η οντογένεση ανακεφαλαιώνει τη φυλογένεση 81 1.6 ΚΛΗΣΕΙΣ ΣΥΣΤΗΜΑΤΟΣ 85 1.6.1 Κλήσεις συστήματος για τη διαχείριση διεργασιών 90 1.6.2 Κλήσεις συστήματος για τη διαχείριση αρχείων 92 1.6.3 Κλήσεις συστήματος για τη διαχείριση καταλόγων 93 1.6.4 Διάφορες κλήσεις συστήματος 95 1.6.5 Το Windows Win32 API 96 1.7 Η ΔΟΜΗ ΤΩΝ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ 99 1.7.1 Μονολιθικά συστήματα 99 1.7.2 Πολυεπίπεδα συστήματα 100 1.7.3 Μικροπυρήνες 102 1.7.4 Το μοντέλο πελάτη-διακομιστή 104 1.7.5 Εικονικές μηχανές 105 1.7.6 Οι εξωπυρήνες 109 1.8 Ο ΚΟΣΜΟΣ ΤΗΣ C 110 1.8.1 Η γλώσσα C 110 1.8.2 Αρχεία-κεφαλίδες 111 1.8.3 Μεγάλα έργα προγραμματισμού 112

ΠΕΡΙΕΧΟΜΕΝΑ 9 1.8.4 Το μοντέλο χρόνου εκτέλεσης 113 1.9 Η ΕΡΕΥΝΑ ΣΤΑ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ 114 1.10 Η ΔΙΑΡΘΡΩΣΗ ΤΟΥ ΥΠΟΛΟΙΠΟΥ ΒΙΒΛΙΟΥ 115 1.11 ΜΕΤΡΙΚΕΣ ΜΟΝΑΔΕΣ 116 1.12 ΠΕΡΙΛΗΨΗ 117 2 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ 123 2.1 ΔΙΕΡΓΑΣΙΕΣ 123 2.1.1 Το μοντέλο της διεργασίας 124 2.1.2 Δημιουργία διεργασίας 126 2.1.3 Τερματισμός διεργασίας 129 2.1.4 Ιεραρχίες διεργασιών 130 2.1.5 Καταστάσεις διεργασιών 131 2.1.6 Υλοποίηση διεργασιών 133 2.1.7 Μοντελοποίηση του πολυπρογραμματισμού 135 2.2 ΝΗΜΑΤΑ 137 2.2.1 Χρήση των νημάτων 137 2.2.2 Το κλασικό μοντέλο των νημάτων 143 2.2.3 Τα νήματα στο POSIX 147 2.2.4 Η υλοποίηση των νημάτων στο χώρο του χρήστη 150 2.2.5 Η υλοποίηση των νημάτων στον πυρήνα 153 2.2.6 Υβριδικές υλοποιήσεις 154 2.2.7 Ενεργοποιήσεις χρονοπρογραμματιστή 155 2.2.8 Αναδυόμενα νήματα 157 2.2.9 Μετατροπή του μονονηματικού κώδικα σε πολυνηματικό 158 2.3 ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ 162 2.3.1 Συνθήκες συναγωνισμού 162 2.3.2 Κρίσιμες περιοχές 164 2.3.3 Αμοιβαίος αποκλεισμός μέσω αναμονής με απασχόληση 165 2.3.4 Λήθαργος και αφύπνιση 171 2.3.5 Σηματοφόροι 174 2.3.6 Τα mutex 177 2.3.7 Ελεγκτές 181 2.3.8 Μεταβίβαση μηνυμάτων 189 2.3.9 Φράγματα 192

10 ΠΕΡΙΕΧΟΜΕΝΑ 2.4 ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 193 2.4.1 Εισαγωγή στο χρονοπρογραμματισμό 193 2.4.2 Χρονοπρογραμματισμός στα συστήματα δέσμης 201 2.4.3 Χρονοπρογραμματισμός στα αλληλεπιδραστικά συστήματα 203 2.4.4 Χρονοπρογραμματισμός στα συστήματα πραγματικού χρόνου 210 2.4.5 Πολιτικές και μηχανισμοί 211 2.4.6 Χρονοπρογραμματισμός νημάτων 212 2.5 ΚΛΑΣΙΚΑ ΠΡΟΒΛΗΜΑΤΑ ΔΙΑΔΙΕΡΓΑΣΙΑΚΗΣ ΕΠΙΚΟΙΝΩΝΙΑΣ 214 2.5.1 Το πρόβλημα του δείπνου των φιλοσόφων 214 2.5.2 Το πρόβλημα αναγνωστών-γραφέων 218 2.6 H ΕΡΕΥΝΑ ΓΙΑ ΤΙΣ ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΤΑ ΝΗΜΑΤΑ 219 2.7 ΠΕΡΙΛΗΨΗ 220 3 ΔΙΑΧΕΙΡΙΣΗ ΜΝΗΜΗΣ 227 3.1 ΧΩΡΙΣ ΑΦΑΙΡΕΣΗ ΜΝΗΜΗΣ 228 3.2 ΜΙΑ ΑΦΑΙΡΕΣΗ ΜΝΗΜΗΣ: ΧΩΡΟΙ ΔΙΕΥΘΥΝΣΕΩΝ 232 3.2.1 Η έννοια του χώρου διευθύνσεων 232 3.2.2 Εναλλαγή 234 3.2.3 Διαχείριση ελεύθερης μνήμης 238 3.3 ΕΙΚΟΝΙΚΗ ΜΝΗΜΗ 241 3.3.1 Σελιδοποίηση 243 3.3.2 Πίνακες σελίδων 246 3.3.3 Επιτάχυνση της σελιδοποίησης 249 3.3.4 Πίνακες σελίδων για μεγάλες μνήμες 253 3.4 ΑΛΓΟΡΙΘΜΟΙ ΑΝΤΙΚΑΤΑΣΤΑΣΗΣ ΣΕΛΙΔΩΝ 257 3.4.1 Ο βέλτιστος αλγόριθμος αντικατάστασης σελίδας 258 3.4.2 Ο αλγόριθμος αντικατάστασης σελίδας NRU 259 3.4.3 Ο αλγόριθμος αντικατάστασης σελίδας FIFO 260 3.4.4 Ο αλγόριθμος αντικατάστασης σελίδας της δεύτερης ευκαιρίας 261 3.4.5 Ο αλγόριθμος αντικατάστασης σελίδας του ρολογιού 262 3.4.6 Ο αλγόριθμος αντικατάστασης σελίδας LRU 262 3.4.7 Προσομοίωση του αλγορίθμου LRU με λογισμικό 264 3.4.8 Ο αλγόριθμος αντικατάστασης σελίδας του συνόλου εργασίας 265

ΠΕΡΙΕΧΟΜΕΝΑ 11 3.4.9 Ο αλγόριθμος αντικατάστασης σελίδας WSClock 270 3.4.10 Σύνοψη των αλγορίθμων αντικατάστασης σελίδας 272 3.5 ΘΕΜΑΤΑ ΣΧΕΔΙΑΣΜΟΥ ΓΙΑ ΤΑ ΣΥΣΤΗΜΑΤΑ ΣΕΛΙΔΟΠΟΙΗΣΗΣ 273 3.5.1 Τοπικές και καθολικές πολιτικές κατανομής 273 3.5.2 Έλεγχος φορτίου 276 3.5.3 Μέγεθος σελίδας 277 3.5.4 Διαχωρισμός των χώρων εντολών και δεδομένων 278 3.5.5 Κοινόχρηστες σελίδες 279 3.5.6 Κοινόχρηστες βιβλιοθήκες 281 3.5.7 Χαρτογραφημένα αρχεία 284 3.5.8 Πολιτική καθαρισμού 284 3.5.9 Διασύνδεση εικονικής μνήμης 285 3.6 ΖΗΤΗΜΑΤΑ ΥΛΟΠΟΙΗΣΗΣ 286 3.6.1 Η ανάμιξη του λειτουργικού συστήματος στη σελιδοποίηση 286 3.6.2 Χειρισμός σφαλμάτων σελίδας 287 3.6.3 Αντίγραφα ασφαλείας εντολών 288 3.6.4 Κλείδωμα σελίδων στη μνήμη 290 3.6.5 Δευτερεύουσα μνήμη 290 3.6.6 Διαχωρισμός πολιτικής και μηχανισμού 292 3.7 ΤΜΗΜΑΤΟΠΟΙΗΣΗ 294 3.7.1 Υλοποίηση της αμιγούς τμηματοποίησης 298 3.7.2 Τμηματοποίηση με σελιδοποίηση: MULTICS 299 3.7.3 Τμηματοποίηση με σελιδοποίηση: Intel Pentium 303 3.8 Η ΕΡΕΥΝΑ ΓΙΑ ΤΗ ΔΙΑΧΕΙΡΙΣΗ ΜΝΗΜΗΣ 308 3.9 ΠΕΡΙΛΗΨΗ 309 4 ΣΥΣΤΗΜΑΤΑ ΑΡΧΕΙΩΝ 317 4.1 ΑΡΧΕΙΑ 319 4.1.1 Ονομασία αρχείων 319 4.1.2 Δομή των αρχείων 321 4.1.3 Τύποι αρχείων 323 4.1.4 Πρόσβαση στα αρχεία 325 4.1.5 Χαρακτηριστικά αρχείων 326 4.1.6 Λειτουργίες αρχείων 328 4.1.7 Παράδειγμα προγράμματος που χρησιμοποιεί κλήσεις συστήματος αρχείων 329

12 ΠΕΡΙΕΧΟΜΕΝΑ 4.2 ΚΑΤΑΛΟΓΟΙ 332 4.2.1 Συστήματα καταλόγων ενός επιπέδου 332 4.2.2 Ιεραρχικά συστήματα καταλόγων 333 4.2.3 Ονόματα διαδρομών 334 4.2.4 Λειτουργίες καταλόγων 336 4.3 ΥΛΟΠΟΙΗΣΗ ΣΥΣΤΗΜΑΤΟΣ ΑΡΧΕΙΩΝ 338 4.3.1 Διάταξη του συστήματος αρχείων 338 4.3.2 Υλοποίηση των αρχείων 339 4.3.3 Η υλοποίηση των καταλόγων 345 4.3.4 Κοινόχρηστα αρχεία 348 4.3.5 Συστήματα αρχείων με καταγραφική δομή 351 4.3.6 Ημερολογιακά συστήματα αρχείων 353 4.3.7 Εικονικά συστήματα αρχείων 355 4.4 ΔΙΑΧΕΙΡΙΣΗ ΚΑΙ ΒΕΛΤΙΣΤΟΠΟΙΗΣΗ ΣΥΣΤΗΜΑΤΟΣ ΑΡΧΕΙΩΝ 359 4.4.1 Διαχείριση χώρου δίσκου 359 4.4.2 Αντίγραφα ασφαλείας του συστήματος αρχείων 366 4.4.3 Συνέπεια των συστημάτων αρχείων 373 4.4.4 Επιδόσεις των συστημάτων αρχείων 376 4.4.5 Ανασυγκρότηση δίσκων 381 4.5 ΠΑΡΑΔΕΙΓΜΑΤΑ ΣΥΣΤΗΜΑΤΩΝ ΑΡΧΕΙΩΝ 382 4.5.1 Συστήματα αρχείων για CD-ROM 382 4.5.2 Το σύστημα αρχείων του MS-DOS 388 4.5.3 Το σύστημα αρχείων UNIX V7 392 4.6 Η ΕΡΕΥΝΑ ΣΤΑ ΣΥΣΤΗΜΑΤΑ ΑΡΧΕΙΩΝ 395 4.7 ΠΕΡΙΛΗΨΗ 395 5 ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ 401 5.1 ΑΡΧΕΣ ΤΟΥ ΥΛΙΚΟΥ ΕΙΣΟΔΟΥ/ΕΞΟΔΟΥ 401 5.1.1 Συσκευές Ε/Ε 402 5.1.2 Ελεγκτές συσκευών 403 5.1.3 E/E με χαρτογράφηση στη μνήμη 404 5.1.4 Άμεση προσπέλαση μνήμης (DMA) 409 5.1.5 Και πάλι οι διακοπές 412

ΠΕΡΙΕΧΟΜΕΝΑ 13 5.2 ΑΡΧΕΣ ΤΟΥ ΛΟΓΙΣΜΙΚΟΥ Ε/Ε 416 5.2.1 Στόχοι του λογισμικού Ε/Ε 416 5.2.2 Προγραμματισμένη Ε/Ε 418 5.2.3 Ε/Ε οδηγούμενη από διακοπές 420 5.2.4 Ε/Ε με τη χρήση DMA 421 5.3 ΕΠΙΠΕΔΑ ΛΟΓΙΣΜΙΚΟΥ Ε/Ε 421 5.3.1 Χειριστές διακοπών 422 5.3.2 Οδηγοί συσκευών 423 5.3.3 Λογισμικό Ε/Ε ανεξάρτητο από τη συσκευή 427 5.3.4 Λογισμικό Ε/Ε χώρου χρήστη 433 5.4 ΔΙΣΚΟΙ 436 5.4.1 Το υλικό των δίσκων 436 5.4.2 Διαμόρφωση δίσκου 452 5.4.3 Αλγόριθμοι χρονοπρογραμματισμού βραχίονα δίσκου 456 5.4.4 Χειρισμός σφαλμάτων 460 5.4.5 Ευσταθής αποθήκευση 462 5.5 ΡΟΛΟΓΙΑ 466 5.5.1 Το υλικό των ρολογιών 466 5.5.2 Το λογισμικό των ρολογιών 468 5.5.3 Χρονόμετρα λογισμικού 471 5.6 ΔΙΑΣΥΝΔΕΣΕΙΣ ΜΕ ΤΟ ΧΡΗΣΤΗ: ΠΛΗΚΤΡΟΛΟΓΙΟ, ΠΟΝΤΙΚΙ, ΟΘΟΝΗ 473 5.6.1 Λογισμικό εισόδου 473 5.6.2 Λογισμικό εξόδου 479 5.7 ΜΙΚΡΟΠΕΛΑΤΕΣ 496 5.8 ΔΙΑΧΕΙΡΙΣΗ ΙΣΧΥΟΣ 498 5.8.1 Ζητήματα υλικού 499 5.8.2 Ζητήματα που αφορούν το λειτουργικό σύστημα 501 5.8.3 Ζητήματα προγραμμάτων εφαρμογών 507 5.9 Η ΕΡΕΥΝΑ ΓΙΑ ΤΗΝ ΕΙΣΟΔΟ/ΕΞΟΔΟ 508 5.10 ΠΕΡΙΛΗΨΗ 509

14 ΠΕΡΙΕΧΟΜΕΝΑ 6 ΑΔΙΕΞΟΔΑ 517 6.1 ΠΟΡΟΙ 518 6.1.1 Προεκτοπίσιμοι και μη προεκτοπίσιμοι πόροι 518 6.1.2 Απόκτηση πόρων 520 6.2 ΕΙΣΑΓΩΓΗ ΣΤΑ ΑΔΙΕΞΟΔΑ 521 6.2.1 Συνθήκες εμφάνισης αδιεξόδου πόρων 522 6.2.2 Μοντελοποίηση των αδιεξόδων 522 6.3 Ο ΑΛΓΟΡΙΘΜΟΣ ΤΗΣ ΣΤΡΟΥΘΟΚΑΜΗΛΟΥ 526 6.4 ΕΝΤΟΠΙΣΜΟΣ ΚΑΙ ΑΝΑΚΑΜΨΗ ΑΠΟ ΑΔΙΕΞΟΔΑ 526 6.4.1 Εντοπισμός αδιεξόδων όταν υπάρχει ένας πόρος από κάθε είδος 526 6.4.2 Εντοπισμός αδιεξόδων όταν υπάρχουν πολλοί πόροι από κάθε είδος 529 6.4.3 Ανάκαμψη από αδιέξοδο 532 6.5 ΑΠΟΦΥΓΗ ΑΔΙΕΞΟΔΩΝ 533 6.5.1 Τροχιές πόρων 534 6.5.2 Ασφαλείς και ανασφαλείς καταστάσεις 535 6.5.3 Ο αλγόριθμος του τραπεζίτη για ένα μοναδικό πόρο 537 6.5.4 Ο αλγόριθμος του τραπεζίτη για πολλούς πόρους 538 6.6 ΑΠΟΤΡΟΠΗ ΑΔΙΕΞΟΔΩΝ 539 6.6.1 Προσβολή της συνθήκης του αμοιβαίου αποκλεισμού 540 6.6.2 Προσβολή της συνθήκης δέσμευσης και αναμονής 540 6.6.3 Προσβολή της συνθήκης μη προεκτόπισης 541 6.6.4 Προσβολή της συνθήκης κυκλικής αναμονής 541 6.7 ΑΛΛΑ ΘΕΜΑΤΑ 542 6.7.1 Κλείδωμα σε δύο φάσεις 543 6.7.2 Αδιέξοδα επικοινωνίας 544 6.7.3 Ενεργό αδιέξοδο 545 6.7.4 Λιμοκτονία 547 6.8 H ΕΡΕΥΝΑ ΓΙΑ ΤΑ ΑΔΙΕΞΟΔΑ 548 6.9 ΠΕΡΙΛΗΨΗ 548

ΠΕΡΙΕΧΟΜΕΝΑ 15 7 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΠΟΛΥΜΕΣΩΝ 555 7.1 ΕΙΣΑΓΩΓΗ ΣΤΑ ΠΟΛΥΜΕΣΑ 556 7.2 ΑΡΧΕΙΑ ΠΟΛΥΜΕΣΩΝ 561 7.2.1 Κωδικοποίηση βίντεο 562 7.2.2 Κωδικοποίηση ήχου 565 7.3 ΣΥΜΠΙΕΣΗ ΒΙΝΤΕΟ 567 7.3.1 Το πρότυπο JPEG 568 7.3.2 Το πρότυπο MPEG 571 7.4 ΣΥΜΠΙΕΣΗ ΗΧΟΥ 573 7.5 ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΔΙΕΡΓΑΣΙΩΝ ΣΤΑ ΠΟΛΥΜΕΣΑ 577 7.5.1 Χρονοπρογραμματισμός ομογενών διεργασιών 577 7.5.2 Γενικός χρονοπρογραμματισμός σε πραγματικό χρόνο 578 7.5.3 Χρονοπρογραμματισμός RMS 580 7.5.4 Ο χρονοπρογραμματισμός EDF 581 7.6 ΥΠΟΔΕΙΓΜΑΤΑ ΣΥΣΤΗΜΑΤΩΝ ΑΡΧΕΙΩΝ ΠΟΛΥΜΕΣΩΝ 583 7.6.1 Οι λειτουργίες ελέγχου των VCR 584 7.6.2 Βίντεο σχεδόν κατά παραγγελία 587 7.6.3 Βίντεο σχεδόν κατά παραγγελία με λειτουργίες VCR 588 7.7 ΤΟΠΟΘΕΤΗΣΗ ΑΡΧΕΙΩΝ 590 7.7.1 Τοποθέτηση ενός αρχείου σε ένα μοναδικό δίσκο 591 7.7.2 Δύο εναλλακτικές στρατηγικές οργάνωσης αρχείων 592 7.7.3 Τοποθέτηση αρχείων για βίντεο σχεδόν κατά παραγγελία 596 7.7.4 Τοποθέτηση πολλών αρχείων σε ένα μοναδικό δίσκο 597 7.7.5 Τοποθέτηση αρχείων σε πολλούς δίσκους 600 7.8 ΧΡΗΣΗ ΚΡΥΦΗΣ ΜΝΗΜΗΣ 602 7.8.1 Τοποθέτηση μπλοκ στην κρυφή μνήμη 603 7.8.2 Τοποθέτηση αρχείων στην κρυφή μνήμη 604 7.9 ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΔΙΣΚΟΥ ΓΙΑ ΠΟΛΥΜΕΣΑ 605 7.9.1 Στατικός χρονοπρογραμματισμός δίσκου 605 7.9.2 Δυναμικός χρονοπρογραμματισμός δίσκου 607

16 ΠΕΡΙΕΧΟΜΕΝΑ 7.10 Η ΕΡΕΥΝΑ ΣΤΑ ΠΟΛΥΜΕΣΑ 609 7.11 ΠΕΡΙΛΗΨΗ 610 8 ΣΥΣΤΗΜΑΤΑ ΠΟΛΛΑΠΛΩΝ ΕΠΕΞΕΡΓΑΣΤΩΝ 615 8.1 ΠΟΛΥΕΠΕΞΕΡΓΑΣΤΕΣ 618 8.1.1 Υλικό πολυεπεξεργαστών 618 8.1.2 Τύποι λειτουργικών συστημάτων για πολυεπεξεργαστές 627 8.1.3 Συγχρονισμός πολυεπεξεργαστών 631 8.1.4 Χρονοπρογραμματισμός πολυεπεξεργαστών 636 8.2 ΠΟΛΥ-ΥΠΟΛΟΓΙΣΤΕΣ 643 8.2.1 Υλικό πολυ-υπολογιστών 643 8.2.2 Λογισμικό επικοινωνίας χαμηλού επιπέδου 648 8.2.3 Λογισμικό επικοινωνίας επιπέδου χρήστη 650 8.2.4 Κλήση απομακρυσμένων διαδικασιών 653 8.2.5 Kατανεμημένη κοινόχρηστη μνήμη 656 8.2.6 Χρονοπρογραμματισμός πολυ-υπολογιστών 661 8.2.7 Εξισορρόπηση φορτίου 661 8.3 ΕΙΚΟΝΙΚΟΠΟΙΗΣΗ 664 8.3.1 Απαιτήσεις της εικονικοποίησης 666 8.3.2 Υπερεπόπτες τύπου 1 668 8.3.3 Υπερεπόπτες τύπου 2 669 8.3.4 Παρα-εικονικοποίηση 670 8.3.5 Εικονικοποίηση μνήμης 673 8.3.6 Εικονικοποίηση Ε/Ε 674 8.3.7 Εικονικές εφαρμογές 676 8.3.8 Οι εικονικές μηχανές σε πολυπύρηνες CPU 676 8.3.9 Ζητήματα άδειας χρήσης 677 8.4 ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 677 8.4.1 Υλικό δικτύων 680 8.4.2 Υπηρεσίες δικτύων και πρωτόκολλα 684 8.4.3 Ενδιάμεσο λογισμικό που βασίζεται σε έγγραφα 688 8.4.4 Ενδιάμεσο λογισμικό που βασίζεται σε σύστημα αρχείων 689 8.4.5 Ενδιάμεσο λογισμικό που βασίζεται σε αντικείμενα 694 8.4.6 Ενδιάμεσο λογισμικό που βασίζεται σε συντονισμό 696 8.4.7 Πλέγματα 702

ΠΕΡΙΕΧΟΜΕΝΑ 17 8.5 H ΕΡΕΥΝΑ ΣΤΑ ΣΥΣΤΗΜΑΤΑ ΠΟΛΛΑΠΛΩΝ ΕΠΕΞΕΡΓΑΣΤΩΝ 703 8.6 ΠΕΡΙΛΗΨΗ 704 9 ΑΣΦΑΛΕΙΑ 711 9.1 ΤΟ ΠΕΡΙΒΑΛΛΟΝ ΑΣΦΑΛΕΙΑΣ 713 9.1.1 Απειλές 713 9.1.2 Εισβολείς 715 9.1.3 Απώλεια δεδομένων από ατύχημα 716 9.2 ΒΑΣΙΚΕΣ ΑΡΧΕΣ ΚΡΥΠΤΟΓΡΑΦΙΑΣ 717 9.2.1 Κρυπτογραφία μυστικού κλειδιού 718 9.2.2 Κρυπτογραφία δημόσιου κλειδιού 719 9.2.3 Μονόδρομες συναρτήσεις 720 9.2.4 Ψηφιακές υπογραφές 720 9.2.5 Υπομονάδες έμπιστης πλατφόρμας 722 9.3 ΜΗΧΑΝΙΣΜΟΙ ΠΡΟΣΤΑΣΙΑΣ 723 9.3.1 Τομείς προστασίας 723 9.3.2 Λίστες ελέγχου πρόσβασης 726 9.3.3 Δυνατότητες 729 9.3.4 Έμπιστα συστήματα 732 9.3.5 Έμπιστη υπολογιστική βάση 733 9.3.6 Τυπικά μοντέλα ασφαλών συστημάτων 735 9.3.7 Πολυεπίπεδη ασφάλεια 736 9.3.8 Συγκεκαλυμμένα κανάλια 739 9.4 ΠΙΣΤΟΠΟΙΗΣΗ ΤΑΥΤΟΤΗΤΑΣ 744 9.4.1 Πιστοποίηση ταυτότητας με τη χρήση κωδικών πρόσβασης 745 9.4.2 Πιστοποίηση ταυτότητας με τη χρήση φυσικού αντικειμένου 754 9.4.3 Πιστοποίηση ταυτότητας με τη χρήση βιομετρίας 757 9.5 ΕΠΙΘΕΣΕΙΣ ΑΠΟ ΤΟ ΕΣΩΤΕΡΙΚΟ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ 760 9.5.1 Λογικές βόμβες 761 9.5.2 Καταπακτές 761 9.5.3 Παραπλανητική σύνδεση 762 9.6 ΑΞΙΟΠΟΙΗΣΗ ΣΦΑΛΜΑΤΩΝ ΚΩΔΙΚΑ 763 9.6.1 Υπερχείλιση προσωρινής μνήμης 764 9.6.2 Επιθέσεις με συμβολοσειρές μορφοποίησης 767 9.6.3 Επιθέσεις με επιστροφή στη libc 769

18 ΠΕΡΙΕΧΟΜΕΝΑ 9.6.4 Επιθέσεις υπερχείλισης ακεραίων 771 9.6.5 Επιθέσεις με παρεμβολή κώδικα 771 9.6.6 Επιθέσεις με κλιμάκωση προνομίων 772 9.7 ΚΑΚΟΒΟΥΛΟ ΛΟΓΙΣΜΙΚΟ 773 9.7.1 Δούρειοι ίπποι 776 9.7.2 Ιοί 778 9.7.3 Σκουλήκια 789 9.7.4 Λογισμικό κατασκοπίας 792 9.7.5 Rootkit 796 9.8 ΤΡΟΠΟΙ ΑΜΥΝΑΣ 801 9.8.1 Τείχη προστασίας 801 9.8.2 Τεχνικές εναντίον των ιών και προστασίας των ιών από αυτές 804 9.8.3 Υπογραφή κώδικα 811 9.8.4 Φυλάκιση 812 9.8.5 Ανίχνευση εισβολής με βάση μοντέλο 813 9.8.6 Ενθυλάκωση κινητού κώδικα 815 9.8.7 Η ασφάλεια στην Java 820 9.9 Η ΕΡΕΥΝΑ ΓΙΑ ΤΗΝ ΑΣΦΑΛΕΙΑ 823 9.10 ΠΕΡΙΛΗΨΗ 823 10 ΜΕΛΕΤΗ ΠΕΡΙΠΤΩΣΗΣ 1: LINUX 831 10.1 Η ΙΣΤΟΡΙΑ ΤΩΝ UNIX ΚΑΙ LINUX 832 10.1.1 UNICS 832 10.1.2 PDP-11 UNIX 833 10.1.3 Φορητό UNIX 834 10.1.4 Berkeley UNIX 835 10.1.5 Πρότυπο UNIX 836 10.1.6 MINIX 837 10.1.7 Linux 839 10.2 ΓΕΝΙΚΑ ΓΙΑ ΤΟ LINUX 841 10.2.1 Οι στόχοι του Linux 841 10.2.2 Οι διασυνδέσεις του Linux 842 10.2.3 Το κέλυφος 844 10.2.4 Βοηθητικά προγράμματα του Linux 848 10.2.5 Η δομή του πυρήνα 850

ΠΕΡΙΕΧΟΜΕΝΑ 19 10.3 ΟΙ ΔΙΕΡΓΑΣΙΕΣ ΣΤΟ LINUX 853 10.3.1 Θεμελιώδεις έννοιες 853 10.3.2 Κλήσεις συστήματος για τη διαχείριση διεργασιών στο Linux 856 10.3.3 Υλοποίηση διεργασιών και νημάτων στο Linux 861 10.3.4 Ο χρονοπρογραμματισμός στο Linux 867 10.3.5 Η εκκίνηση του Linux 871 10.4 Η ΔΙΑΧΕΙΡΙΣΗ ΜΝΗΜΗΣ ΣΤΟ LINUX 874 10.4.1 Θεμελιώδεις έννοιες 874 10.4.2 Κλήσεις συστήματος για τη διαχείριση μνήμης στο Linux 878 10.4.3 Υλοποίηση της διαχείρισης μνήμης στο Linux 879 10.4.4 Η σελιδοποίηση στο Linux 886 10.5 ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ ΣΤΟ LINUX 889 10.5.1 Θεμελιώδεις έννοιες 889 10.5.2 Δικτύωση 891 10.5.3 Κλήσεις συστήματος για είσοδο/έξοδο στο Linux 893 10.5.4 Υλοποίηση της εισόδου/εξόδου στο Linux 894 10.5.5 Οι υπομονάδες στο Linux 897 10.6 ΤΟ ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ ΤΟΥ LINUX 898 10.6.1 Θεμελιώδεις έννοιες 898 10.6.2 Κλήσεις συστήματος αρχείων στο Linux 903 10.6.3 Υλοποίηση του συστήματος αρχείων του Linux 908 10.6.4 NFS: Το σύστημα αρχείων δικτύου 917 10.7 Η ΑΣΦΑΛΕΙΑ ΣΤΟ LINUX 924 10.7.1 Θεμελιώδεις έννοιες 924 10.7.2 Κλήσεις συστήματος που αφορούν την ασφάλεια στο Linux 927 10.7.3 Υλοποίηση της ασφάλειας στο Linux 928 10.8 ΠΕΡΙΛΗΨΗ 928 11 ΜΕΛΕΤΗ ΠΕΡΙΠΤΩΣΗΣ 2: WINDOWS VISTA 935 11.1 Η ΙΣΤΟΡΙΑ ΤΩΝ WINDOWS VISTA 935 11.1.1 Δεκαετία 1980: MS-DOS 936 11.1.2 Δεκαετία 1990: Windows βασισμένα σε MS-DOS 937 11.1.3 Δεκαετία 2000: Windows βασισμένα σε NT 937 11.1.4 Windows Vista 941

20 ΠΕΡΙΕΧΟΜΕΝΑ 11.2 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΤΑ WINDOWS VISTA 942 11.2.1 Η εγγενής διασύνδεση προγραμματισμού εφαρμογών των NT 945 11.2.2 Η διασύνδεση προγραμματισμού εφαρμογών Win32 949 11.2.3 Το μητρώο των Windows 953 11.3 ΔΟΜΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ 956 11.3.1 Η δομή του λειτουργικού συστήματος 957 11.3.2 Εκκίνηση των Windows Vista 973 11.3.3 Υλοποίηση του διαχειριστή αντικειμένων 974 11.3.4 Υποσυστήματα, DLL, και υπηρεσίες κατάστασης χρήστη 986 11.4 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ ΣΤΑ WINDOWS VISTA 989 11.4.1 Θεμελιώδεις έννοιες 989 11.4.2 Κλήσεις API για τη διαχείριση εργασιών, διεργασιών, νημάτων, και ινών 995 11.4.3 Υλοποίηση διεργασιών και νημάτων 1000 11.5 ΔΙΑΧΕΙΡΙΣΗ ΜΝΗΜΗΣ 1009 11.5.1 Θεμελιώδεις έννοιες 1009 11.5.2 Κλήσεις συστήματος για τη διαχείριση μνήμης 1014 11.5.3 Υλοποίηση της διαχείρισης μνήμης 1016 11.6 ΧΡΗΣΗ ΚΡΥΦΗΣ ΜΝΗΜΗΣ ΣΤΑ WINDOWS VISTA 1026 11.7 ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ ΣΤΑ WINDOWS VISTA 1029 11.7.1 Θεμελιώδεις έννοιες 1029 11.7.2 Κλήσεις API εισόδου/εξόδου 1031 11.7.3 Υλοποίηση της Ε/Ε 1034 11.8 ΤΟ ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ ΤΩΝ WINDOWS ΝΤ 1040 11.8.1 Θεμελιώδεις έννοιες 1040 11.8.2 Υλοποίηση του συστήματος αρχείων των ΝΤ 1042 11.9 Η ΑΣΦΑΛΕΙΑ ΣΤΑ WINDOWS VISTA 1053 11.9.1 Θεμελιώδεις έννοιες 1054 11.9.2 Κλήσεις API που αφορούν την ασφάλεια 1057 11.9.3 Υλοποίηση της ασφάλειας 1058 11.10 ΠΕΡΙΛΗΨΗ 1060

ΠΕΡΙΕΧΟΜΕΝΑ 21 12 ΜΕΛΕΤΗ ΠΕΡΙΠΤΩΣΗΣ 3: ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ SYMBIAN 1065 12.1 Η ΙΣΤΟΡΙΑ ΤΟΥ ΛΕΙΤΟΥΡΓΙΚΟΥ ΣΥΣΤΗΜΑΤΟΣ SYMBIAN 1066 12.1.1 Οι ρίζες του Symbian: Psion και EPOC 1066 12.1.2 Symbian OS έκδοση 6 1068 12.1.3 Symbian OS έκδοση 7 1068 12.1.4 Το Symbian OS σήμερα 1068 12.2 ΓΕΝΙΚΑ ΓΙΑ ΤΟ SYMBIAN OS 1069 12.2.1 Αντικειμενοστρέφεια 1069 12.2.2 Σχεδιασμός μικροπυρήνα 1070 12.2.3 Ο νανοπυρήνας του Symbian OS 1071 12.2.4 Προσπέλαση πόρων πελάτη/διακομιστή 1073 12.2.5 Δυνατότητες μεγαλύτερου λειτουργικού συστήματος 1073 12.2.6 Επικοινωνία και πολυμέσα 1074 12.3 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ ΣΤΟ SYMBIAN OS 1074 12.3.1 Νήματα και νανονήματα 1075 12.3.2 Διεργασίες 1076 12.3.3 Ενεργά αντικείμενα 1077 12.3.4 Διαδιεργασιακή επικοινωνία 1078 12.4 ΔΙΑΧΕΙΡΙΣΗ ΜΝΗΜΗΣ 1078 12.4.1 Συστήματα χωρίς εικονική μνήμη 1079 12.4.2 Πώς απευθύνεται στη μνήμη το Symbian OS 1080 12.5 ΕΙΣΟΔΟΣ ΚΑΙ ΕΞΟΔΟΣ 1083 12.5.1 Οδηγοί συσκευών 1083 12.5.2 Επεκτάσεις πυρήνα 1084 12.5.3 Άμεση προσπέλαση μνήμης 1084 12.5.4 Ειδική περίπτωση: μέσα αποθήκευσης 1085 12.5.5 Ανασταλτική Ε/Ε 1085 12.5.6 Αφαιρούμενα μέσα 1086 12.6 ΣΥΣΤΗΜΑΤΑ ΑΠΟΘΗΚΕΥΣΗΣ 1086 12.6.1 Συστήματα αρχείων κινητών συσκευών 1086 12.6.2 Συστήματα αρχείων του Symbian OS 1087 12.6.3 Ασφάλεια και προστασία του συστήματος αρχείων 1088 12.7 Η ΑΣΦΑΛΕΙΑ ΣΤΟ SYMBIAN OS 1089

22 ΠΕΡΙΕΧΟΜΕΝΑ 12.8 Η ΕΠΙΚΟΙΝΩΝΙΑ ΣΤΟ SYMBIAN OS 1091 12.8.1 Η βασική υποδομή 1092 12.8.2 Μια πιο κοντινή ματιά στην υποδομή 1092 12.9 ΠΕΡΙΛΗΨΗ 1096 13 ΣΧΕΔΙΑΣΗ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ 1099 13.1 Η ΦΥΣΗ ΤΟΥ ΠΡΟΒΛΗΜΑΤΟΣ ΣΧΕΔΙΑΣΗΣ 1100 13.1.1 Στόχοι 1100 13.1.2 Γιατί είναι δύσκολο να σχεδιαστεί ένα λειτουργικό σύστημα; 1101 13.2 ΣΧΕΔΙΑΣΗ ΔΙΑΣΥΝΔΕΣΕΩΝ 1103 13.2.1 Καθοδηγητικές αρχές 1104 13.2.2 Υποδείγματα 1105 13.2.3 Η διασύνδεση κλήσεων συστήματος 1109 13.3 Η ΥΛΟΠΟΙΗΣΗ 1112 13.3.1 Η δομή του συστήματος 1112 13.3.2 Μηχανισμός ή πολιτική; 1116 13.3.3 Ορθογωνικότητα 1117 13.3.4 Ονομασία 1118 13.3.5 Χρόνος δέσμευσης 1120 13.3.6 Στατικές ή δυναμικές δομές; 1121 13.3.7 Αναλυτική ή συνθετική υλοποίηση; 1122 13.3.8 Χρήσιμες τεχνικές 1123 13.4 ΑΠΟΔΟΣΗ 1129 13.4.1 Γιατί είναι αργά τα λειτουργικά συστήματα; 1129 13.4.2 Τι πρέπει να βελτιστοποιηθεί; 1130 13.4.3 Συμβιβασμοί χώρου-χρόνου 1131 13.4.4 Κρυφή μνήμη 1134 13.4.5 Υποδείξεις 1135 13.4.6 Εκμετάλλευση της τοπικότητας 1136 13.4.7 Η βελτιστοποίηση της συνηθισμένης περίπτωσης 1136 13.5 ΔΙΑΧΕΙΡΙΣΗ ΕΡΓΩΝ 1137 13.5.1 Ο μυθικός ανθρωπομήνας 1137 13.5.2 Η δομή της ομάδας 1139 13.5.3 Ο ρόλος της πείρας 1140 13.5.4 Όχι ασημένιες σφαίρες 1142

162 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ ΚΕΦ.2 2.3 ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ Οι διεργασίες χρειάζεται συχνά να επικοινωνούν με άλλες διεργασίες. Για παράδειγμα, σε έναν αγωγό κελύφους (shell pipeline), η έξοδος της πρώτης διεργασίας αποτελεί την είσοδο της δεύτερης, κ.ο.κ. μέχρι το τέλος της γραμμής διαταγής. Επομένως, είναι απαραίτητη η επικοινωνία ανάμεσα στις διεργασίες, η οποία είναι προτιμότερο να γίνεται με καλά δομημένο τρόπο, χωρίς τη χρήση διακοπών. Στις επόμενες ενότητες θα εξετάσουμε τα θέματα που σχετίζονται με τη διαδιεργασιακή επικοινωνία (InterProcess Communication ή IPC). Με λίγα λόγια, εδώ υπάρχουν τρία βασικά ζητήματα. Το πρώτο το θίξαμε πιο πάνω: με ποιο τρόπο μια διεργασία μπορεί να μεταβιβάσει πληροφορίες σε μια άλλη. Το δεύτερο έχει σχέση με την εξασφάλιση ότι δύο ή περισσότερες διεργασίες δεν εμποδίζουν η μια την άλλη όταν εκτελούν κρίσιμες ενέργειες, όπως για παράδειγμα δύο διεργασίες σε ένα σύστημα κράτησης αεροπορικών θέσεων που προσπαθούν να δεσμεύσουν την τελευταία διαθέσιμη θέση για διαφορετικούς επιβάτες. Το τρίτο ζήτημα αφορά την κατάλληλη αλληλουχία ενεργειών όταν υπάρχουν εξαρτήσεις: αν η διεργασία Α παράγει δεδομένα και η διεργασία Β τα τυπώνει, η διεργασία Β πρέπει να περιμένει να εξαχθεί κάποια ποσότητα δεδομένων από την Α πριν ξεκινήσει την εκτύπωση. Θα εξετάσουμε όλα τα ζητήματα αυτά, ξεκινώντας από την επόμενη ενότητα. Είναι επίσης σημαντικό να αναφέρουμε ότι δύο από τα ζητήματα αυτά ισχύουν θαυμάσια και στα νήματα. Το πρώτο η μεταβίβαση πληροφοριών είναι εύκολη υπόθεση για τα νήματα που μοιράζονται έναν κοινό χώρο διευθύνσεων (νήματα διαφορετικών χώρων διευθύνσεων που επιχειρούν να επικοινωνήσουν υπάγονται στην επικοινωνία των διεργασιών). Τα άλλα δύο ζητήματα όμως η αποφυγή παρεμπόδισης και η κατάλληλη ακολουθία ενεργειών ισχύουν εξίσου καλά και στα νήματα. Εμφανίζονται τα ίδια προβλήματα και εφαρμόζονται οι ίδιες λύσεις. Στη συνέχεια θα εξετάσουμε τα ζητήματα στο περιβάλλον των διεργασιών, αλλά σημειώστε ότι τα ίδια προβλήματα και οι ίδιες λύσεις εφαρμόζονται και στην περίπτωση των νημάτων. 2.3.1 Συνθήκες συναγωνισμού Σε ορισμένα λειτουργικά συστήματα, οι συνεργαζόμενες διεργασίες μοιράζονται συχνά την ίδια περιοχή αποθήκευσης, στην οποία η κάθε διεργασία μπορεί να διαβάσει και να γράψει. Η περιοχή αυτή μπορεί να βρίσκεται στην κύρια μνήμη (πιθανόν σε μια δομή δεδομένων του πυρήνα) ή να είναι ένα κοινόχρηστο αρχείο δίσκου η θέση αυτής της περιοχής δεν αλλάζει τη φύση της επικοινωνίας ούτε τα ζητήματα που προκύπτουν. Για να δούμε πώς λειτουργεί στην πράξη η διαδιεργασιακή επικοινωνία, θα μελετήσουμε ένα απλό αλλά συνηθισμένο παράδειγμα: έναν παροχετευτή εκτυπώσεων (print spooler). Όταν μια διεργασία θέλει να τυπώσει ένα αρχείο, καταχωρίζει το όνομα του αρχείου σε έναν ειδικό κατάλογο παροχέτευσης (spooler directory). Μια άλλη διεργασία, ο δαίμονας εκτυπωτή (printer daemon), ελέγχει περιοδικά αν υπάρχουν αρχεία που πρέπει να τυπωθούν και, αν ναι, τα τυπώνει και αφαιρεί τα ονόματά τους από τον κατάλογο. Υποθέστε ότι ο κατάλογος παροχέτευσης διαθέτει ένα πλήθος από υποδοχές, που αριθμούνται ως 0, 1, 2,..., κάθε μία από τις οποίες μπορεί να κρατήσει ένα όνομα αρχείου. Υποθέστε ακόμη ότι διατίθενται δύο κοινόχρηστες μεταβλητές, η out που δείχνει στο επόμενο

ΕΝ. 2.3 ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ 163 αρχείο που πρόκειται να τυπωθεί, και η in, η οποία δείχνει στην επόμενη ελεύθερη υποδοχή του καταλόγου. Οι δύο αυτές μεταβλητές μπορούν να διατηρούνται σε ένα αρχείο δύο λέξεων που είναι διαθέσιμο σε όλες τις διεργασίες. Σε μια συγκεκριμένη στιγμή, οι υποδοχές 0 έως 3 είναι κενές (τα αντίστοιχα αρχεία έχουν ήδη τυπωθεί), ενώ οι υποδοχές 4 έως 6 είναι κατειλημμένες (περιέχουν τα ονόματα των αρχείων που έχουν τοποθετηθεί στην ουρά για να τυπωθούν). Σχεδόν ταυτόχρονα, οι διεργασίες Α και Β αποφασίζουν να προσθέσουν στην ουρά ένα αρχείο προς εκτύπωση. Η συγκεκριμένη κατάσταση παρουσιάζεται στην Εικόνα 2-21. ÊáôÜëïãïò ðáñï Ýôåõóçò Äéåñãáóßá A 4 5 6 7 abc prog.c prog.n out=4 in=7 Äéåñãáóßá B Εικόνα 2-21. Δύο διεργασίες επιχειρούν ταυτόχρονα να προσπελάσουν κοινή μνήμη. Εκεί που ισχύει ο νόμος του Murphy θα μπορούσαν να συμβούν τα εξής: Η διεργασία Α διαβάζει τη μεταβλητή in και αποθηκεύει την τιμή της, που είναι 7, σε μια τοπική μεταβλητή που ονομάζεται next_free_slot. Ακριβώς εδώ συμβαίνει μια διακοπή ρολογιού και η CPU αποφασίζει ότι η διεργασία Α εκτελέστηκε για αρκετό χρόνο, οπότε μεταφέρεται στην εκτέλεση της διεργασίας Β. Αυτή η διεργασία διαβάζει επίσης τη μεταβλητή in λαμβάνοντας επίσης την τιμή 7, την οποία αποθηκεύει στη δική της τοπική μεταβλητή next_ free_slot. Τη στιγμή αυτή, οι δύο διεργασίες πιστεύουν ότι η επόμενη ελεύθερη υποδοχή είναι η 7. Η διεργασία Β συνεχίζει τώρα την εκτέλεσή της. Αποθηκεύει το όνομα του αρχείου της στην υποδοχή 7 και αυξάνει την τιμή της μεταβλητής in σε 8. Στη συνέχεια εκτελεί άλλες λειτουργίες. Τέλος, η διεργασία Α εκτελείται ξανά, ξεκινώντας από το σημείο που βρισκόταν πριν από τη διακοπή. Ελέγχει τη μεταβλητή next_free_slot, η οποία έχει τιμή 7, και καταχωρίζει το όνομα του δικού της αρχείου στην υποδοχή 7, διαγράφοντας το όνομα του αρχείου που η διεργασία Β τοποθέτησε εκεί. Στη συνέχεια υπολογίζει την τιμή της πράξης next_free_slot + 1, βρίσκει την τιμή 8, και την καταχωρίζει στη μεταβλητή in. Ο κατάλογος παροχέτευσης είναι εσωτερικά συνεπής, ο δαίμονας του εκτυπωτή δε θα παρατηρήσει κάτι ασυνήθιστο, αλλά η διεργασία Β δε θα δεχθεί ποτέ καμία έξοδο. Ο χρήστης Β θα περιμένει γεμάτος αγωνία δίπλα στον εκτυπωτή για χρόνια, περιμένοντας μια έξοδο που δε θα έλθει ποτέ. Αυτές οι καταστάσεις, στις οποίες δύο ή περισσότερες διεργασίες διαβάζουν ή γράφουν κοινά δεδομένα και το τελικό αποτέλεσμα εξαρτάται από το πότε ακριβώς θα εκτελεστεί η κάθε μία, ονομάζονται Αν υπάρχει η πιθανότητα κάτι να πάει στραβά, θα πάει.

164 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ ΚΕΦ.2 συνθήκες συναγωνισμού (race conditions). Η αποσφαλμάτωση προγραμμάτων που περιλαμβάνουν συνθήκες συναγωνισμού δεν είναι καθόλου ευχάριστη. Τα αποτελέσματα των περισσότερων δοκιμαστικών εκτελέσεων είναι ολόσωστα, αλλά εντελώς αναπάντεχα συμβαίνει κάτι παράξενο και ανεξήγητο. 2.3.2 Κρίσιμες περιοχές Πώς μπορούμε να αποφύγουμε τις συνθήκες συναγωνισμού; Το πιο σημαντικό ζήτημα για την αποφυγή των προβλημάτων, τόσο στο θέμα που εξετάζουμε όσο και στις περιπτώσεις που υπάρχει κοινή χρήση μνήμης, αρχείων, ή οποιασδήποτε άλλης οντότητας, είναι η εύρεση κάποιας μεθόδου ώστε να μην επιτρέπεται σε περισσότερες από μία διεργασίες η ανάγνωση ή η εγγραφή των κοινών δεδομένων, την ίδια χρονική στιγμή. Με άλλα λόγια, αυτό που χρειαζόμαστε είναι ο αμοιβαίος αποκλεισμός (mutual exclusion), δηλαδή μια μέθοδος που θα εξασφαλίζει ότι, αν μια διεργασία χρησιμοποιεί μια κοινή μεταβλητή ή αρχείο, οι άλλες διεργασίες θα αποκλείονται από την εκτέλεση της ίδιας ενέργειας. Στο προηγούμενο παράδειγμα, το πρόβλημα προήλθε από το γεγονός ότι η διεργασία Β χρησιμοποίησε μια κοινή μεταβλητή, πριν η Α ολοκληρώσει τις ενέργειες που είχαν σχέση με τη μεταβλητή αυτή. Η επιλογή των κατάλληλων θεμελιωδών λειτουργιών για την επίτευξη του αμοιβαίου αποκλεισμού είναι ένα σημαντικό θέμα για το σχεδιασμό λειτουργικών συστημάτων, και ένα θέμα που θα αναλύσουμε στις επόμενες ενότητες. Το πρόβλημα της αποφυγής συνθηκών συναγωνισμού μπορεί να εκφραστεί και με αφαιρετικό τρόπο. Υπάρχουν χρονικά διαστήματα που οι διεργασίες απασχολούνται με εσωτερικούς υπολογισμούς και άλλα θέματα που δεν οδηγούν σε συνθήκες συναγωνισμού. Σε άλλα όμως χρονικά διαστήματα, οι διεργασίες πρέπει να προσπελάσουν κοινόχρηστες περιοχές μνήμης ή αρχεία, ή να εκτελέσουν ενέργειες που είναι δυνατόν να οδηγήσουν σε συναγωνισμό. Το τμήμα ενός προγράμματος, στο οποίο γίνεται προσπέλαση κοινόχρηστης μνήμης, ονομάζεται κρίσιμη περιοχή (critical region) ή κρίσιμο τμήμα (critical section). Αν μπορούσαμε να εξασφαλίσουμε ότι ποτέ δύο ή περισσότερες διεργασίες δε θα βρίσκονται ταυτόχρονα σε κρίσιμες περιοχές, θα αποφεύγαμε το συναγωνισμό. Αν και η απαίτηση αυτή αποφεύγει τις συνθήκες συναγωνισμού, δεν είναι επαρκής για τη σωστή και αποδοτική συνεργασία παράλληλων διεργασιών που χρησιμοποιούν κοινόχρηστα δεδομένα. Μια ικανοποιητική λύση προϋποθέτει τις εξής τέσσερις συνθήκες: 1. Δύο διεργασίες δε βρίσκονται ποτέ ταυτόχρονα στις κρίσιμες περιοχές τους. 2. Δεν επιτρέπονται παραδοχές σε ό,τι αφορά την ταχύτητα ή το πλήθος των επεξεργαστών. 3. Διεργασία που δε βρίσκεται σε κρίσιμο τμήμα δεν επιτρέπεται να μπλοκάρει άλλες διεργασίες. 4. Δεν επιτρέπεται μια διεργασία να αναμένει επαόριστον να μπει στην κρίσιμη περιοχή της. Από αφαιρετική σκοπιά, η συμπεριφορά που χρειαζόμαστε παρουσιάζεται στην Εικόνα 2-22. Εδώ, η διεργασία Α εισέρχεται στην κρίσιμη περιοχή της τη χρονική στιγμή T 1. Λίγο αρ-

ΕΝ. 2.3 ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ 165 γότερα, τη χρονική στιγμή T 2, η διεργασία Β προσπαθεί να μπει στην κρίσιμη περιοχή της, αλλά αποτυγχάνει καθώς μια άλλη διεργασία βρίσκεται ήδη στην κρίσιμη περιοχή της και αυτό επιτρέπεται μόνο για μία διεργασία κάθε φορά. Συνεπώς, η Β αναστέλλεται προσωρινά μέχρι τη χρονική στιγμή T 3, στην οποία η Α βγαίνει από την κρίσιμη περιοχή της και επιτρέπει έτσι στη Β να μπει αμέσως στη δική της. Τέλος, η Β βγαίνει (τη χρονική στιγμή T 4 ) από τη δική της κρίσιμη περιοχή και επιστρέφουμε στην αρχική κατάσταση όπου δεν υπάρχουν διεργασίες που βρίσκονται στην κρίσιμη περιοχή τους. Ç Á åéóýñ åôáé óôçí êñßóéìç ðåñéï Þ Ç Á âãáßíåé áðü ôçí êñßóéìç ðåñéï Þ Äéåñãáóßá Á Ç Â áðïðåéñüôáé íá åéóýëèåé óôçí êñßóéìç ðåñéï Þ Ç Â åéóýñ åôáé óôçí êñßóéìç ðåñéï Þ Ç Â âãáßíåé áðü ôçí êñßóéìç ðåñéï Þ Äéåñãáóßá Â Ç Â åßíáé T1 T2 ìðëïêáñéóìýíç T3 T4 ñüíïò Εικόνα 2-22. Αμοιβαίος αποκλεισμός με τη χρήση κρίσιμων περιοχών. 2.3.3 Αμοιβαίος αποκλεισμός μέσω αναμονής με απασχόληση Στην ενότητα αυτή θα εξετάσουμε διάφορες προτάσεις για την επίτευξη του αμοιβαίου αποκλεισμού ώστε, στο διάστημα που μια διεργασία ενημερώνει την κοινόχρηστη περιοχή μνήμης, καμία άλλη να μην μπαίνει στο δικό της κρίσιμο τμήμα ώστε να δημιουργηθεί πρόβλημα. Απενεργοποίηση διακοπών Σε ένα σύστημα με έναν επεξεργαστή, η απλούστερη λύση είναι κάθε διεργασία που μπαίνει στην κρίσιμη περιοχή της να απενεργοποιεί όλες τις διακοπές και να τις επανενεργοποιεί αμέσως πριν βγει από αυτή. Όταν απενεργοποιούνται οι διακοπές δεν μπορούν να συμβούν ούτε διακοπές ρολογιού. Η CPU εναλλάσσεται μεταξύ των διεργασιών μόνο μετά από διακοπές ρολογιού ή άλλου είδους, οπότε, με την απενεργοποίηση των διακοπών η CPU δεν πρόκειται να μεταφερθεί σε άλλη διεργασία. Επομένως, από τη στιγμή που μια διεργασία θα απενεργοποιήσει τις διακοπές, μπορεί να εξετάσει και να ενημερώσει την κοινόχρηστη μνήμη χωρίς το φόβο ότι θα παρεμβληθεί κάποια άλλη διεργασία. Η συγκεκριμένη λύση θεωρείται γενικά μη ελκυστική, μια και δεν είναι έξυπνο να δίνεται σε διεργασίες χρήστη η δικαιοδοσία απενεργοποίησης των διακοπών. Ας υποθέσουμε ότι μια διεργασία χρήστη απενεργοποίησε τις διακοπές και δεν τις επανέφερε ποτέ σε λειτουργία

166 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ ΚΕΦ.2 ξανά. Αυτό θα έβαζε τέλος στη λειτουργία του συστήματος. Ακόμη, αν το σύστημα είναι πολυεπεξεργαστικό (δηλαδή έχει δύο ή περισσότερες CPU), η απενεργοποίηση των διακοπών θα επηρεάσει μόνο τη CPU που εκτέλεσε την εντολή disable. Οι υπόλοιπες θα συνεχίσουν την εκτέλεσή τους, έχοντας τη δυνατότητα να προσπελάσουν την κοινόχρηστη μνήμη. Από την άλλη, συχνά είναι βολικό ο πυρήνας να απενεργοποιεί τις διακοπές για μερικές ε- ντολές, για το χρονικό διάστημα που ενημερώνει μεταβλητές ή λίστες. Αν, για παράδειγμα, παρουσιαστεί διακοπή τη στιγμή που η λίστα των έτοιμων διεργασιών δε βρίσκεται σε συνεπή κατάσταση, τότε μπορεί να εμφανιστούν συνθήκες συναγωνισμού. Το γενικό συμπέρασμα: η απενεργοποίηση των διακοπών είναι συχνά μια χρήσιμη τεχνική για το λειτουργικό σύστημα όταν προκαλείται από το ίδιο, αλλά δεν ενδείκνυται ως γενικός μηχανισμός αμοιβαίου αποκλεισμού για τις διεργασίες χρήστη. Η πιθανότητα επίτευξης αμοιβαίου αποκλεισμού μέσω της απενεργοποίησης των διακοπών ακόμη και μέσα στον πυρήνα μειώνεται κάθε μέρα λόγω του αυξανόμενου αριθμού των πολυπύρηνων τσιπ ακόμη και σε PC της χαμηλής κατηγορίας τιμής. Οι δύο πυρήνες είναι ήδη κάτι συνηθισμένο, τέσσερις υπάρχουν σε μηχανές αιχμής, και οι οκτώ ή οι 16 δεν απέχουν πολύ να εμφανιστούν. Σε ένα πολυπύρηνο (δηλαδή πολυεπεξεργαστικό) σύστημα, η απενεργοποίηση των διακοπών της μιας CPU δεν εμποδίζει τις άλλες να παρεμβαίνουν στις λειτουργίες που εκτελεί η πρώτη CPU. Επομένως, χρειάζονται πιο σύνθετες μέθοδοι. Μεταβλητές κλειδώματος Σε μια δεύτερη προσπάθεια, ας αναζητήσουμε μια λύση μέσω λογισμικού. Ας θεωρήσουμε μια απλή, κοινόχρηστη μεταβλητή (μεταβλητή κλειδώματος lock variable) με αρχική τιμή 0. Όταν μια διεργασία θέλει να μπει στην κρίσιμη περιοχή της, ελέγχει πρώτα τη μεταβλητή αυτή. Αν έχει τιμή 0, τότε την αλλάζει σε 1 και μπαίνει στην κρίσιμη περιοχή. Αν όμως η τιμή αυτή είναι ήδη 1, τότε η διεργασία περιμένει μέχρι να γίνει πάλι 0. Συνεπώς, το 0 σημαίνει ότι καμία διεργασία δε βρίσκεται στην κρίσιμη περιοχή της, ενώ το 1 ότι κάποια διεργασία βρίσκεται στην κρίσιμη περιοχή της. Δυστυχώς, η συγκεκριμένη ιδέα περιέχει το ίδιο ακριβώς μοιραίο ψεγάδι που παρατηρήσαμε στον κατάλογο παροχέτευσης. Έστω ότι μια διεργασία διαβάζει τη μεταβλητή κλειδώματος και διαπιστώνει ότι περιέχει την τιμή 0. Πριν την αλλάξει σε 1, μια άλλη διεργασία χρονοπρογραμματίζεται, εκτελείται, και θέτει στη μεταβλητή την τιμή 1. Μόλις η πρώτη διεργασία επανεκτελείται, θέτει εκ νέου την τιμή 1 στη μεταβλητή και τελικά οι δύο διεργασίες βρίσκονται ταυτόχρονα στην κρίσιμη περιοχή τους. Ίσως να σκεφθήκατε ότι θα μπορούσαμε να παρακάμψουμε αυτό το πρόβλημα διαβάζοντας πρώτα την τιμή της μεταβλητής κλειδώματος και στη συνέχεια ελέγχοντας την τιμή αυτή πάλι αμέσως πριν την αλλάξουμε, αλλά ούτε αυτή η μέθοδος βοηθάει. Ο συναγωνισμός τώρα θα συμβεί αν η δεύτερη διεργασία τροποποιήσει τη μεταβλητή κλειδώματος αμέσως μόλις η πρώτη ολοκληρώσει το δεύτερο έλεγχό της. Αυστηρή εναλλαγή Μια τρίτη προσέγγιση στο πρόβλημα του αμοιβαίου αποκλεισμού παρουσιάζεται στην Εικόνα 2-23. Αυτό το τμήμα προγράμματος, όπως και όλα σχεδόν τα υπόλοιπα στο βιβλίο, είναι γραμμένο στη γλώσσα προγραμματισμού C. Η γλώσσα αυτή επιλέχθηκε επειδή τα

ΕΝ. 2.3 ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ 167 πραγματικά λειτουργικά συστήματα γράφονται σχεδόν πάντα σε C (ή κάποιος φορές σε C++), ενώ η χρήση άλλων γλωσσών όπως οι Java, Modula 3, και Pascal είναι σπανιότατη. Η C είναι ισχυρότατη, αποδοτική, και προβλέψιμη, ιδιότητες κρίσιμες για τη γραφή των λειτουργικών συστημάτων. Η Java, για παράδειγμα, δεν είναι προβλέψιμη καθώς μπορεί να παρουσιάσει έλλειψη μνήμης σε κάποια κρίσιμη στιγμή και να χρειάζεται κλήση της περισυλλογής απορριμμάτων (garbage collector) για την απελευθέρωση μνήμης σε εντελώς ακατάλληλη χρονική στιγμή. Αυτό δεν μπορεί να συμβεί στη C επειδή στη γλώσσα αυτή δεν υπάρχει η έννοια της περισυλλογής απορριμμάτων. Στο (Prechelt, 2000) θα βρείτε μια ποσοτική σύγκριση των γλωσσών C, C++, Java και τεσσάρων ακόμη. while (TRUE) { while (TRUE) { while (turn!= 0) /* βρόχος */; while (turn!= 1) /* βρόχος */; critical_region(); critical_region(); turn = 1; turn = 0; noncritical_region(); noncritical_region(); } } (α) (β) Εικόνα 2-23. Μια προτεινόμενη λύση στο πρόβλημα των κρίσιμων περιοχών. (α) Διεργασία 0. (β) Διεργασία 1. Και στις δύο περιπτώσεις, προσέξτε τα ελληνικά ερωτηματικά (;) που τερματίζουν τις εντολές while. Στην Εικόνα 2-23, η ακέραια μεταβλητή turn έχει αρχική τιμή 0 και παρακολουθεί ποια διεργασία έχει σειρά να μπει στην κρίσιμη περιοχή της και να εξετάσει ή να ενημερώσει την κοινόχρηστη μνήμη. Αρχικά η διεργασία 0 ελέγχει την turn, βρίσκει ότι έχει τιμή 0, και μπαίνει στην κρίσιμη περιοχή της. Η διεργασία 1 βρίσκει επίσης ότι η μεταβλητή αυτή έχει τιμή 0 και περιμένει σε ένα βρόχο, ελέγχοντας συνεχώς την turn μέχρι να δει ότι αυτή πήρε την τιμή 1. Ο συνεχής έλεγχος μιας μεταβλητής μέχρι αυτή να πάρει μια συγκεκριμένη τιμή ονομάζεται αναμονή με απασχόληση (busy waiting). Συνήθως πρέπει να αποφεύγεται επειδή σπαταλάει χρόνο της CPU. Η αναμονή με απασχόληση χρησιμοποιείται μόνον όταν υπάρχει σχετική βεβαιότητα ότι η αναμονή θα είναι σύντομη. Το κλείδωμα που χρησιμοποιεί αναμονή με απασχόληση λέγεται κλείδωμα περιστροφής (spin lock). Όταν η διεργασία 0 εγκαταλείψει την κρίσιμη περιοχή, αλλάζει την τιμή της turn σε 1, ε- πιτρέποντας έτσι στη διεργασία 1 να μπει στη δική της κρίσιμη περιοχή. Υποθέστε ότι η διεργασία 1 ολοκληρώνει γρήγορα την κρίσιμη περιοχή της, ώστε και οι δύο διεργασίες να βρίσκονται στη μη κρίσιμη περιοχή τους ενώ η turn έχει την τιμή 0. Τώρα η διεργασία 0 εκτελεί πολύ γρήγορα το βρόχο της, και βγαίνει από την κρίσιμη περιοχή της δίνοντας στην turn την τιμή 1. Στο σημείο αυτό, η turn έχει την τιμή 1 και οι δύο διεργασίες εκτελούνται στη μη κρίσιμη περιοχή τους. Ξαφνικά, η διεργασία 0 ολοκληρώνει τη μη κρίσιμη περιοχή της και επανέρχεται στην αρχή του βρόχου. Δυστυχώς, δεν επιτρέπεται να μπει αμέσως στην κρίσιμη περιοχή της, αφού η μεταβλητή turn έχει την τιμή 1 και η διεργασία 1 είναι στη μη κρίσιμη περιοχή της. Περιμένει λοιπόν στο βρόχο while, μέχρι η διεργασία 1 να αλλάξει την τιμή της turn σε 0. Με άλλα λόγια, η αυστηρή εναλλαγή δεν ενδείκνυται όταν η μία από τις δύο διεργασίες είναι πολύ βραδύτερη από την άλλη.

168 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ ΚΕΦ.2 Η κατάσταση αυτή παραβαίνει την τρίτη συνθήκη που θέσαμε προηγουμένως: η διεργασία 0 μπλοκάρεται από διεργασία που βρίσκεται στη μη κρίσιμη περιοχή της. Επιστρέφοντας στο θέμα του καταλόγου παροχέτευσης που περιγράψαμε σε προηγούμενη ενότητα, αν αντιστοιχίσουμε την κρίσιμη περιοχή με την ανάγνωση και την εγγραφή στον κατάλογο παροχέτευσης, η διεργασία 0 δεν καταφέρνει να τυπώσει ένα ακόμη αρχείο επειδή η διεργασία 1 κάνει κάτι άλλο. Στην πραγματικότητα, η λύση αυτή προϋποθέτει την αυστηρή εναλλαγή των διεργασιών, όσο αφορά την είσοδο στις κρίσιμες περιοχές τους, όπως για παράδειγμα στην παροχέτευση αρχείων. Δε θα επιτραπεί σε καμία να παροχετεύσει δύο αρχεία στη σειρά. Παρόλο που ο αλγόριθμος αυτός αποφεύγει όλες τις συνθήκες συναγωνισμού, δεν αποτελεί σοβαρή υποψήφια λύση επειδή παραβιάζει τη συνθήκη 3. Η λύση του Peterson Συνδυάζοντας την ιδέα της εναλλαγής στην εκτέλεση των διεργασιών με αυτή των μεταβλητών κλειδώματος, ο Ολλανδός μαθηματικός Τ. Dekker ήταν ο πρώτος θεωρητικός που επινόησε λύση μέσω λογισμικού για το πρόβλημα του αμοιβαίου αποκλεισμού, η οποία μάλιστα δεν προϋποθέτει αυστηρή εναλλαγή. Για τη μελέτη του αλγορίθμου του Dekker μπορείτε να ανατρέξετε στο (Dijkstra, 1965). Το 1981, ο G. L. Peterson ανακάλυψε έναν απλούστερο τρόπο για την επίτευξη αμοιβαίου αποκλεισμού, κάνοντας παρωχημένη τη λύση του Dekker. Ο αλγόριθμος του Peterson παρουσιάζεται στην Εικόνα 2-24. Ο αλγόριθμος αυτός αποτελείται από δύο διαδικασίες γραμμένες σε γλώσσα ANSI C, πράγμα που σημαίνει ότι πρέπει να περιλαμβάνονται στον κώδικα όλα τα πρωτότυπα συναρτήσεων (function prototypes) για όλες τις συναρτήσεις που ορίζονται και χρησιμοποιούνται. Για να κερδίσουμε όμως χώρο, θα παραλείψουμε τα πρωτότυπα τόσο στο επόμενο παράδειγμα όσο και σε αυτά που θα ακολουθήσουν. Πριν χρησιμοποιήσει τις κοινόχρηστες μεταβλητές (δηλαδή πριν μπει στην κρίσιμη περιοχή της), κάθε διεργασία καλεί την enter_region με παράμετρο τον αριθμό της, 0 ή 1. Η κλήση αυτή θα αναγκάσει τη διεργασία να περιμένει μέχρι να εξασφαλιστεί η ασφαλής είσοδος στην κρίσιμη περιοχή της. Αφού τελειώσει την εργασία της με τις κοινόχρηστες μεταβλητές, η διεργασία καλεί τη leave_region για να γνωστοποιήσει ότι τελείωσε και να επιτρέψει στην άλλη διεργασία να μπει στην κρίσιμη περιοχή της, αν βέβαια εκείνη θέλει. Ας δούμε τώρα πώς λειτουργεί αυτή η λύση. Αρχικά καμία διεργασία δε βρίσκεται στην κρίσιμη περιοχή της. Η διεργασία 0 καλεί την enter_region. Εκδηλώνει το ενδιαφέρον της να μπει στην κρίσιμη περιοχή δίνοντας στο αντίστοιχο στοιχείο του πίνακα interested την τιμή TRUE και στη μεταβλητή turn την τιμή 0. Εφόσον η διεργασία 1 δεν ενδιαφέρεται, η enter_region επιστρέφει αμέσως. Αν η διεργασία 1 καλέσει αργότερα με τη σειρά της την enter_region, θα περιμένει μέχρι το στοιχείο interested[0] να γίνει FALSE, γεγονός που συμβαίνει μόνον όταν η διεργασία 0 καλέσει τη leave_region για να βγει από την κρίσιμη περιοχή της. Ας εξετάσουμε τώρα την περίπτωση στην οποία οι δύο διεργασίες καλούν σχεδόν ταυτόχρονα την enter_region. Προφανώς θα αποθηκεύσουν και οι δύο τον αριθμό τους στη μεταβλητή turn. Σε αυτή τη μεταβλητή θα παραμείνει όμως ο αριθμός που αποθηκεύτηκε τελευταίος, ενώ αυτός που αποθηκεύτηκε πρώτος θα αντικατασταθεί και θα χαθεί. Υποθέστε ότι η διεργασία 1 είναι η τελευταία που αποθηκεύει και, συνεπώς, η turn έχει τιμή 1. Όταν φτά-

ΕΝ. 2.3 ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ 169 σουν και οι δύο διεργασίες στην εντολή while, η διεργασία 0 την εκτελεί μηδέν φορές και μπαίνει αμέσως στην κρίσιμη περιοχή της. Η διεργασία 1 όμως επαναλαμβάνει συνεχώς την εντολή και δεν μπαίνει στην κρίσιμη περιοχή της μέχρι να βγει από το δικό της η διεργασία 0. #define FALSE 0 #define TRUE 1 #define Ν 2 /* το πλήθος των διεργασιών */ int turn; /* ποια διεργασία έχει σειρά; */ int interested[n]; /* όλες οι τιμές αρχικά 0 (FALSE) */ void enter_region(int process); /* η process παίρνει τις τιμές 0 και 1 */ { int other; /* ο αριθμός της άλλης διεργασίας */ } other = 1 process; /* n άλλη διεργασία */ interested[process] = TRUE; /* εκδήλωση ενδιαφέροντος */ turn = process; /* απόδοση τιμής στη σημαία */ while (turn == process && interested[other] == TRUE) /* εντολή απραξίας */; void leave-region (int process) /* process: διεργασία που αποχωρεί */ { interested[process] = FALSE; /* γνωστοποίηση εξόδου από κρίσιμη περιοχή */ } Εικόνα 2-24. Η λύση του Peterson για την επίτευξη του αμοιβαίου αποκλεισμού. Η εντολή TSL Ας δούμε τώρα μια πρόταση που απαιτεί μια μικρή συνδρομή από το υλικό. Μερικοί υπολογιστές, και ειδικά αυτοί που σχεδιάζονται με πρόβλεψη για πολλούς επεξεργαστές, διαθέτουν μια εντολή όπως η TSL REGISTER,LOCK που σημαίνει "Έλεγξε και δώσε την τιμή 1 στο κλείδωμα" (Test and Set Lock) και λειτουργεί ως εξής: Διαβάζει τα περιεχόμενα της λέξης μνήμης lock, τα τοποθετεί στον καταχωρητή REGISTER, και αποθηκεύει μια μη μηδενική τιμή στη διεύθυνση μνήμης lock. Οι πράξεις της ανάγνωσης και της αποθήκευσης στη λέξη αυτή είναι αδιαίρετες, δηλαδή εξασφαλίζεται ότι κανείς άλλος επεξεργαστής δεν μπορεί να προσπελάσει τη λέξη αυτή μέχρι την ολοκλήρωση της εντολής. Η CPU που εκτελεί αυτή την εντολή κλειδώνει το δίαυλο μνήμης (memory bus), ώστε να αποτρέψει την προσπέλαση της λέξης μνήμης από άλλες CPU μέχρι να τελειώσει την εργασία της. Είναι σημαντικό να σημειώσουμε ότι το κλείδωμα του διαύλου της μνήμης είναι πολύ διαφορετικό από την απενεργοποίηση των διακοπών. Η απενεργοποίηση των διακοπών και στη συνέχεια η ανάγνωση μιας λέξης της μνήμης ακολουθούμενη από μια εγγραφή δεν εμποδίζει ένα δεύτερο επεξεργαστή, που βρίσκεται στον ίδιο δίαυλο, να προσπελάσει τη λέξη μεταξύ

170 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΝΗΜΑΤΑ ΚΕΦ.2 της ανάγνωσης και της εγγραφής. Για την ακρίβεια, η απενεργοποίηση των διακοπών στον επεξεργαστή 1 δεν έχει καμία επίδραση στον επεξεργαστή 2. Ο μόνος τρόπος να κρατήσουμε τον επεξεργαστή 2 έξω από τη μνήμη μέχρι ο επεξεργαστής 1 να ολοκληρώσει το έργο του είναι να κλειδώσουμε το δίαυλο, πράγμα που απαιτεί μια ειδική ιδιότητα του υλικού (βασικά, μια γραμμή στο δίαυλο που θα επιβεβαιώνει ότι ο δίαυλος είναι κλειδωμένος και μη διαθέσιμος σε άλλους επεξεργαστές εκτός αυτού που τον κλείδωσε). Για να εφαρμόσουμε την εντολή TSL, θα χρησιμοποιήσουμε την κοινόχρηστη μεταβλητή lock η οποία βοηθάει στο συντονισμό των προσβάσεων στην κοινόχρηστη μνήμη. Όταν η lock έχει την τιμή 0, οποιαδήποτε διεργασία μπορεί να της δώσει την τιμή 1 χρησιμοποιώντας την εντολή TSL και μετά να διαβάσει ή να γράψει στην κοινόχρηστη μνήμη. Όταν τελειώσει το έργο της, η διεργασία ξαναδίνει την τιμή 0 στη lock, με μια απλή εντολή move. Πώς μπορεί να χρησιμοποιηθεί η εντολή αυτή για να αποτρέψει την ταυτόχρονη είσοδο δύο διεργασιών στην κρίσιμη περιοχή τους; Η λύση δίνεται στην Εικόνα 2-25. Στο παράδειγμα αυτό παρουσιάζεται μια υπορουτίνα τεσσάρων εντολών γραμμένη σε φανταστική (αλλά τυπική) γλώσσα μηχανής. Η πρώτη εντολή αντιγράφει το περιεχόμενο της lock στον καταχωρητή και δίνει την τιμή 1 στη lock. Μετά, η παλιά τιμή συγκρίνεται με το 0. Αν δεν είναι μηδέν, αν δηλαδή η lock έχει πάρει τιμή από άλλη διεργασία, το πρόγραμμα επιστρέφει στην αρχή και ελέγχει τη lock ξανά. Αργά η γρήγορα, η μεταβλητή αυτή θα πάρει την τιμή 0 (όταν η διεργασία που βρίσκεται προς το παρόν στην κρίσιμη περιοχή της βγει από αυτή), και τότε η υπορουτίνα θα επιστρέψει έχοντας ενεργοποιήσει το κλείδωμα. Η άρση του κλειδώματος από το πρόγραμμα είναι απλή, μια και αρκεί η αποθήκευση της τιμής 0 στη μεταβλητή lock. Δε χρειάζονται ειδικές εντολές συγχρονισμού. enter_region: TSL REGISTER, LOCK Αντιγραφή του κλειδώματος στον καταχωρητή και ανάθεση της τιμής 1 στη lock CMP REGISTER,#0 Είχε η lock την τιμή 0; JNE enter_region Αν η lock είχε μη μηδενική τιμή, της είχε δοθεί μη μηδενική τιμή, άρα επανάληψη του βρόχου RET Επιστροφή στην καλούσα διεργασία είσοδος στην κρίσιμη περιοχή leave_region: MOVE LOCK,#0 RET Αποθήκευση της τιμής 0 στη lock Επιστροφή στην καλούσα διεργασία Εικόνα 2-25. Είσοδος και έξοδος από την κρίσιμη περιοχή, με τη χρήση της εντολής TSL. Μια λύση στο πρόβλημα της κρίσιμης περιοχής είναι πλέον σαφής. Πριν μπει μια διεργασία στην κρίσιμη περιοχή της, καλεί την enter_region η οποία εκτελεί αναμονή με απασχόληση μέχρι να ελευθερωθεί το κλείδωμα. μετά, αποκτά τον έλεγχο του κλειδώματος και επιστρέφει. Με το τέλος των εργασιών στην κρίσιμη περιοχή, η διεργασία καλεί τη leave_region, η οποία δίνει την τιμή 0 στη lock. Όπως και όλες οι λύσεις που βασίζονται στη μέθοδο της κρίσιμης περιοχής, οι διεργασίες οφείλουν να καλούν τις υπορουτίνες enter_region και leave_region την κατάλληλη στιγμή, προκειμένου να εξασφαλιστεί η ομαλή λειτουργία της μεθόδου. Αν κάποια διεργασία κάνει ζαβολιά, ο αμοιβαίος αποκλεισμός θα αποτύχει.

ΕΝ. 2.3 ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ 171 Μια εναλλακτική εντολή αντί για την TSL είναι η XCHG, η οποία ανταλλάσσει τα περιεχόμενα δύο θέσεων αδιαίρετα (είναι όπως και η TSL αδιαίρετη εντολή, δηλαδή εκτελεί τις δύο ενέργειές της χωρίς να διακόπτεται), για παράδειγμα, ενός καταχωρητή και μιας λέξης μνήμης. Ο κώδικας παρουσιάζεται στην Εικόνα 2-26 και, όπως βλέπετε, βασικά είναι ίδιος με τη λύση της εντολής TSL. Όλες οι CPU Intel x86 χρησιμοποιούν την εντολή XCHG για συγχρονισμό χαμηλού επιπέδου. enter_region: MOVE REGISTER,#1 XCHG REGISTER,LOCK CMP REGISTER,#0 JNE enter_region RET leave_region: MOVE LOCK,#0 RET Τιμή 1 στον καταχωρητή Ανταλλαγή περιεχομένων καταχωρητή και μεταβλητής lock Ήταν η lock μηδέν; Αν δεν ήταν μηδέν, είχε πάρει μη μηδενική τιμή, άρα βρόχος Επιστροφή στον καλούντα είσοδος στην κρίσιμη περιοχή Αποθήκευση της τιμής 0 στη lock Επιστροφή στην καλούσα διεργασία Εικόνα 2-26. Είσοδος και έξοδος από την κρίσιμη περιοχή με την εντολή XCHG. 2.3.4 Λήθαργος και αφύπνιση Τόσο η λύση του Peterson όσο και η λύση που χρησιμοποιεί τις εντολές TSL ή XCHG είναι σωστές, αλλά παρουσιάζουν το ελάττωμα ότι χρειάζονται αναμονή με απασχόληση. Ουσιαστικά, οι δύο αυτές λύσεις λειτουργούν ως εξής: όταν μια διεργασία θέλει να μπει στην κρίσιμη περιοχή της, ελέγχει αν αυτό επιτρέπεται. Αν δεν επιτρέπεται, η διεργασία εκτελεί συνεχώς ένα βρόχο αναμένοντας να απελευθερωθεί η είσοδος στην κρίσιμη περιοχή. Αυτή η προσέγγιση περιλαμβάνει όχι μόνο σπατάλη χρόνου της CPU αλλά και απρόβλεπτες παρενέργειες. Σκεφθείτε έναν υπολογιστή που εκτελεί δύο διεργασίες, την Υ που έχει υψηλή προτεραιότητα και τη Χ που έχει χαμηλή. Οι κανόνες χρονοπρογραμματισμού επιβάλλουν την εκτέλεση της Υ μόλις αυτή βρεθεί σε κατάσταση ετοιμότητας. Σε κάποια χρονική στιγμή και ενώ η Χ βρίσκεται σε κρίσιμο τμήμα, η Υ είναι έτοιμη να εκτελεστεί (για παράδειγμα, μετά από την ολοκλήρωση μιας λειτουργίας εισόδου/εξόδου). Στη συνέχεια, η διεργασία Υ ξεκινάει αναμονή με απασχόληση αλλά, μια και η Χ δε χρονοπρογραμματίζεται ποτέ όταν εκτελείται η Υ, η Χ δεν αποκτάει ποτέ τη δυνατότητα να εγκαταλείψει το κρίσιμο τμήμα της και συνεπώς η Υ επαναλαμβάνει αδιάκοπα το βρόχο αναμονής, χωρίς αποτέλεσμα. Η κατάσταση αυτή αναφέρεται μερικές φορές με τον όρο πρόβλημα αντιστροφής προτεραιοτήτων (priority inversion problem). Ας δούμε τώρα μερικές θεμελιώδεις αρχές της διαδιεργασιακής επικοινωνίας, οι οποίες μπλοκάρουν τις διεργασίες αντί να σπαταλούν το χρόνο της CPU όταν αυτές δεν επιτρέπεται να μπουν στις κρίσιμες περιοχές τους. Μία από τις απλούστερες αφορά το ζεύγος κλήσεων sleep (λήθαργος) και wakeup (αφύπνιση). Η sleep είναι μια κλήση συστήματος που μπλοκάρει την καλούσα διεργασία, πράγμα που σημαίνει ότι αυτή αναστέλλεται μέχρι κάποια άλλη διεργασία να την ξυπνήσει. Η κλήση wakeup διαθέτει μία παράμετρο, τη διεργασία που πρόκειται να ξυπνήσει. Εναλλακτικά, και οι δύο κλήσεις συντάσσονται με μία παράμετρο η ο-