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

Σχετικά έγγραφα
Αδιέξοδα Ανάθεση Πόρων (Deadlocks Resource Allocation)

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

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

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


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

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

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

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

ΑΔΙΕΞΟΔΑ (Deadlocks) Παράδειγμα 1 Θανάσιμο αγκάλιασμα (deadly embrace)

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

Αδιέξοδα (Deadlocks)

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

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Αδιέξοδα

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

6. Αδιέξοδο. 1. Ορισμοί είδη πόρων. 3. Συνθήκες αδιεξόδου. 1. Πρόληψη 2. Αποφυγή 3. Ανίχνευση 5. Το πρόβλημα των συνδαιτημόνων φιλοσόφων

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι. Κεφάλαιο 6ο: Αδιέξοδα

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Αδιέξοδα

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

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

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

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

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

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι. Κεφάλαιο 6ο: Αδιέξοδα

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

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

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

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

Η Αμερικάνικη Πλειοδοτική Δημοπρασία (Yankee Forward Auction)

Εικόνα 1: Κριτήρια αναζήτησης προϋπολογισμών

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

Γραμμικός Προγραμματισμός Μέθοδος Simplex

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 2 ο Να περιγραφεί η δομή επανάληψης Αρχή_επανάληψης Μέχρις_ότου

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

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

ΕΠΛ 211: Θεωρία Υπολογισμού και Πολυπλοκότητας. Διάλεξη 13: Παραλλαγές Μηχανών Turing και Περιγραφή Αλγορίθμων

Ασκήσεις μελέτης της 4 ης διάλεξης. ), για οποιοδήποτε μονοπάτι n 1

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

Δοµές Δεδοµένων & Ανάλυση Αλγορίθµων 3ο Εξάµηνο. Γραφήµατα. (Graphs)

Πληροφορική 2. Αλγόριθμοι

Το κείμενο που ακολουθεί αποτελεί επεξεργασία του πρωτότυπου κειμένου του Α. Κάστωρ για την επίλυση των παραδειγμάτων κρίσιμης αλυσίδας που

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

Ακέραιος Γραμμικός Προγραμματισμός

Κεφάλαιο 5: Στρατηγική χωροταξικής διάταξης

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

9. Συστολικές Συστοιχίες Επεξεργαστών

Αλγόριθμοι και Πολυπλοκότητα

Εντοπισμός αδιεξόδου. Κατανεμημένα Συστήματα 1

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

ΟΔΗΓΙΕΣ ΓΙΑ ΤΟ ΠΑΙΧΝΙΔΙ.

Ακέραιος Γραμμικός Προγραμματισμός

Μάθημα 7 ο. Αλγόριθμοι Χρονοδρομολόγησης

Κεφάλαιο 4ο: Δικτυωτή Ανάλυση

Αµοιβαίοςαποκλεισµός. Κατανεµηµένα Συστήµατα 03-1

Αλγόριθμοι και πολυπλοκότητα: 4 η σειρά ασκήσεων ΣΗΜΜΥ - Ε.Μ.Π.

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

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Βασικές έννοιες. Κατανεμημένα Συστήματα 1

Θεωρία Υπολογισμού και Πολυπλοκότητα Αναγωγές

3η Σειρά Γραπτών Ασκήσεων

Σειρά Προβλημάτων 4 Λύσεις

Διάγραμμα Ροής. Σελίδα 1 από 10

Ακέραιος Γραμμικός Προγραμματισμός

ΚΕΦΑΛΑΙΟ 2ο ΠΡΟΣΟΜΟΙΩΣΗ ΔΙΑΚΡΙΤΩΝ ΓΕΓΟΝΟΤΩΝ

4η Γραπτή Ασκηση Αλγόριθμοι και Πολυπλοκότητα CoReLab ΣΗΜΜΥ 7 Φεβρουαρίου 2017 CoReLab (ΣΗΜΜΥ) 4η Γραπτή Ασκηση 7 Φεβρουαρίου / 38

Σειρά Προβλημάτων 3 Λύσεις

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

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

Αυτοματοποιημένη Επαλήθευση

Διάλεξη 1: Εισαγωγή στον Κατανεμημένο Υπολογισμό. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

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

Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή

Οδηγίες για την καταχώρηση αιτήματος ανάληψης υποχρέωσης

Πίνακες Διασποράς. Χρησιμοποιούμε ένα πίνακα διασποράς T και μια συνάρτηση διασποράς h. Ένα στοιχείο με κλειδί k αποθηκεύεται στη θέση

Παραλλαγές του Προβλήματος Μεταφοράς Το Πρόβλημα Μεταφόρτωσης και το Πρόβλημα Αναθέσεων Γεωργία Φουτσιτζή ΤΕΙ Ηπείρου Επιχειρησιακή Έρευνα

Βασικές έννοιες. Κατανεμημένα Συστήματα 1

Διαχρονικές δομές δεδομένων

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

Ανάλυση Χρόνου, Πόρων & Κόστους

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

4η Γραπτή Ασκηση Αλγόριθμοι και Πολυπλοκότητα CoReLab ΣΗΜΜΥ 3/2/2019 CoReLab (ΣΗΜΜΥ) 4η Γραπτή Ασκηση 3/2/ / 37

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Χρονοπρογραμματισμός Εργαστηριακές Ασκήσεις

Το πρόβλημα μονοδρόμησης (The One-Way Street Problem)

Βάσεις Δεδομένων ΙΙ Ενότητα 2

Σειρά Προβλημάτων 4 Λύσεις

4.4 Μετατροπή από μία μορφή δομής επανάληψης σε μία άλλη.

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

ΠΑΙΓΝΙΑ Παιχνίδια Γενική Θεώρηση μεγιστοποιήσει την πιθανότητά

Στοιχεία Θεωρίας Γράφων (Graph Theory)

Σειρά Προβλημάτων 5 Λύσεις

Διοίκηση Παραγωγής και Υπηρεσιών

Θεωρία Γραφημάτων 6η Διάλεξη

Οι δυναμικές δομές δεδομένων στην ΑΕΠΠ

Ιδιοκτησία Αντικειµένου

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

Σειρά Προβλημάτων 4 Λύσεις

Ποσοτικές Μέθοδοι στη Διοίκηση Επιχειρήσεων ΙΙ Σύνολο- Περιεχόμενο Μαθήματος

Transcript:

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Διάλεξη 5 ΑΔΙΕΞΟΔΑ Οι διαφάνειες έχουν καθαρά επικουρικό χαρακτήρα στην παρουσίαση των διαλέξεων του μαθήματος. Δεν αντικαθιστούν σε καμία περίπτωση την παρακάτω βιβλιογραφία που αποτελεί και το βασικό εγχειρίδιο αναφοράς. Βιβλιογραφία: Σύγχρονα Λειτουργικά Συστήματα, A.S. Tanenbaum, 3 η έκδ., Κλειδάριθμος, 2009. Λειτουργικά Συστήματα, W. Stallings, 8 η έκδ., Τζιόλα, 2015. Λειτουργικά Συστήματα, A. Silberschatz, P. Galvin, G. Gagne, 7 η εκδ., ΙΩΝ, 2007.

Στόχοι Η διάλεξη αυτή έχει ως στόχο να εισάγει τον σπουδαστή στους τρόπους αντιμετώπισης και διαχείρισης αδιεξόδων από το λειτουργικό σύστημα, και ειδικότερα: να γνωρίσει τις μεθόδους ανίχνευσης και αντιμετώπισης του αδιεξόδου να γνωρίσει τους αλγόριθμους επίλυσης των αδιεξόδων, και να είναι σε θέση να τους εφαρμόσει σε πρακτικά προβλήματα 2

Ενότητες Αδιέξοδο και λιμοκτονία Συνθήκες εμφάνισης αδιεξόδου Μοντελοποίηση (γραφήματα) αδιεξόδου Εντοπισμός αδιεξόδου και ανάκαμψη Αποφυγή αδιεξόδου Αποτροπή αδιεξόδου 3

Αδιέξοδο και Λιμοκτονία (Deadlock & Starvation) Αδιέξοδο (deadlock): ένα σύνολο από διεργασίες εν αναμονή, όπου η κάθε μια κατέχει έναν αριθμό από πόρους (λογισμικού ή υλικού) και περιμένει να αποκτήσει και έναν άλλο πόρο που κατέχει κάποια από τις υπόλοιπες. Π.χ. έστω ένα σύστημα που διαθέτει δύο πόρους και ο κάθε πόρος μπορεί να χρησιμοποιείται μόνο από μια διεργασία κάθε χρονική στιγμή. Σε αυτό, δυο διεργασίες P 1 και P 2 έχουν πρόσβαση η καθεμία σε έναν πόρο και αναμένουν να τους δοθεί πρόσβαση και στον άλλο. Με άλλα λόγια οι δύο διεργασίες περιμένουν απεριόριστα για ένα γεγονός που μπορεί να προκληθεί μόνο από μια από τις δύο. Αναπαράσταση με δυο σημαφόρους S και Q: P 0 P 1 wait(s); wait(q); wait(q); wait(s); signal(s); signal(q); signal(q) signal(s); deadlock

Λιμοκτονία (starvation): απεριόριστη αναμονή. Μια διεργασία αξιοποιεί κάποιον πόρο με την ακόλουθη σειρά διαδικασιών: αίτηση (request), χρήση (use), αποδέσμευση (release) Όταν ένας πόρος δεν είναι διαθέσιμος όταν ζητείται, συνήθως η αιτούσα διεργασία αναγκάζεται να περιμένει και μπλοκάρεται. Αφυπνίζεται όταν ο πόρος γίνει διαθέσιμος. 5

Παράδειγμα: πέρασμα γέφυρας (μια είσοδος και μια έξοδος) Κίνηση μόνο προς μια κατεύθυνση. Κάθε άκρο της γέφυρας (είσοδος και έξοδος) μπορεί να θεωρηθεί ως ένας πόρος. Για να περάσει ένα όχημα πρέπει να του δοθεί πρόσβαση και στους δύο πόρους. Αν συμβεί αδιέξοδο, μπορεί να επιλυθεί αν οπισθοχωρήσει κάποιο αυτοκίνητο (αποδεσμεύσει τους πόρους και υπαναχωρήσει). Μπορεί να χρειαστεί να οπισθοχωρήσουν πολλά αυτοκίνητα. Η λιμοκτονία (starvation) είναι πιθανή. 6

Συνθήκες εμφάνισης αδιεξόδου Ένα αδιέξοδο μπορεί να συμβεί αν ισχύουν ταυτόχρονα οι εξής συνθήκες: Αμοιβαίος αποκλεισμός (Mutual exclusion): μόνο μια διεργασία μπορεί να χρησιμοποιεί μια οντότητα ενός πόρου κάθε χρονική στιγμή. Κατοχή και αναμονή (Hold and wait): μια διεργασία που κατέχει τουλάχιστον έναν πόρο αναμένει να αποκτήσει επιπλέον πόρους που κατέχουν άλλες διεργασίες. Δεν υπάρχει διακοπή (No preemption): ένας πόρος μπορεί να αποδεσμευτεί από τη διεργασία που τον κατέχει μόνο εθελοντικά και συνήθως όταν η διεργασία έχει ολοκληρώσει την εργασία της με τον πόρο. Κυκλική αναμονή (Circular wait): υπάρχει ένα σύνολο {P 0, P 1,.., P n-1 } από διεργασίες εν αναμονή και μάλιστα έτσι ώστε η P 0 να περιμένει για έναν πόρο που κρατάει η P 1, η P 1 να περιμένει για ένα πόρο που έχει δεσμεύσει η P 2, η P n 2 να περιμένει για ένα πόρο που έχει δεσμεύσει η P n-1, και η P n-1 να περιμένει για ένα πόρο που έχει δεσμεύσει η P 0 P 0 P 1, P 1 P 2,, P n 1 7

Μοντελοποίηση (γράφοι) του αδιεξόδου Οι διαδικασίες αίτησης, ανάθεσης και αποδέσμευσης πόρων από διεργασίες μπορούν να μοντελοποιηθούν με γράφους. Οι γράφοι αποτελούν εργαλείο με το οποίο μπορούμε να εξετάσουμε αν μια συγκεκριμένη ακολουθία αιτήσεων/αποδεσμεύσεων οδηγεί σε αδιέξοδο. διεργασία locked request Deadlock πόρος (a) Δέσμευση ενός πόρου. Ο πόρος R έχει ανατεθεί στη διεργασία A. (b) Αίτηση χρήσης πόρου. Η διεργασία B απαιτεί/περιμένει για τον πόρο S. (c) Αδιέξοδο. Οι διεργασίες C και D είναι σε αδιέξοδο πάνω στους πόρους T και U. 8

Γράφημα ανάθεσης πόρων (Resource-Allocation Graph) Γράφος με σύνολο κόμβων V και σύνολο ακμών Ε προσδιορίζεται ως ακολούθως: Το σύνολο κόμβων V χωρίζεται σε δύο τύπους: P = {P 1, P 2,, P n } οι διεργασίες του συστήματος R = {R 1, R 2,, R m } οι τύποι των πόρων του συστήματος Το σύνολο ακμών Ε χωρίζεται σε δύο τύπους: Ακμή αίτησης κατευθυνόμενη ακμή από διεργασία σε πόρο P 1 R j Ακμή ανάθεσης κατευθυνόμενη ακμή από πόρο σε διεργασία R j P i Διεργασία: Πόρος με 4 οντότητες/εκδοχές: Η P i κάνει αίτηση για μια οντότητα του R j : P i R j Η P i κατέχει μια οντότητα του πόρου R j : P i Rj 9

Παράδειγμα ανάθεσης πόρων και εμφάνισης αδιεξόδου Αδιέξοδο σε κύκλο 10

Παραδείγματα ανάθεσης πόρων και εμφάνισης αδιεξόδου Γράφημα ανάθεσης πόρων με αδιέξοδο Γράφημα ανάθεσης πόρων σε κύκλο αλλά όχι οπωσδήποτε και σε αδιέξοδο 11

Το πρόβλημα του αδιεξόδου και η αντιμετώπισή του Αν ένας γράφος δεν περιέχει κύκλους, τότε δεν υπάρχει αδιέξοδο. Αν ένας γράφος περιέχει κύκλο τότε: αν υπάρχει μόνο μια εκδοχή/οντότητα για τον κάθε πόρο αδιέξοδο αν υπάρχουν αρκετές εκδοχές ανά τύπο πόρου πιθανότητα εμφάνισης αδιεξόδου (αλλά όχι σίγουρα αδιέξοδο) Μέθοδοι αντιμετώπισης του αδιεξόδου: Αγνόηση του προβλήματος (just ignore the problem). Θεώρηση ότι τα αδιέξοδα δε συμβαίνουν ποτέ σε ένα σύστημα. Εντοπισμός αδιεξόδου και ανάκαμψη (detection and recovery). Ανοχή προς το σύστημα ώστε να μπορεί να εισέλθει σε κατάσταση αδιεξόδου, έτσι μετά τα εντοπίζουμε και λαμβάνουμε τα απαραίτητα μέτρα για ανάκαμψη από το αδιέξοδο. Αποφυγή αδιεξόδου (dynamic deadlock avoidance). Διασφαλίζουμε εκ των προτέρων ότι το σύστημα δεν θα εισέλθει ποτέ σε κατάσταση αδιεξόδου με προσεκτική κατανομή των πόρων. Αποτροπή αδιεξόδου (deadlock prevention). Κατάργηση κάποιας εκ των τεσσάρων συνθηκών εμφάνισης αδιεξόδου. 12

Μέθοδος αντιμετώπισης αδιεξόδου: Εντοπισμός αδιεξόδου και Ανάκαμψη Επιτρέπουμε στο σύστημα να εισέλθει σε κατάσταση αδιεξόδου Αλγόριθμος ανίχνευσης (εντοπισμός) αδιεξόδου (detection) Σχήμα ανάκαμψης από το αδιέξοδο (recovery) Με αυτή την τεχνική το σύστημα δεν προσπαθεί να αποτρέψει την εμφάνιση αδιεξόδων. Τα αφήνει να εμφανιστούν, προσπαθεί να τα εντοπίσει όταν συμβαίνουν, και στη συνέχεια προσπαθεί να ανακάμψει με τις κατάλληλες ενέργειες. Διακρίνουμε τις κάτωθι περιπτώσεις: 1. (α) Εντοπισμός αδιεξόδου σε σύστημα με μια οντότητα για κάθε πόρο 1. (β) Εντοπισμός αδιεξόδου σε σύστημα με πολλαπλές οντότητες για κάθε πόρο 2. (α) Ανάκαμψη από το αδιέξοδο με εξάλειψη/τερματισμό των διεργασιών 2. (β) Ανάκαμψη από το αδιέξοδο με αφαίρεση των πόρων 13

1. Εντοπισμός αδιεξόδου (α) σε σύστημα με μια οντότητα για κάθε πόρο Εντοπισμός αδιεξόδου και Ανάκαμψη Σε ένα τέτοιο σύστημα υπάρχει μια εκδοχή/οντότητα πόρου από κάθε είδος. Π.χ., ένας πόρος μπορεί να αποτελεί ένα εκτυπωτή, ένας άλλος πόρος να αποτελεί ένα σαρωτή, κλπ., αλλά δεν μπορεί να έχουμε δυο ή περισσότερους εκτυπωτές ή να έχουμε δυο ή περισσότερους σαρωτές κλπ.. Για ένα τέτοιο σύστημα κατασκευάζουμε ένα γράφο ανάθεσης πόρων. Αν ο γράφος περιέχει έναν ή περισσότερους κύκλους τότε υπάρχει αδιέξοδο. Έτσι περιοδικά εκτελείται ο αλγόριθμος (εντοπισμού) που ανιχνεύει για κύκλο στο γράφο. Αυτό όμως απαιτεί πλήθος πράξεων/λειτουργιών τάξη μεγέθους n 2, όπου n ο αριθμός των κόμβων του γράφου! Ακολουθεί ένας αλγόριθμος ανίχνευσης. 14

Αλγόριθμος ανίχνευσης Για κάθε κόμβο Κ του γράφου, ο αλγόριθμος εκτελεί τα ακόλουθα βήματα με τον Κ ως αρχικό κόμβο. 1. Δίνει αρχικές τιμές σε μια λίστα κόμβων Λ ως κενή λίστα και χαρακτηρίζει όλα τα τόξα ως ασημείωτα. 2. Προσθέτει τον τρέχοντα κόμβο στο τέλος της Λ και ελέγχει αν ο κόμβος εμφανίζεται τώρα στη λίστα δύο φορές. Αν ναι, ο γράφος περιέχει έναν κύκλο (στη Λ) και ο αλγόριθμος τερματίζεται. 3. Από το συγκεκριμένο κόμβο, ελέγχει αν υπάρχουν εξερχόμενα ασημείωτα τόξα. Αν ναι, πηγαίνει στο βήμα 4, αν όχι, πηγαίνει στο βήμα 5. 4. Διαλέγει στην τύχη ένα ασημείωτο εξερχόμενο τόξο και το σημειώνει. Το ακολουθεί στο νέο τρέχοντα κόμβο και πηγαίνει στο βήμα 5. 5. Αν αυτός ο κόμβος είναι ο αρχικός, ο γράφος δεν περιέχει κύκλους και ο αλγόριθμος τερματίζεται. Διαφορετικά, έχει φτάσει σε νεκρό άκρο. Τον αφαιρεί και επιστρέφει στον προηγούμενο κόμβο, δηλαδή σε αυτόν που ήταν τρέχον πριν από αυτόν, τον κάνει τρέχοντα, και πηγαίνει στο βήμα 2. 15 Ενημερωτική προαιρετική διαφάνεια Εντοπισμός αδιεξόδου και Ανάκαμψη

Παράδειγμα Α Η: διεργασίες Π Φ: πόροι Το σύστημα αυτό είναι σε αδιέξοδο διότι οι διεργασίες Δ, Ε, και Η στον κύκλο είναι σε αδιέξοδο. Γράφος πόρων Εντοπισμός αδιεξόδου και Ανάκαμψη Ο κύκλος αποσπασμένος από το γράφο deadlock 16

Εντοπισμός αδιεξόδου και Ανάκαμψη 1. Εντοπισμός αδιεξόδου (β) σε σύστημα με πολλαπλές οντότητες για κάθε πόρο Σε ένα τέτοιο σύστημα υπάρχουν πολλαπλές οντότητες πόρων από κάθε είδος. Π.χ., ένας πόρος μπορεί να αποτελείται από δυο ή περισσότερους εκτυπωτές, ένας άλλος πόρος να αποτελείται από δυο ή περισσότερους σαρωτές κλπ.. Εδώ ο αλγόριθμος εντοπισμού αδιεξόδου αναζητά και σημειώνει (προσδιορίζει) τις διεργασίες που μπορούν να ολοκληρώσουν την εκτέλεσή τους (δηλ. αυτές που δεν θα βρεθούν σε αδιέξοδο). Ουσιαστικά ψάχνει για τις διεργασίες που μπορούν να εκτελεστούν μέχρι να ολοκληρωθούν, δηλ. αυτές για τις οποίες οι απαιτήσεις σε πόρους, μπορούν να ικανοποιηθούν από τους διαθέσιμους πόρους. Όσες διεργασίες παραμένουν ασημείωτες μετά το τέλος του αλγόριθμου θα βρίσκονται προφανώς σε αδιέξοδο. 17

Ο αλγόριθμος ανίχνευσης αδιεξόδων που εφαρμόζεται χρησιμοποιεί τέσσερις δομές δεδομένων (matrix-based): Διάνυσμα υφιστάμενων πόρων (existing resource vector) Εκφράζει το συνολικό αριθμό αντιτύπων από κάθε πόρο. Διάνυσμα διαθέσιμων πόρων (available resource vector) Εκφράζει τον αριθμό των αντιτύπων συγκεκριμένου πόρου που είναι διαθέσιμα την τρέχουσα στιγμή (δηλ. που δεν έχουν εκχωρηθεί). Μητρώο τρέχουσας κατανομής (current allocation matrix) Εκφράζει την τρέχουσα κατανομή των πόρων στις διεργασίες. Μητρώο αιτήσεων (request matrix) Εκφράζει τον αριθμό των πόρων που χρειάζονται (αιτούνται) οι διεργασίες. 18

Παράδειγμα Υ: Διάνυσμα υφιστάμενων πόρων (existing resource vector) Θ: Διάνυσμα διαθέσιμων πόρων (available resource vector) Τ: Μητρώο τρέχουσας κατανομής (current allocation matrix) Α: Μητρώο αιτήσεων (request matrix) Εντοπισμός αδιεξόδου και Ανάκαμψη 19

Αλγόριθμος ανίχνευσης Εντοπισμός αδιεξόδου και Ανάκαμψη Συνοπτικά ο αλγόριθμος εντοπισμού αδιεξόδου αναζητά και σημειώνει τις διεργασίες που μπορούν να ολοκληρωθούν, δηλ. αυτές που δεν βρίσκονται σε αδιέξοδο. Δηλ. ψάχνει για τις διεργασίες που μπορούν να εκτελεστούν μέχρι να ολοκληρωθούν. Αυτό σημαίνει ότι οι απαιτήσεις των διεργασιών αυτών σε πόρους, μπορούν να ικανοποιηθούν από τους διαθέσιμους πόρους. Όσες διεργασίες παραμένουν ασημείωτες μετά το τέλος του αλγόριθμου θα βρίσκονται προφανώς σε αδιέξοδο. Ο αλγόριθμος εντοπισμού μπορεί να διατυπωθεί ως εξής: 1. Ψάξε για μια ασημείωτη διεργασία Δκ, για την οποία η κ-οστή γραμμή του μητρώου Α είναι μικρότερη ή ίση από την κ-οστή γραμμή του μητρώου Θ. 2. Αν βρεθεί τέτοια διεργασία, πρόσθεσε την κ-οστή γραμμή του Τ στην κ- οστή γραμμή του Θ, σημείωσε τη διεργασία, και επέστρεψε στο βήμα 1. 3. Αν δεν υπάρχει τέτοια διεργασία, ο αλγόριθμος τερματίζεται. 20 Ενημερωτική προαιρετική διαφάνεια

Αλγόριθμος ανίχνευσης Εντοπισμός αδιεξόδου και Ανάκαμψη available: Διάνυσμα μήκους m, όπου available[j] το πλήθος των διαθέσιμων οντοτήτων του πόρου R j allocation: Πίνακας n x m, όπου allocation[i,j] το πλήθος των οντοτήτων του πόρου R j που διαθέτει η P i την τρέχουσα στιγμή που δείχνει το πλήθος των διαθέσιμων πόρων από κάθε τύπο request: Πίνακας n x m, όπου request[i,j] το πλήθος των επιπλέον οντοτήτων του πόρου R j που ζητά η διεργασία P i 1. Έστω work και finish διανύσματα μεγέθους m και n, όπου αρχικά: (α) work[i] = available[i] για i = 1,2,, m (β) finish[i] = false αν allocation[i,k] <> 0 για κάποιο k = 1,2,, m, αλλιώς finish[i] = true 2. Βρες ένα δείκτη i τέτοιο ώστε: (α) finish[i] = false και (β) request[i,k] work[k] για k = 1,2,, m Αν δεν υπάρχει τέτοιο i, πήγαινε στο βήμα 4 3. work[k] = work[k] + allocation[i,k] για k = 1,2,, m finish[i] = true πήγαινε στο βήμα 2 4. Αν finish[i] = false, για κάποιο i, 1 i n, τότε το σύστημα είναι σε κατάσταση αδιεξόδου. Επιπρόσθετα, αν finish[i] = false, τότε η P i βρίσκεται σε αδιέξοδο Απαιτείται πλήθος πράξεων/λειτουργιών τάξη μεγέθους O(m x n 2 ) για να ανιχνεύσει αν το σύστημα είναι σε κατάσταση αδιεξόδου. 21 Ενημερωτική προαιρετική διαφάνεια

Εντοπισμός αδιεξόδου και Ανάκαμψη Παράδειγμα αλγόριθμου ανίχνευσης αδιεξόδου με πολλαπλές οντότητες πόρων για κάθε τύπο 22

Παράδειγμα ανίχνευσης αδιεξόδου Έστω 5 διεργασίες P 0 έως P 4 και 3 πόροι: A (με 7 οντότητες), B (με 2 οντότητες) και C (με 6 οντότητες). Στιγμιότυπο τη χρονική στιγμή T 0 : allocation request available A B C A B C A B C P 0 0 1 0 0 0 0 0 0 0 P 1 2 0 0 2 0 2 P 2 3 0 3 0 0 0 P 3 2 1 1 1 0 0 P 4 0 0 2 0 0 2 Η ακολουθία {P 0, P 2, P 3, P 1, P 4 } οδηγεί σε finish[i] = true για κάθε I Η P 2 κάνει αίτηση για μια επιπλέον εκδοχή του πόρου C : allocation request available A B C A B C A B C P 0 0 1 0 0 0 0 0 0 0 P 1 2 0 0 2 0 2 P 2 3 0 3 0 0 1 P 3 2 1 1 1 0 0 P 4 0 0 2 0 0 2 Κατάσταση του συστήματος: μπορεί να επανακτήσει τους πόρους που κρατούνται από την P 0, αλλά δεν επαρκούν για τις αιτήσεις των άλλων διεργασιών. Υπάρχει αδιέξοδο, που αποτελείται από τις P 1, P 2, P 3, και P 4. 23 Εντοπισμός αδιεξόδου και Ανάκαμψη

2. Ανάκαμψη από το αδιέξοδο (α) με εξάλειψη/τερματισμό των διεργασιών Εντοπισμός αδιεξόδου και Ανάκαμψη Παύση μιας ή περισσοτέρων διεργασιών που εμπλέκονται στο αδιέξοδο. Παύση μιας διεργασίας τη φορά μέχρι να εξαλειφθεί ο κύκλος του αδιεξόδου. Επιθυμητό είναι να εξαλείφεται κάποια διεργασία που μπορεί να επανεκτελεστεί από την αρχή χωρίς ανεπιθύμητες παρενέργειες. Εναλλακτικά, μπορεί να επιλεγεί ως θύμα μια διεργασία που δεν ανήκει στον κύκλο, με το σκεπτικό να αποδεσμευθούν οι πόροι που κατέχει και χρειάζονται σε κάποια διεργασία του κύκλου. Κριτήρια με τα οποία μπορεί να επιλέγονται οι διεργασίες για παύση: Προτεραιότητα της διεργασίας Πόση ώρα εκτελείται η διεργασία και πόσο υπολείπεται μέχρι την ολοκλήρωσή της Πόροι που έχουν χρησιμοποιηθεί από τη διεργασία Πόροι που χρειάζεται για να ολοκληρωθεί η διεργασία Πόσες διεργασίες θα χρειαστεί να τερματιστούν; Είναι αλληλεπιδραστική (interactive) ή μαζικής επεξεργασίας (batch);

2. Ανάκαμψη από το αδιέξοδο (β) με αφαίρεση των πόρων (Resource Preemption) Απόσπαση πόρου προσωρινά από διεργασία που τον κατέχει για να δοθεί σε μια άλλη, και όταν αυτή ολοκληρώσει τη χρήση του, επιστρέφεται και πάλι στην αρχική. Μια άλλη περίπτωση αφαίρεσης πόρου για να επιτευχθεί η ανάκαμψη έχει ως εξής. Ανασκευάζουμε μια διεργασία (rollback) που κατέχει έναν κρίσιμο πόρο, επιστρέφοντάς την σε ένα χρονικό σημείο (εκτέλεσης) στο παρελθόν πριν αποκτήσει αυτόν τον πόρο. Οτιδήποτε έχει γίνει από αυτό το σημείο και μετά χάνεται. Οπότε ο πόρος αυτός τώρα εκχωρείται σε μια από τις διεργασίες που βρίσκονται σε αδιέξοδο για να επιτευχθεί η ανάκαμψη. Όταν η διεργασία προσπαθήσει να αποκτήσει τον πόρο ξανά μετά από την επανεκκίνησή της, πρέπει να περιμένει μέχρι αυτός να γίνει διαθέσιμος. 25 Εντοπισμός αδιεξόδου και Ανάκαμψη

Μέθοδος αντιμετώπισης αδιεξόδου: Αποφυγή αδιεξόδου (deadlock avoidance) Μεθοδολογία: μπορούμε να αποφύγουμε τα αδιέξοδα αν γνωρίζουμε από πριν για το πώς οι πόροι θα ζητηθούν, έτσι ώστε να γίνεται σωστή (ασφαλή) κατανομή των πόρων κάθε φορά που ζητούνται από τις διεργασίες, και συνεπώς όλες να έχουν τη δυνατότητα να ολοκληρώσουν την εκτέλεσή τους (ασφαλή κατάσταση συστήματος). Αυτή η προσέγγιση απαιτεί από κάθε διεργασία να δηλώνει εκ των προτέρων το μέγιστο πλήθος των πόρων κάθε τύπου που θα χρειαστεί (όχι τόσο εφικτό). Ο αλγόριθμος εδώ, όταν μια διεργασία αιτείται ένα διαθέσιμο πόρο, εξετάζει δυναμικά την κατάσταση της ανάθεσης πόρων και συγκεκριμένα κατά πόσο η άμεση ανάθεση του πόρου αυτού στην διεργασία θα διατηρήσει το σύστημα σε ασφαλή κατάσταση (safe state), ή θα το οδηγήσει σε μη ασφαλή κατάσταση με το ενδεχόμενο να προκύψει αδιέξοδο. Το σύστημα θα είναι σε ασφαλή κατάσταση όταν μπορεί να καταχωρεί πόρους σε κάθε διεργασία (μέχρι το μέγιστό της) με κάποια σειρά και να αποφεύγει το αδιέξοδο (π.χ. Banker s algorithm). Αποφυγή αδιεξόδου: διασφάλιση ότι το σύστημα δεν θα εισέλθει ποτέ σε μη ασφαλή κατάσταση.

Ασφαλής κατάσταση (Safe State) Ένα σύστημα είναι σε ασφαλή κατάσταση αν υπάρχει μια ασφαλής ακολουθία όλων των διεργασιών για την οποία ισχύουν τα ακόλουθα. Η ακολουθία <P 1, P 2,, P n > είναι ασφαλής, αν για κάθε P i, οι πόροι που η P i μπορεί να αιτηθεί μπορούν να ικανοποιηθούν από τους διαθέσιμους πόρους καθώς και τους πόρους που δεσμεύουν όλες οι P j, με j<i. Αν οι αναγκαίοι πόροι της P i δεν είναι άμεσα διαθέσιμοι, τότε η P i μπορεί να περιμένει μέχρι να ολοκληρώσουν όλες οι P j Όταν ολοκληρωθεί η P j, στη συνέχεια η P i μπορεί πλέον να αποκτήσει τους αναγκαίους πόρους, να εκτελεστεί και να τους επιστρέψει Όταν ολοκληρώσει η P i και τους επιστρέψει, η επόμενη P i+1 μπορεί να αποκτήσει τους αναγκαίους πόρους Εάν ένα σύστημα είναι σε ασφαλή κατάσταση, τότε δεν υπάρχει αδιέξοδο. Σε αντίθετη περίπτωση, αν ένα σύστημα είναι σε μη ασφαλή κατάσταση, τότε υπάρχει πιθανότητα εμφάνισης αδιεξόδου. Συνεπώς για την αποφυγή αδιεξόδου σε ένα σύστημα πρέπει να διασφαλίσουμε ότι δεν θα εισέλθει ποτέ σε μη ασφαλή κατάσταση. 27 Αποφυγή αδιεξόδου

Παράδειγμα γραφήματος ανάθεσης πόρων Αποφυγή αδιεξόδου Ακμή διεκδίκησης P i R j υποδηλώνει ότι η διεργασία P i μπορεί να ζητήσει τον πόρο R j και αναπαρίσταται από διακεκομμένη γραμμή. Μια ακμή διεκδίκησης μετατρέπεται σε ακμή αίτησης όταν μια διεργασία ζητήσει ένα πόρο. Όταν μια διεργασία απελευθερώσει κάποιον πόρο, η ακμή ανάθεσης ξαναγίνεται ακμή διεκδίκησης. Οι πόροι πρέπει να διεκδικούνται εκ των προτέρων από το σύστημα. Γράφημα ανάθεσης πόρων για αποφυγή αδιεξόδου 28 Μη ασφαλής κατάσταση σε ένα γράφημα ανάθεσης πόρων

Αλγόριθμος του τραπεζίτη (Banker s Algorithm, Dijkstra 1965) Αποφυγή αδιεξόδου Με βάση αυτόν τον αλγόριθμο όταν μια νέα διεργασία εισέρχεται στο σύστημα θα πρέπει να δηλώσει το μέγιστο αριθμό των στιγμιότυπων του κάθε τύπου πόρου (resource instances) που θα χρειαστεί. Αυτός ο αριθμός δεν πρέπει να υπερβαίνει τον συνολικό αριθμό των πόρων του συστήματος. Έτσι, όταν μια διεργασία κάνει αίτηση για ένα σύνολο από πόρους, ο αλγόριθμος εξετάζει δυναμικά με προσομοίωση εάν η κατανομή των πόρων θα αφήσει το σύστημα σε ασφαλή κατάσταση. Σε περίπτωση που δεν το εξασφαλίζει η διεργασία μπλοκάρεται (blocked queue) και περιμένει έως ότου κάποια άλλη διεργασία απελευθερώσει αρκετούς πόρους. Αφού μια διεργασία πάρει όλους τους πόρους που χρειάζεται πρέπει να τους επιστρέψει σε πεπερασμένο χρονικό διάστημα. Η κεντρική ιδέα του αλγορίθμου είναι ότι αφού όλες οι διεργασίες έχουν ένα μέγιστο αριθμό από πόρους που μπορεί να ζητήσουν αλλά δεν ζητούν όλες το μέγιστο, τότε επιπλέον πόροι μπορούν να δοθούν σε μια διεργασία που τους ζητά εφόσον η απαίτηση δεν οδηγεί σε ανασφαλή κατάσταση. 29

Αλγόριθμος Συνοπτικά: Υπάρχουν περισσότερες της μιας οντότητες για κάποιους τύπους πόρων. Κάθε διεργασία πρέπει εκ των προτέρων να διεκδικήσει τη μέγιστη χρήση των πόρων που χρειάζεται για την εκτέλεση της. Όταν μια διεργασία κάνει αίτηση για κάποιον πόρο, μπορεί να χρειαστεί να περιμένει. Αφού μια διεργασία πάρει όλους τους πόρους που χρειάζεται πρέπει να τους επιστρέψει σε πεπερασμένο χρονικό διάστημα. Δομές δεδομένων για τον αλγόριθμο του τραπεζίτη: n = το πλήθος των διεργασιών, m = το πλήθος των πόρων available: Διάνυσμα μεγέθους m, όπου available[j] το πλήθος των διαθέσιμων οντοτήτων του πόρου R j max: Πίνακας n x m, όπου max[i,j] το μέγιστο πλήθος των οντοτήτων του πόρου R j που μπορεί να ζητήσει η διεργασία P i allocation: Πίνακας n x m, όπου allocation[i,j] το πλήθος των οντοτήτων του πόρου R j που διαθέτει η P i την τρέχουσα στιγμή need: Πίνακας n x m, όπου need[i,j] το πλήθος των επιπλέον οντοτήτων του πόρου R j που μπορεί να χρειαστεί η P i για να ολοκληρώσει την εργασία της: need [i,j] = max[i,j] allocation [i,j] 30 Ενημερωτική προαιρετική διαφάνεια Αποφυγή αδιεξόδου

Αποφυγή αδιεξόδου Παράδειγμα: ο αλγόριθμος του τραπεζίτη για πολλούς πόρους 31

Αποφυγή αδιεξόδου Αλγόριθμος ασφαλής κατάστασης 1. Έστω work and finish διανύσματα μεγέθους m και n, όπου αρχικά: work[i] = available[i] για i = 1,2,, m finish[i] = false για i = 1,2,, n 2. Βρες ένα i τέτοιο ώστε: (a) finish[i] = false και (b) need [i,k] work[k] για k = 1,2,, m Αν δεν υπάρχει τέτοιο i, πήγαινε στο βήμα 4 3. work[k] = work[k] + allocation [i,k] για k = 1,2,, m finish[i] = true πήγαινε στο βήμα 2 4. Αν finish [i] = true για i = 1,2,, n, τότε το σύστημα βρίσκεται σε ασφαλή κατάσταση 32 Ενημερωτική προαιρετική διαφάνεια

Αποφυγή αδιεξόδου Αλγόριθμος αίτησης πόρων για τη διεργασία P i 1. Έστω request πίνακας n x m, όπου request[i,j] το πλήθος των οντοτήτων του πόρου R j που αιτείται η P i 2. Αν request[i,k] need[i,k] για k = 1,2,, m, πήγαινε στο βήμα 3. Αλλιώς, δημιουργία συνθήκης λάθους, αφού η διεργασία ξεπέρασε τα μέγιστα επιτρεπτά όρια διεκδίκησης πόρων. 3. Αν request[i,k] available[k] για k = 1,2,, m, πήγαινε στο βήμα 4. Αλλιώς η P i πρέπει να περιμένει, διότι δεν υπάρχουν διαθέσιμοι πόροι. 4. Προσποιούμαστε ότι αναθέτουμε στην P i τους πόρους που ζήτησε τροποποιώντας την τρέχουσα κατάσταση ακόλουθα: available[k] = available[k] - request[i,k] για k = 1,2,, m; allocation[i,k] = allocation[i,k] + request[i,k] για k = 1,2,, m; need[i,k] = need[i,k] request [i,k] για k = 1,2,, m; Αν η κατάσταση είναι ασφαλής οι πόροι ανατίθενται στην P i Αν η κατάσταση είναι μη ασφαλής η P i πρέπει να περιμένει, και ανακτάται η προηγούμενη κατάσταση ανάθεσης πόρων. 33 Ενημερωτική προαιρετική διαφάνεια

Αποφυγή αδιεξόδου Παράδειγμα αλγόριθμου του τραπεζίτη Έστω 5 διεργασίες P 0 έως P 4 και 3 είδη πόρων: A (10 οντότητες), B (5 οντότητες), και C (7 οντότητες). Στιγμιότυπο τη χρονική στιγμή T 0 : allocation max need available A B C A B C A B C A B C P 0 0 1 0 7 5 3 7 4 3 3 3 2 P 1 2 0 0 3 2 2 1 2 2 P 2 3 0 2 9 0 2 6 0 0 P 3 2 1 1 2 2 2 0 1 1 P 4 0 0 2 4 3 3 4 3 1 Το σύστημα είναι σε ασφαλή κατάσταση αφού η ακολουθία {P 1, P 3, P 4, P 2, P 0 } ικανοποιεί τα κριτήρια ασφάλειας. 34

Αποφυγή αδιεξόδου Παράδειγμα αλγόριθμου του τραπεζίτη: αίτηση Ρ 1 (1,0,2) Έλεγχος request[1,k] need[1,k], δηλ. (1,0,2) (1,2,2) αληθές Έλεγχος request[1,k] available[k], δηλ. (1,0,2) (3,3,2) αληθές allocation max need available A B C A B C A B C A B C P 0 0 1 0 7 5 3 7 4 3 2 3 0 P 1 3 0 2 3 2 2 0 2 0 P 2 3 0 2 9 0 2 6 0 0 P 3 2 1 1 2 2 2 0 1 1 P 4 0 0 2 4 3 3 4 3 1 Η εκτέλεση του αλγόριθμου ασφάλειας δείχνει ότι η ακολουθία {P 1, P 3, P 4, P 0, P 2 } ικανοποιεί τις απαιτήσεις ασφάλειας. Μπορεί να ικανοποιηθεί η αίτηση (3,3,0) της P 4 ; Η (0,2,0) της P 0 ; 35

Μέθοδος αντιμετώπισης αδιεξόδου: Αποτροπή αδιεξόδου (deadlock prevention) Αν εξασφαλίσουμε ότι τουλάχιστον μια από τις τέσσερις απαραίτητες συνθήκες (εμφάνισης αδιέξοδου) δεν θα ικανοποιηθεί ποτέ, τότε θα είναι αδύνατο να συμβεί αδιέξοδο. Ελαχιστοποίηση αμοιβαίου αποκλεισμού δεν απαιτείται για τους κοινούς πόρους, πρέπει να ισχύει για τους μη κοινούς πόρους. Απαγόρευση δέσμευσης εν αναμονή πρέπει να υπάρχει εγγύηση ότι, όταν μια διεργασία κάνει αίτηση για έναν πόρο, δεν κατέχει άλλο Απαιτεί από τη διεργασία να αιτηθεί και να της ανατεθούν όλοι οι πόροι πριν την έναρξη της εκτέλεσης, ή επιτρέπει στις διεργασίες να κάνουν αιτήσεις μόνο όταν δεν κατέχουν πόρους Χαμηλή χρησιμοποίηση πόρων, πιθανότητα λιμοκτονίας Εισαγωγή διακοπών επιτρέπεται να αφαιρεθούν πόροι από μια διεργασία που βρίσκεται ακόμα στο στάδιο της αίτησης για πόρους Αν μια διεργασία που κατέχει κάποιους πόρους κάνει αίτηση για κάποιον πόρο ο οποίος δεν μπορεί να της ανατεθεί αμέσως, τότε όλοι οι πόροι που δεσμεύει αποδεσμεύονται Η διεργασία θα ξεκινήσει ξανά μόνο όταν μπορέσει να επανακτήσει όλους τους πόρους που κατείχε αλλά και αυτούς για τους οποίους κάνει αίτηση Αποφυγή κυκλικής αναμονής επιβολή μιας συνολικής διάταξης όλων των τύπων πόρων, και αίτηση για πόρους από τις διεργασίες σε αύξουσα σειρά τύπου των πόρων που χρειάζονται.

Ερωτήσεις Περιγράψτε το αδιέξοδο και τις συνθήκες που πρέπει να ισχύουν για την εμφάνιση αδιεξόδου. Σε ένα σύστημα ανάθεσης πόρων οι διεργασίες: Δ1, Δ2, Δ3 ζητούν ή/και τους έχουν ανατεθεί αντίστοιχα οι πόροι: Π1, Π2, Π3, σύμφωνα με τους διπλανούς γράφους (α) και (β): Απαντήστε σε ποια περίπτωση εμφανίζεται αδιέξοδο αιτιολογώντας την απάντησή σας. Δ1 Π1 Δ2 Π2 Δ3 Π3 Περιγράψτε τις μεθόδους ανάκαμψης από αδιέξοδο (μετά τον εντοπισμό του). Περιγράψτε την μέθοδο αποφυγής αδιεξόδου. Τι γνωρίζετε για την ασφαλή κατάσταση συστήματος. Τι γνωρίζετε για τον αλγόριθμο του τραπεζίτη (Banker s algorithm). Περιγράψτε την μέθοδο αποτροπής αδιεξόδου. (α) (β) 37