Λειτουργικά Συστήματα Αμοιβαίος Αποκλεισμός και Λάθη 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη Λύση Peterson Process 0 void P0(){ while(TRUE){ ... flag[0] = TRUE; turn = 1; while (flag[1] == TRUE && turn == 1) do_nothing(); <Κρίσιμη Περιοχή> flag[0] = FALSE; } Process 1 void P1(){ flag[1] = TRUE; turn = 0; while (flag[0] == TRUE && turn == 0) do_nothing();; flag[1] = FALSE; Ζήτα άδεια «Ξεμπλοκάρισμα» Παραχώρησε τη σειρά σου Περίμενε, αν ο άλλος έχει ζητήσει άδεια και έχει σειρά 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη Λύση Dekker Process 0 void P0(){ while(TRUE){ ... flag[0] = TRUE; while (flag[1] == TRUE){ if (turn==1){ flag[0] = FALSE; while (turn==1) do_nothing(); } <Κρίσιμη Περιοχή> turn = 1; Process 1 void P1(){ flag[1] = TRUE; while (flag[0] == TRUE){ if (turn==0){ flag[1] = FALSE; while (turn==0) turn = 0; Ζήτα άδεια Αν ο άλλος έχει ζητήσει άδεια, περίμενε να τελειώσει, αλλά αν είναι και σειρά του, ζήτα ξανά άδεια μόλις σου παραχωρήσει σειρά } «Ξεμπλοκάρισμα» Παραχώρησε τη σειρά σου 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη Peterson vs Dekker Process 0 - Peterson void P0(){ while(TRUE){ ... flag[0] = TRUE; turn = 1; while (flag[1] == TRUE && turn == 1) do_nothing(); <Κρίσιμη Περιοχή> flag[0] = FALSE; } Process 0 - Dekker while (flag[1] == TRUE){ if (turn==1){ while (turn==1) 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη Τι γινόταν προ Dekker; Δύο οδηγοί κινούνται συνέχεια σε ένα πυκνό οδικό δίκτυο, όπου δεν υπάρχουν σήματα. Τι γίνεται μόλις βρουν μία διασταύρωση; Ποιός περιμένει ποιόν και πόση ώρα; Μπορεί να έχουμε φώτα, που όταν είναι αναμένα δηλώνουν πρόθεση να περάσουμε τη διασταύρωση (flag) και μπορεί να έχουμε τροχονόμο (turn). 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη προ Dekker (1) Process 0 - Dekker void P0(){ while(TRUE){ ... flag[0] = TRUE; while (flag[1] == TRUE){ if (turn==1){ flag[0] = FALSE; while (turn==1) do_nothing(); } <Κρίσιμη Περιοχή> turn = 1; Process 0 – πD1 <τυχ.καθυστέρηση> Λείπει ο «τροχονόμος» (turn) και οι οδηγοί ασχολούνται με κάτι «άλλο» πριν δοκιμάσουν να μπουν στη διασταύρωση. Πότε θα ξαναδοκιμάσουν; 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη προ Dekker (2) Process 0 - Peterson void P0(){ while(TRUE){ ... flag[0] = TRUE; turn = 1; while (flag[1] == TRUE && turn == 1) do_nothing(); <Κρίσιμη Περιοχή> flag[0] = FALSE; } Process 0 – πD2 while (flag[1] == TRUE) do_nothing(); Process 1 – πD2 void P1(){ flag[1] = TRUE; while (flag[0] == TRUE) do_nothing(); flag[1] = FALSE; Λείπει ο «τροχονόμος» (turn) και οι οδηγοί είναι ευγενικοί – κανένας δε μπαίνει στη διασταύρωση. Χρησιμοποιούμε τον απλούστερο αλγόριθμο Peterson για λόγους σύγκρισης. 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη προ Dekker (3) Process 0 – πD2 void P0(){ while(TRUE){ ... flag[0] = TRUE; while (flag[1] == TRUE) do_nothing(); <Κρίσιμη Περιοχή> flag[0] = FALSE; } Process 0 – πD3 Process 1 – πD3 void P1(){ while (flag[0] == TRUE) do_nothing(); flag[1] = TRUE; flag[1] = FALSE; Λείπει πάλι ο «τροχονόμος» (turn), αλλάζει η σειρά ελέγχων και οι οδηγοί βιάζονται και μπαίνουν μαζί στη διασταύρωση ... 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη προ Dekker (4) Process 0 - Peterson void P0(){ while(TRUE){ ... flag[0] = TRUE; turn = 1; while (flag[1] == TRUE && turn == 1) do_nothing(); <Κρίσιμη Περιοχή> flag[0] = FALSE; } Process 0 – πD4 while (turn != 0) Process 1 – πD4 void P1(){ while (turn != 1) turn = 0; Υπάρχει ο τροχονόμος (turn) και κάθε οδηγός είναι τυπικός – θα μπει στη διασταύρωση αφού μπει πρώτα ένας από την απέναντι πλευρά, αν έχει σειρά. Βέβαια, δεν ξέρουμε πότε θα έρθει ο απέναντι για να χρησιμοποιήσει τη σειρά του και μπορεί να περιμένουμε χωρίς λόγο ... 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη
Αμοιβαίος Αποκλεισμός και Λάθη Και λίγη ιστορία Διαπερνώντας τις διαφάνεις από το τέλος προς την αρχή, μπορεί κανείς να δει την ιστορία του προβλήματος του αμοιβαίου αποκλεισμού όπως εξελίχτηκε χρονικά. Στην παρούσα προσέγγιση, δουλέψαμε με «αποδόμηση», καταστρέφοντας λίγο-λίγο τη σωστή λύση. 6/30/2019 Αμοιβαίος Αποκλεισμός και Λάθη