Αμοιβαίος αποκλεισμός 1. Εισαγωγή 2. Κρίσιμα τμήματα (Critical Sections) 3. Υλοποίηση του αμοιβαίου αποκλεισμού I. Προσεγγίσεις λογισμικού II. Υποστήριξη εκ μέρους του υλικού III. Σηματοφορείς 4. Κλασσικά προβλήματα συγχρονισμού 1
1. Εισαγωγή Ο αμοιβαίος αποκλεισμός είναι ο αποκλεισμός μιας διεργασίας από μια ενέργεια που επιτελεί ταυτοχρόνως κάποια άλλη διεργασία. Απαιτεί μόνο μία διεργασία να πραγματοποιεί λειτουργίες σε κοινούς πόρους. Αν δύο διεργασίες προσπαθήσουν να αποκτήσουν ένα κοινό πόρο, τότε η μία θα πρέπει να αναμένει. Για την αποφυγή των παρενεργειών λόγω ανταγωνισμού είναι ζωτικής σημασίας η πρόβλεψη και η αποτροπή χρήσης διαμοιραζόμενων πόρων από περισσότερες από μια διεργασίες την ίδια χρονική στιγμή. Είναι απαραίτητος για την προστασία των κρισίμων τμημάτων των διεργασιών. 2
Η επιλογή των κατάλληλων λειτουργιών για την επίτευξη του αμοιβαίου αποκλεισμού είναι σημαντικό θέμα κατά το σχεδιασμό των Λ.Σ. Η διαχείριση του αμοιβαίου αποκλεισμού γίνεται μέσω : Προστασίας πρόσβασης σε πόρους μέσω μηχανισμών συγχρονισμού Ενδεχόμενου συγχρονισμού (σε πολλές περιπτώσεις) μέσω των κλήσεων συστήματος, χωρίς η μέθοδος αυτή να είναι πάντοτε αποτελεσματική επειδή πολλές κλήσεις συστήματος είναι επανεισαγόμενες (reentrant). Όταν δύο ή περισσότερες διεργασίες είναι πιθανό να ζητήσουν και να εκτελέσουν συγχρόνως μια κοινή διαδικασία ο κώδικας της διαδικασίας χαρακτηρίζεται ως επανεισαγόμενος. Τέτοιες διαδικασίες πρέπει να χρησιμοποιούν επανεισαγόμενο κώδικα για να αποθηκεύουν τα συγκεκριμένα δεδομένα κάθε διεργασίας σε θέσεις μνήμης που είναι τοπικές στην κάθε διεργασία. 3
Παράδειγμα - 1 Κατάθεση 100 Ανάγνωση τρέχοντος υπολοίπου = 500 Απαίτηση ανάληψης 100 Χρονική καθυστέρηση Νέο υπόλοιπο= 500 + 100 = 600 Εγγραφή νέου υπολοίπου στο δίσκο = 600 Ανάγνωση τρέχοντος υπολοίπου = 500 Νέο υπόλοιπο= 500-100 = 400 Χρονική καθυστέρηση Εγγραφή νέου υπολοίπου στο δίσκο = 400 4
Κατάθεση 100 Απαίτηση για δέσμευση του λογαριασμού Ανάγνωση υπολοίπου από το δίσκο = 500 υπόλοιπο = 500 + 100 = 600 Εγγραφή νέου υπολοίπου στο δίσκο = 600 Απελευθέρωση λογαριασμού Παράδειγμα 1 (συνέχεια) Απαίτηση ανάληψης 100 Απαίτηση για κλείδωμα του λογαριασμού Αναμονή Δέσμευση λογαριασμού Ανάγνωση υπολοίπου = 600 Νέο υπόλοιπο = 600-100 = 500 Εγγραφή νέου υπολοίπου στο δίσκο = 500 5
2. Κρίσιμα τμήματα (Critical Sections) Μια ακολουθία εντολών μιας διεργασίας που πρέπει να εκτελείται αδιαίρετα, ονομάζεται κρίσιμο τμήμα. Η εκτέλεση του κρισίμου τμήματος θα πρέπει να είναι όλα ή τίποτα Δεν θα πρέπει να διακόπτεται στο μέσον Η αποτελεσματικότητα της πολυεπεξεργασίας εξαρτάται από το μήκος του κρίσιμου τμήματος κάθε ανταγωνιστικής διεργασίας και πρέπει να είναι όσο το δυνατόν μικρότερο. Το πλέον αναποτελεσματικό σενάριο Όλο το πρόγραμμα είναι ένα κρίσιμο τμήμα δεν υπάρχει πολυπρογραμματισμός! 6
Όταν μια διεργασία εκτελεί το κρίσιμο τμήμα της (ΚΤ), σε καμιά άλλη δεν μπορεί να επιτραπεί να εκτελεί το δικό της κρίσιμο τμήμα. Αν μπορούσε να διασφαλισθεί ότι ποτέ δύο ή περισσότερες διεργασίες δεν θα βρίσκονται ταυτόχρονα σε κρίσιμα τμήματα, τότε θα είχε επιτευχθεί η αποφυγή των συνθηκών ανταγωνισμού. Ωστόσο αυτό δεν είναι αρκετό για τη σωστή και αποδοτική συνεργασία δύο ή περισσοτέρων παράλληλων διεργασιών. Μια καλή λύση προϋποθέτει τις παρακάτω συνθήκες : 7
Συνθήκες για το πρόβλημα του αμοιβαίου αποκλεισμού 1. Κάθε διεργασία μπορεί να διαιρεθεί σε δύο ακολουθίες (τμήματα ή περιοχές εντολών) : το κρίσιμο τμήμα, δηλ. αυτό που προσπελάζει τον κοινό πόρο και δεν πρέπει να καταμεριστεί και το μη κρίσιμο τμήμα. 2. Δυο διεργασίες δεν μπορούν να βρίσκονται ταυτόχρονα στα κρίσιμα τμήματά τους. 3. Μια διεργασία μπορεί να σταματήσει μόνον μέσα στο μη κρίσιμο τμήμα της, χωρίς να επηρεάσει (να αναστείλει) άλλες διεργασίες. 4. Δεν επιτρέπονται υποθέσεις σε ότι αφορά την ταχύτητα ή το πλήθος των επεξεργαστών. 5. Όταν μια διεργασία δεν εκτελεί το κρίσιμο τμήμα της δεν μπορεί να αναστείλει την εκτέλεση άλλης διεργασίας. 8
6. Το πρόγραμμα δεν επιτρέπεται να καταλήξει σε αδιέξοδο. Αν περισσότερες της μιας διεργασίες προσπαθήσουν να εισέλθουν ταυτόχρονα στις κρίσιμες περιοχές τους, τότε μόνο μια πρέπει να επιτύχει. 7. Δεν επιτρέπεται η επ αόριστον αναμονή μιας διεργασίας, μέχρι να εισέλθει στο κρίσιμο τμήμα της. 8. Στην περίπτωση έλλειψης συναγωνισμού για ταυτόχρονη είσοδο σε κρίσιμες περιοχές, μια διεργασία που επιθυμεί να εισέλθει στην κρίσιμη περιοχή της θα πρέπει να το επιτύχει με την ελάχιστη δυνατή επιβάρυνση. 9. Μια διεργασία παραμένει μέσα στο κρίσιμο τμήμα της για ορισμένο χρονικό διάστημα. 9
Αμοιβαίος αποκλεισμός χρησιμοποιώντας κρίσιμα τμήματα 10
Κίνδυνοι λόγω του αμοιβαίου αποκλεισμού Οι λανθασμένες ή ελλιπείς λύσεις στο πρόβλημα του αμοιβαίου αποκλεισμού μπορούν να οδηγήσουν σε Παρατεταμένη στέρηση (starvation) Αδιέξοδο (deadlock) Ανεπάρκεια του συστήματος 11
3. Υλοποίηση του αμοιβαίου αποκλεισμού I. Προσεγγίσεις λογισμικού με παραχώρηση της ευθύνης στις διεργασίες χωρίς υποστήριξη από τη γλώσσα προγραμματισμού ή το Λ.Σ. (αλγόριθμοι Dekker και Peterson) II. Υποστήριξη εκ μέρους του υλικού με χρήση εντολών μηχανής ειδικού σκοπού (ατομικές λειτουργίες test και set) III.Παροχή κάποιου επιπέδου υποστήριξης από το Λ.Σ. ή τη γλώσσα προγραμματισμού : σηματοφορείς (semaphores), παρακολουθητές(monitors), μεταβίβαση μηνυμάτων Όλες οι λύσεις περιλαμβάνουν συνήθως κρίσιμα τμήματα 12