Αμοιβαίος αποκλεισμός με ασύγχρονη επικοινωνία (ανταλλαγή μηνυμάτων) Ταυτόχρονος Προγραμματισμός 1 lalis@inf.uth.gr
Μοντέλο δικτύου/επικοινωνίας Αξιοπιστία (δεν χάνονται μηνύματα) Άγνωστη ταχύτητα μετάδοσης μηνυμάτων Αλλαγή σειράς των μηνυμάτων (προσπεράσματα) Ο αποστολέας δεν μπλοκάρεται και δεν γνωρίζει πότε το μήνυμα που έστειλε φτάνει στον παραλήπτη Ο παραλήπτης ειδοποιείται όταν φτάνει το μήνυμα Το μοντέλο αυτής της ασύγχρονης επικοινωνίας έχει εφαρμογή τόσο σε κατανεμημένα συστήματα όσο και σε συστήματα με πολλούς επεξεργαστές που (λόγω κλιμάκωσης) επικοινωνούν πάνω από ένα δίκτυο (interconnection network) Ταυτόχρονος Προγραμματισμός 2 lalis@inf.uth.gr
Application layer send deliver msg msg Messaging layer msg msg Network layer t Ταυτόχρονος Προγραμματισμός 3 lalis@inf.uth.gr
P1 send(m1) send(m2) P2 m2 delivered before m1 deliver(m2) send(m3) deliver(m1) m3 delivered before m2 P3 deliver(m3) deliver(m2) t Ταυτόχρονος Προγραμματισμός 4 lalis@inf.uth.gr
Αμοιβαίος αποκλεισμός Οι διεργασίες μπορεί να θελήσουν να κλειδώσουν ανά πάσα στιγμή κατά την διάρκεια της εκτέλεσης Αυτό μπορεί να γίνει πολλές φορές ή καμία Αμοιβαίος αποκλεισμός: αν μια διεργασία κλειδώσει, καμία άλλη διεργασία δεν θα καταφέρει να κλειδώσει αν το επιχειρήσει θα μπλοκάρει Απουσία λιμοκτονίας: αν μια διεργασία θελήσει να κλειδώσει, τελικά θα το καταφέρει Ταυτόχρονος Προγραμματισμός 5 lalis@inf.uth.gr
Αλγόριθμος με συντονιστή Η διεργασία Pc παίζει τον ρόλο του συντονιστή Κλείδωμα: η διεργασία στέλνει στην Pc αίτηση κλειδώματος, και περιμένει να λάβει επιβεβαίωση Ξεκλείδωμα: η διεργασία στέλνει στην Pc μήνυμα ξεκλειδώματος Η διεργασία Pc αποθηκεύει τις αιτήσεις που λαμβάνει σε μια ουρά (FIFO), και στέλνει επιβεβαίωση στην διεργασία που βρίσκεται πρώτη στην ουρά Ταυτόχρονος Προγραμματισμός 6 lalis@inf.uth.gr
queue Ταυτόχρονος Προγραμματισμός 7 lalis@inf.uth.gr
queue lock Ταυτόχρονος Προγραμματισμός 8 lalis@inf.uth.gr
queue ok have lock Ταυτόχρονος Προγραμματισμός 9 lalis@inf.uth.gr
queue have lock lock Ταυτόχρονος Προγραμματισμός 1 lalis@inf.uth.gr
queue have lock Ταυτόχρονος Προγραμματισμός 11 lalis@inf.uth.gr
queue lock have lock Ταυτόχρονος Προγραμματισμός 12 lalis@inf.uth.gr
queue have lock Ταυτόχρονος Προγραμματισμός 13 lalis@inf.uth.gr
queue unlock unlock Ταυτόχρονος Προγραμματισμός 14 lalis@inf.uth.gr
queue ok have lock Ταυτόχρονος Προγραμματισμός 15 lalis@inf.uth.gr
queue have lock Ταυτόχρονος Προγραμματισμός 16 lalis@inf.uth.gr
queue unlock unlock Ταυτόχρονος Προγραμματισμός 17 lalis@inf.uth.gr
queue have lock ok Ταυτόχρονος Προγραμματισμός 18 lalis@inf.uth.gr
queue have lock Ταυτόχρονος Προγραμματισμός 19 lalis@inf.uth.gr
queue unlock unlock Ταυτόχρονος Προγραμματισμός 2 lalis@inf.uth.gr
queue Ταυτόχρονος Προγραμματισμός 21 lalis@inf.uth.gr
Pi: Init: bool ok; Lock: ok=false; send(pc,<lock,myid>); while (!ok) {} Unlock: send(pc,<unlock>); On received <OK>: ok=true; Pc: Init: Queue q={}; On received <LOCK,p>: add(q,p); if (head(q) == p) { send(p,<ok>); } On received <UNLOCK>: rmv(q); p=head(q); if (p!= NULL) { send(p,<ok>); } Ταυτόχρονος Προγραμματισμός 22 lalis@inf.uth.gr
Χαρακτηριστικά Φόρτος επικοινωνίας Κλείδωμα: 2 μηνύματα (συνδυασμός με επιβεβαίωση) Ξεκλείδωμα: 1 μήνυμα Καθυστέρηση κλειδώματος 2 x MsgT Ο συντονιστής μπορεί να γίνει σημείο συμφόρησης Υπάρχει κόστος επικοινωνίας/συγχρονισμού, ακόμα και όταν δεν υφίσταται ανταγωνισμός (δηλαδή η ίδια διεργασία επιθυμεί να κλειδώσει επανειλημμένα, χωρίς να ενδιαφέρεται καμία άλλη) Ταυτόχρονος Προγραμματισμός 23 lalis@inf.uth.gr
Συμμετρικός αλγόριθμος (Ricart & Agrawala) Κλείδωμα: η διεργασία στέλνει σε όλες τις διεργασίες αίτηση με έναν αριθμό σειράς, και περιμένει να λάβει άδεια από όλες τις διεργασίες Αποστολή αδείας: μια διεργασία στέλνει άδεια αν δεν έχει στείλει αίτηση ή η δική της αίτηση έχει μεγαλύτερο αριθμό σειράς, διαφορετικά βάζει την αίτηση σε τοπική αποθήκη tie break με βάση τα αναγνωριστικά των διεργασιών Ο τοπικός αριθμός σειράς αυξάνεται κάθε φορά που λαμβάνεται αίτηση με μεγαλύτερο αριθμό σειράς Ξεκλείδωμα: η διεργασία δίνει άδεια σε όλες τις αιτήσεις που βρίσκει στην αποθήκη της Ταυτόχρονος Προγραμματισμός 24 lalis@inf.uth.gr
4 4 4 4 Ταυτόχρονος Προγραμματισμός 25 lalis@inf.uth.gr
5 : : : : OK lock,5. 4 4 lock,5. : : OK : : 5 Ταυτόχρονος Προγραμματισμός 26 lalis@inf.uth.gr
5 : OK : : OK : OK ok ok ok 5 5 ok ok : OK : OK : OK : OK 5 lock,5. Ταυτόχρονος Προγραμματισμός 27 lalis@inf.uth.gr
5 : OK : : OK : OK 5 5 have lock 5 lock,5. Ταυτόχρονος Προγραμματισμός 28 lalis@inf.uth.gr
5 5 lock,6. : OK : : OK : OK 6 : : : OK : have lock 5 lock,5. Ταυτόχρονος Προγραμματισμός 29 lalis@inf.uth.gr
6 lock,6. ok 6 : OK : : OK : OK 6 : OK : : OK : have lock 6 lock,5. lock,6. Ταυτόχρονος Προγραμματισμός 3 lalis@inf.uth.gr
6 lock,6. 6 : OK : : OK : OK 6 : OK : : OK : have lock 6 lock,5. lock,6. Ταυτόχρονος Προγραμματισμός 31 lalis@inf.uth.gr
6 lock,6. ok 6 : OK : OK : OK : OK 6 : OK : OK : OK : ok unlock 6 lock,5. lock,6. Ταυτόχρονος Προγραμματισμός 32 lalis@inf.uth.gr
lock,6. 6 have lock 6 6 : OK : OK : OK : 6 Ταυτόχρονος Προγραμματισμός 33 lalis@inf.uth.gr
lock,6. 6 unlock 6 ok 6 : OK : OK : OK : OK 6 Ταυτόχρονος Προγραμματισμός 34 lalis@inf.uth.gr
6 have lock 6 6 6 Ταυτόχρονος Προγραμματισμός 35 lalis@inf.uth.gr
6 unlock 6 6 6 Ταυτόχρονος Προγραμματισμός 36 lalis@inf.uth.gr
6 6 6 6 Ταυτόχρονος Προγραμματισμός 37 lalis@inf.uth.gr
Init: Queue q={}; seqn=, reqn=, acks; Lock: seqn++; reqn=seqn; acks=1; for-each p!= myid { send(p,<lock,myid,reqn>); } while (acks!= N) {} Unlock: reqn=; for (p=rmv(q); p!= NULL; p=rmv(q)) { send(p,<ok>); } On received <LOCK,p,n>: seqn = max(seqn,n); if (reqn == ) { send(p,<ok>); } else if (n < reqn) { send(p,<ok>); } else if (n == reqn) && (p < myid) { send(p,<ok>); } else { add(q,p); } On received <OK>: acks++; Ταυτόχρονος Προγραμματισμός 38 lalis@inf.uth.gr
Χαρακτηριστικά Φόρτος επικοινωνίας Κλείδωμα: 2 x (Ν-1) μηνύματα (1 με εκπομπή + Ν-1) (συνδυασμός με επιβεβαιώσεις) Καθυστέρηση κλειδώματος (Ν-1) x 2 x MsgT (2 x MsgT με παράλληλη επικοινωνία) Αποφυγή προσπεράσματος μιας διεργασίας που επιθυμεί να κλειδώσει, ανεξάρτητα από το πόσο αργά μεταδίδονται τα μηνύματα που αυτή στέλνει Μηδενικό κόστος αν δεν υφίσταται ανταγωνισμός (και η διεργασία ήταν η τελευταία που κλείδωσε) Μεγάλο κόστος όταν υφίσταται ανταγωνισμός Ταυτόχρονος Προγραμματισμός 39 lalis@inf.uth.gr
Αλγόριθμος σκυτάλης (Ricart & Agrawala) Δικαίωμα κλειδώματος έχει όποιος κρατά την σκυτάλη (η σκυτάλη πρέπει να αλλάζει χέρια κατάλληλα) Η σκυτάλη κουβαλάει πληροφορία για το πόσες φορές έχει λάβει την σκυτάλη κάθε διεργασία Κλείδωμα: αν η διεργασία δεν κρατά την σκυτάλη, στέλνει σε όλες τις διεργασίες αίτηση με έναν αριθμό σειράς, και περιμένει να λάβει την σκυτάλη Αποστολή αδείας: η διεργασία που κρατά την σκυτάλη, αν δεν έχει κλειδώσει, στέλνει την σκυτάλη σε μια από τις διεργασίες που την έχουν ζητήσει (αλλά ακόμα δεν την έχουν λάβει) Ξεκλείδωμα: αποστολή σκυτάλης (αν έχει ζητηθεί) Ταυτόχρονος Προγραμματισμός 4 lalis@inf.uth.gr
reqs reqs reqs reqs Ταυτόχρονος Προγραμματισμός 41 lalis@inf.uth.gr
reqs reqs lock,,1 reqs reqs 1 Ταυτόχρονος Προγραμματισμός 42 lalis@inf.uth.gr
reqs 1 reqs 1 token,[,,,] 1 reqs reqs 1 Ταυτόχρονος Προγραμματισμός 43 lalis@inf.uth.gr
reqs 1 reqs 1 1 reqs reqs 1 have lock 1 Ταυτόχρονος Προγραμματισμός 44 lalis@inf.uth.gr
reqs 1 1 lock,,1 reqs 1 1 reqs reqs 1 have lock 1 Ταυτόχρονος Προγραμματισμός 45 lalis@inf.uth.gr
reqs 1 1 reqs 1 1 1 1 reqs reqs 1 1 have lock 1 Ταυτόχρονος Προγραμματισμός 46 lalis@inf.uth.gr
reqs 1 1 lock,,1 reqs 1 1 1 1 1 reqs reqs 1 1 have lock 1 Ταυτόχρονος Προγραμματισμός 47 lalis@inf.uth.gr
reqs 1 1 1 reqs 1 1 1 1 1 1 reqs reqs 1 1 1 have lock 1 Ταυτόχρονος Προγραμματισμός 48 lalis@inf.uth.gr
reqs 1 1 1 reqs 1 1 1 token,[,1,,] 1 1 1 reqs reqs 1 1 1 unlock 1 Ταυτόχρονος Προγραμματισμός 49 lalis@inf.uth.gr
reqs 1 1 1 have lock reqs 1 1 1 1 1 1 reqs 1 1 reqs 1 1 1 1 Ταυτόχρονος Προγραμματισμός 5 lalis@inf.uth.gr
reqs 1 1 1 unlock token,[,1,1,] reqs 1 1 1 1 1 1 reqs 1 1 reqs 1 1 1 1 Ταυτόχρονος Προγραμματισμός 51 lalis@inf.uth.gr
reqs 1 1 1 1 1 1 have lock reqs 1 1 1 1 1 1 reqs 1 1 reqs 1 1 1 1 Ταυτόχρονος Προγραμματισμός 52 lalis@inf.uth.gr
reqs 1 1 1 1 1 1 unlock reqs 1 1 1 1 1 1 reqs 1 1 reqs 1 1 1 1 Ταυτόχρονος Προγραμματισμός 53 lalis@inf.uth.gr
reqs 1 1 1 1 1 1 reqs 1 1 1 1 1 1 reqs 1 1 reqs 1 1 1 1 Ταυτόχρονος Προγραμματισμός 54 lalis@inf.uth.gr
Init: int reqs[n]={,,}, [N]={,,}; bool havetoken=(myid == ); Lock: if (!havetoken) { reqs[myid]++; for-each p!= myid { send(p,<lock,myid,reqs[myid]>); } while (!havetoken) {} } havetoken=false; Unlock: havetoken=true; [myid] = reqs[myid]; sendtoken(); // yield On received <LOCK,p,k>: reqs[p] = max(reqs[p],k); if (havetoken) { sendtoken; } sendtoken(): if for-some p: reqs[p] > [p] { send(p,<token,[]>); havetoken=false; } On received <TOKEN,g[]>: = g; havetoken = true; Ταυτόχρονος Προγραμματισμός 55 lalis@inf.uth.gr
Χαρακτηριστικά Φόρτος επικοινωνίας Κλείδωμα: Ν μηνύματα (2 αν υποστηρίζεται εκπομπή) Καθυστέρηση κλειδώματος Ν x MsgT (2 x MsgT αν υποστηρίζεται εκπομπή) Μηδενικό κόστος αν δεν υφίσταται ανταγωνισμός Μέτριο κόστος όταν υφίσταται ανταγωνισμός Ανάλογα με το πώς εξετάζονται οι εισαγωγές στους πίνακες, μπορεί να δοθεί προτεραιότητα (οπότε υπάρχει και περίπτωση λιμοκτονίας) ή να δοθούν εγγυήσεις δικαιοσύνης (απουσία λιμοκτονίας) Ταυτόχρονος Προγραμματισμός 56 lalis@inf.uth.gr
Αλγόριθμος δέντρου (Neilsen-Mizuno) Οι διεργασίες οργανώνονται σε εικονικό δέντρο: η ρίζα έχει την σκυτάλη, και οι υπόλοιπες διεργασίες έχουν κατευθυνόμενες ακμές προς την ρίζα Κλείδωμα: αν η διεργασία δεν κρατά την σκυτάλη, στέλνει αίτηση προς την ρίζα του δέντρου η αίτηση προωθείται προς την ρίζα, ανακατευθύνοντας τις ακμές έτσι ώστε να δείχνουν προς την διεργασία που έστειλε την αίτηση Αποστολή άδειας: η διεργασία που κρατά την σκυτάλη, αν δεν έχει κλειδώσει, στέλνει την σκυτάλη στην διεργασία που την ζητά, ανακατευθύνοντας την ακμή μέσω της οποίας έλαβε την αίτηση Ξεκλείδωμα: αποστολή σκυτάλης, ως άνω Ταυτόχρονος Προγραμματισμός 57 lalis@inf.uth.gr
4 have lock 4 4 1 p5 3 Ταυτόχρονος Προγραμματισμός 58 lalis@inf.uth.gr
4 have lock 4 4 lock,, 2 p5 3 Ταυτόχρονος Προγραμματισμός 59 lalis@inf.uth.gr
4 have lock 2 lock,, 4 2 p5 3 Ταυτόχρονος Προγραμματισμός 6 lalis@inf.uth.gr
1 2 have lock 2 4 2 p5 3 Ταυτόχρονος Προγραμματισμός 61 lalis@inf.uth.gr
1 2 have lock 2 4 lock,p5,p5 2 p5 5 Ταυτόχρονος Προγραμματισμός 62 lalis@inf.uth.gr
1 2 have lock 2 lock,,p5 5 2 p5 5 Ταυτόχρονος Προγραμματισμός 63 lalis@inf.uth.gr
3 2 have lock 2 lock,,p5 5 2 p5 5 Ταυτόχρονος Προγραμματισμός 64 lalis@inf.uth.gr
3 2 have lock 4 5 lock,,p5 2 p5 5 Ταυτόχρονος Προγραμματισμός 65 lalis@inf.uth.gr
3 2 have lock 4 5 1 5 p5 5 Ταυτόχρονος Προγραμματισμός 66 lalis@inf.uth.gr
3 2 unlock 4 token 5 1 5 p5 5 Ταυτόχρονος Προγραμματισμός 67 lalis@inf.uth.gr
3 4 5 1 5 p5 5 have lock Ταυτόχρονος Προγραμματισμός 68 lalis@inf.uth.gr
3 4 5 1 5 token p5 5 unlock Ταυτόχρονος Προγραμματισμός 69 lalis@inf.uth.gr
3 4 5 have lock 1 p5 5 Ταυτόχρονος Προγραμματισμός 7 lalis@inf.uth.gr
3 4 5 unlock 1 p5 5 Ταυτόχρονος Προγραμματισμός 71 lalis@inf.uth.gr
3 4 5 1 p5 5 Ταυτόχρονος Προγραμματισμός 72 lalis@inf.uth.gr
Init: int =(init to form a tree), =; bool havetoken=( == myid); Lock: if (!havetoken) { send(,<lock,myid,myid>); =myid; while (!havetoken) {} } havetoken=false; Unlock: if ( == ) { havetoken=true; } else { send(,<token>); =; } On received <LOCK,p,org>: if (!= myid) { send(,<lock,myid,org>); } else if havetoken { send(org,<token>); havetoken=false; } else { =org; } =p; On received <TOKEN>: havetoken = true; Ταυτόχρονος Προγραμματισμός 73 lalis@inf.uth.gr