Πρωτόκολλο αμοιβαίου αποκλεισμού (mutual exclusion) για δύο διεργασίες-CPN Tools Νάνος Λέανδρος 156 Τζιαλαμάνη Βιργινία 166
Πρόβλημα Δύο διεργασίες εκτελούν μέσα σε ένα ατέρμονο βρόχο (loop) μία σειρά εντολών που χωρίζονται σε τμήματα κώδικα: το κρίσιμο τμήμα κώδικα (critical section) το μη κρίσιμο τμήμα (non critical section). Το πρόγραμμα πρέπει να ικανοποιεί την ιδιότητα του αμοιβαίου αποκλεισμού: οι εντολές των κρίσιμων τμημάτων των διεργασιών δεν πρέπει κατά την εκτέλεση να παρεμβάλλονται μεταξύ τους.
Πρόβλημα loop Non_Critical_Section; Pre_Protocol; Critical_Section; Post_Protocol; end loop; Οι λύσεις που έχουν προταθεί περιγράφονται με την εισαγωγή στο loop επιπλέον εντολών, που εκτελούνται από την υποκείμενη διεργασία κάθε φορά που αυτή εισέρχεται (Pre_Protocol) ή εξέρχεται από το κρίσιμο τμήμα (Post_Protocol)
Απαιτήσεις Προβλήματος Μία διεργασία μπορεί να σταματήσει στο μη κρίσιμο τμήμα, αλλά σε καμία περίπτωση δεν μπορεί να σταματήσει την εκτέλεση κάποιου από τα δύο πρωτόκολλα ή την εκτέλεση των εντολών του κρίσιμου τμήματος Το πρόγραμμα δεν πρέπει να οδηγείται σε αδιέξοδο (deadlock). Αν οι διεργασίες προσπαθούν να εισέλθουν στο κρίσιμο τμήμα τότε μία από αυτές τελικά πρέπει να το επιτύχει. Αν καμία διεργασία δεν καταφέρει να επιτύχει μετάβαση από το Pre_Protocol στο κρίσιμο τμήμα, τότε λέμε ότι το πρόγραμμα έφτασε σε αδιέξοδο.
Απαιτήσεις Προβλήματος Δεν πρέπει να υπάρχει πιθανότητα «λιμοκτονίας» (starvation) για καμία από τις δύο διεργασίες. Αν μία διεργασία εκδηλώσει την πρόθεσή της να εισέλθει στο κρίσιμο τμήμα ξεκινώντας την εκτέλεση του Pre_Protocol τότε πρέπει τελικά αυτό να επιτυγχάνεται. Σε περίπτωση που δεν υπάρχει ανταγωνισμός για το κρίσιμο τμήμα, η διεργασία που αιτείται προσπέλαση στο κρίσιμο τμήμα μπορεί να την επιτύχει.
Λύσεις που προτάθηκαν Κατά καιρούς έχουν προταθεί διάφοροι αλγόριθμοι για την αντιμετώπιση του προβλήματος του αμοιβαίου αποκλεισμού δύο διεργασιών Σε αυτούς: Η προσπέλαση και αποθήκευση τιμών θεωρούμαι ότι εκτελούνται ατομικά Οι μεταβλητές δηλώνονται ως καθολικές μεταβλητές και για τις 2 διεργασίες Σε περίπτωση προσπέλασης και αποθήκευσης που εκτελούνται ταυτόχρονα το αποτέλεσμα είναι να παρεμβάλλεται η μία με την άλλη σε τυχαία σειρά.
1 ος Αλγόριθμος task body P1 is begin loop Non_Critical_Section_1; loop exit when Turn=1; end loop; Critical_Section_1; Turn:=2; end loop; end P1; task body P2 is begin loop Non_Critical_Section_2; loop exit when Turn=2; end loop; Critical_Section_2; Turn:=1; end loop; end P2; Εισάγουμε την μεταβλητή Turn (αρχική τιμή 1). Η Turn μπορεί να πάρει τιμές 1 ή 2 που δηλώνουν τον αριθμό της διεργασίας που έχει σειρά να εισέλθει στο κρίσιμο τμήμα Όταν δεν υπάρχει ανταγωνισμός για το ποια διεργασία θα μπει στο κρίσιμο τμήμα, τότε μια διεργασία που θέλει να μπει μπορεί και να μην το πετύχει
2 ος Αλγόριθμος task body P1 is begin loop Non_Critical_Section_1; loop exit when C2=1; end loop; C1:=0; Critical_Section_1; C1:=1; end loop; end P1; task body P2 is begin loop Non_Critical_Section_2; loop exit when C1=1; end loop; C2:=0; Critical_Section_2; C2:=1; end loop; end P2; Δηλώνουμε τις καθολικές μεταβλητές C1 και C2 (αρχικές τιμές C1=1 και C2=1). Όταν Ci=0 η διεργασία i αιτείται είσοδο στο κρίσιμο τμήμα Δεν ικανοποιείται η ιδιότητα του αμοιβαίου αποκλεισμού καθώς και οι δύο διεργασίες μπορούν να εισέλθουν στο κρίσιμο τμήμα μαζί
3 ος Αλγόριθμος task body P1 is begin loop Non_Critical_Section_1; C1:=0; loop exit when C2=1; end loop; Critical_Section_1; C1:=1; end loop; end P1; task body P2 is begin loop Non_Critical_Section_2; C2:=0; loop exit when C1=1; end loop; Critical_Section_2; C2:=1; end loop; end P2; Η διαφορά με την προηγούμενη περίπτωση είναι ότι η ανάθεση τιμών στις μεταβλητές Ci γίνεται πριν το loop Αν και ικανοποιείται η ιδιότητα του αμοιβαίου αποκλεισμού, ο αλγόριθμος φτάνει σε αδιέξοδο.
4 ος Αλγόριθμος task body P1 is begin loop Non_Critical_Section_1; C1:=0; loop exit when C2=1; C1:=1; C1:=0; end loop; Critical_Section_1; C1:=1; end loop; end P1; task body P2 is begin loop Non_Critical_Section_2; C2:=0; loop exit when C1=1; C2:=1; C2:=0; end loop; Critical_Section_2; C2:=1; end loop; end P2; Μεταξύ δύο διαδοχικών εντολών ανάθεσης η άλλη διεργασία μπορεί να εκτελέσει τυχαίο αριθμό εντολών Η παραπάνω λύση ικανοποιεί την ιδιότητα του αμοιβαίου αποκλεισμού, αλλά υπάρχει ενδεχόμενο μία διεργασία να οδηγείται σε «λιμοκτονία»
Αλγόριθμος Dekker Συνδυάζει την πρώτη και την τέταρτη περίπτωση λύσης 1 η περίπτωση: κάθε διεργασία φανερά περνάει το δικαίωμα εισόδου στο κρίσιμο τμήμα στην άλλη διεργασία 4 η περίπτωση: κάθε διεργασία διαθέτει τις δικές της μεταβλητές και έτσι δεν δημιουργείται πρόβλημα όταν δεν υπάρχει ανταγωνισμός για προσπέλαση στο κρίσιμο τμήμα Χρήση καθολικών μεταβλητών C1,C2 και Turn. Αρχικές τιμές Turn=C1=C2=1.
task body P1 is Begin loop Non_Critical_Section_1; C1:=0; loop exit when C2=1; if Turn=2 then C1:=1; loop exit when Turn=1; end loop; C1:=0; end if; end loop; Critical_Section_1; C1:=1; Turn:=2; end loop; end P1; task body P2 is Βegin loop Non_Critical_Section_2; C2:=0; loop exit when C1=1; if Turn=1 then C2:=1; loop exit when Τurn=2; end loop; C2:=0; end if; end loop; Critical_Section_2; C2:=1; Turn:=1; end loop; end P2;
Καταστάσεις Μοντέλου NCS Non Critical Section : δηλώνει ότι η κατάσταση βρίσκεται στο μη-κρίσιμο τμήμα LOOP Κυρίως βρόγχος : δηλώνει ότι η διεργασία εισέρχεται στον κυρίως βρόγχο (loop … end loop) CH_LOOP δηλώνει την κατάσταση μέσα στο LOOP και λίγο πριν το IF_LOOP IF_LOOP βρόγχος_if : δηλώνει ότι η διεργασία βρίσκεται μέσα στον βρόγχο If (if … end if) INT_LOOP Internal Loop : δηλώνει ότι η διεργασία έχει μπει στον εσωτερικό βρόγχο IF_LOOP_E If_loop_Exit : δηλώνει ότι μόλις βγήκαμε από τον βρόγχο if CS Critical Section : δηλώνει ότι η διεργασία βρίσκεται στο κρίσιμο τμήμα
1 η Διεργασία (P1) NCS1 LOOP1 CS1 CH_LOOP1 IF_LOOP1 INT_LOOP1 IF_LOOP_E1 Turn:=2 C1:=1 C1:=0 If C2:=1 else If Turn:=2 C1:=1 when Turn:=1 C1:=0
2 η Διεργασία (P2) NCS2 LOOP2 CS2 CH_LOOP2 IF_LOOP2 INT_LOOP2 IF_LOOP_E2 Turn:=1 C2:=1 C2:=0 If C1:=1 else If Turn:=1 C2:=1 when Turn:=2 C2:=0
CPN model
Διεργασία P1
Διεργασία P2
Παρατηρήσεις Οι κοινές μεταβλητές που διαμοιράζονται οι δύο διεργασίες είναι η Turn, C1 και C2. Αναπαρίστανται ως places μέσα στο μοντέλο με αρχικές τιμές Turn=C1=C2=1. H κατάσταση της κάθε διεργασίας αναπαρίσταται από το place με όνομα P_state. Οι τιμές που παίρνει το συγκεκριμένο place ανήκουν στο παρακάτω σύνολο {NCS, CS, LOOP, CH_LOOP, IF_LOOP, INT_LOOP, IF_LOOP_E}. Αρχική τιμή του P_state είναι το NCS, δηλώνοντας ότι η διεργασία βρίσκεται στο μη- κρίσιμο τμήμα.
Παρατηρήσεις Σε κάθε διεργασία αντιστοιχούν 7 transitions, τα οποία αλλάζουν την κατάσταση της διεργασίας λαμβάνοντας υπόψη τις τιμές στις 3 διαμοιραζόμενες μεταβλητές( Turn, C1, C2) Κατά την ενεργοποίηση μιας μετάβασης δύο συμβάντα μπορεί να σχετίζονται με τις τρείς κοινές μεταβλητές: Ενημέρωση των μεταβλητών, αλλάζοντας τις τιμές τους Έλεγχος της τιμής μιας εκ των τριών μεταβλητών
Στατιστικά State Space Nodes: 74 Arcs: 136 Secs: 0 Status: Full Liveness Properties Dead Markings: None Dead Transition Instances: None Live Transition Instances: All Scc Graph Nodes: 1 Arcs: 0 Secs: 0