Χώροι Πλειάδων (Tuple Spaces) Ταυτόχρονος Προγραμματισμός 1 lalis@inf.uth.gr
Tuple space Ένας κοινός χώρος αποθήκευσης δεδομένων / μηνυμάτων, με μορφή πλειάδων (tuples) Παρέχονται ειδικές λειτουργίες για την προσθήκη, ανάγνωση και αφαίρεση πλειάδων Η ανάγνωση/αφαίρεση των πλειάδων γίνεται με βάση το σχήμα δεδομένων που δίνει/ζητά η εφαρμογή (όχι την σειρά με την οποία προστέθηκαν οι πλειάδες) Μόνιμη επικοινωνία: το tuple space υφίσταται ανεξάρτητα από τις διεργασίες που το χρησιμοποιούν Έμμεση επικοινωνία: οι διεργασίες δεν χρειάζεται να γνωρίζονται μεταξύ τους για να επικοινωνήσουν Ταυτόχρονος Προγραμματισμός 2 lalis@inf.uth.gr
Βασικές λειτουργίες out(<type 1 v 1, type 2 v 2,, type N v N >) προσθήκη πλειάδας (δεν μπλοκάρει) rd(<type 1 *v 1, type 2 *v 2,, type N *v N >) αναμονή μέχρι να υπάρξει «συμβατή» πλειάδα, και επιστροφή τιμών χωρίς να απομακρυνθεί η πλειάδα in(<type 1 *v 1, type 2 *v 2,, type N *v N >) αναμονή μέχρι να υπάρξει «συμβατή» πλειάδα, και επιστροφή τιμών με αφαίρεση της πλειάδας Ταυτόχρονος Προγραμματισμός 3 lalis@inf.uth.gr
Σχήμα πλειάδων Στις λειτουργίες in/rd, η πλειάδα που δίνεται σαν παράμετρος αποτελεί ένα σχήμα αναζήτησης μπορεί να έχει ως πεδία μεταβλητές (διευθύνσεις) ή τιμές Η πλειάδα που επιλέγεται πρέπει να είναι συμβατή, πεδίο-προς-πεδίο, με το σχήμα αναζήτησης ίδιος αριθμός πεδίων, με ίδιους τύπους για κάθε πεδίο αν ένα πεδίο του σχήματος έχει συγκεκριμένη τιμή, η πλειάδα πρέπει να έχει στο ίδιο πεδίο την ίδια τιμή αν ένα πεδίο του σχήματος είναι μεταβλητή, η πλειάδα πρέπει να έχει στο ίδιο πεδίο μια τιμή συμβατού τύπου (αυτή η τιμή αποθηκεύεται τελικά στην μεταβλητή) Ταυτόχρονος Προγραμματισμός 4 lalis@inf.uth.gr
Ταυτόχρονος Προγραμματισμός 5 lalis@inf.uth.gr
P1 out() Ταυτόχρονος Προγραμματισμός 6 lalis@inf.uth.gr
P1 Ταυτόχρονος Προγραμματισμός 7 lalis@inf.uth.gr
P1 Ταυτόχρονος Προγραμματισμός 8 lalis@inf.uth.gr
P1 3 fields match 3 fields Ταυτόχρονος Προγραμματισμός 9 lalis@inf.uth.gr
P1 match Ταυτόχρονος Προγραμματισμός 10 lalis@inf.uth.gr
P1 match Ταυτόχρονος Προγραμματισμός 11 lalis@inf.uth.gr
P1 no match Ταυτόχρονος Προγραμματισμός 12 lalis@inf.uth.gr
P2 out(< john,43,1.80>) Ταυτόχρονος Προγραμματισμός 13 lalis@inf.uth.gr
P2 < john,43,1.80> Ταυτόχρονος Προγραμματισμός 14 lalis@inf.uth.gr
P2 < john,43,1.80> 3 fields match Ταυτόχρονος Προγραμματισμός 15 lalis@inf.uth.gr
P2 < john,43,1.80> match Ταυτόχρονος Προγραμματισμός 16 lalis@inf.uth.gr
P2 < john,43,1.80> match Ταυτόχρονος Προγραμματισμός 17 lalis@inf.uth.gr
P2 < john,43,1.80> no match Ταυτόχρονος Προγραμματισμός 18 lalis@inf.uth.gr
P2 < john,43,1.80> P3 out() Ταυτόχρονος Προγραμματισμός 19 lalis@inf.uth.gr
P2 < john,43,1.80> Ταυτόχρονος Προγραμματισμός 20 lalis@inf.uth.gr
in(<&s,&i,1.65>) P2 < john,43,1.80> Ταυτόχρονος Προγραμματισμός 21 lalis@inf.uth.gr
in(<&s,&i,1.65>) P2 s = mary, i = 23 < john,43,1.80> Ταυτόχρονος Προγραμματισμός 22 lalis@inf.uth.gr
P2 < john,43,1.80> Ταυτόχρονος Προγραμματισμός 23 lalis@inf.uth.gr
rd(< mary,&i,1.65>) P2 < john,43,1.80> Ταυτόχρονος Προγραμματισμός 24 lalis@inf.uth.gr
rd(< mary,&i,1.65>) P2 i = 23 < john,43,1.80> Ταυτόχρονος Προγραμματισμός 25 lalis@inf.uth.gr
< john,43,1.80> Ταυτόχρονος Προγραμματισμός 26 lalis@inf.uth.gr
< john,43,1.80> P5 out(< nick,15,1.75, hello >) Ταυτόχρονος Προγραμματισμός 27 lalis@inf.uth.gr
< john,43,1.80> < nick,15,1.75, hello > Ταυτόχρονος Προγραμματισμός 28 lalis@inf.uth.gr
P6 out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > Ταυτόχρονος Προγραμματισμός 29 lalis@inf.uth.gr
P6 out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > Ταυτόχρονος Προγραμματισμός 30 lalis@inf.uth.gr
out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > Ταυτόχρονος Προγραμματισμός 31 lalis@inf.uth.gr
out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > s = bla,i = 5 Ταυτόχρονος Προγραμματισμός 32 lalis@inf.uth.gr
out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > Ταυτόχρονος Προγραμματισμός 33 lalis@inf.uth.gr
Συγχρονισμός Η λειτουργία out δεν μπλοκάρει Οι λειτουργίες in/rd μπλοκάρουν μέχρι να βρεθεί συμβατή πλειάδα για απομάκρυνση/διάβασμα Αν δύο ή περισσότερες διεργασίες επιχειρήσουν να απομακρύνουν την ίδια πλειάδα ταυτόχρονα (in), μόνο μια από αυτές θα το καταφέρει Οι πλειάδες που βρίσκονται ήδη στο tuple space δεν αλλάζουν μια πλειάδα μπορεί να αφαιρεθεί και να επανατοποθετηθεί, αλλαγμένη, στο tuple space, τότε πρόκειται όμως για μια διαφορετική πλειάδα Πολλά από τα «κλασικά» προβλήματα και σχήματα συγχρονισμού λύνονται πολύ εύκολα Ταυτόχρονος Προγραμματισμός 34 lalis@inf.uth.gr
Αμοιβαίος αποκλεισμός init: out(<"lock">); Pi: while (1) { in(<"lock">); /* mutual exclusion */ out(<"lock">); Ταυτόχρονος Προγραμματισμός 35 lalis@inf.uth.gr
Παραγωγός-καταναλωτής με αποθήκη περιορισμένης χωρητικότητας init: out(<"avl">); out(<"avl">); producer: while (1) { /* produce d */ in(<"avl">); out(<"data",d>); consumer: while (1) { in(<"data",&d>); out(<"avl">); /* consume d */ Ταυτόχρονος Προγραμματισμός 36 lalis@inf.uth.gr
FIFO επικοινωνία μηνυμάτων sender: int n=0; Msg m; while (1) { out(<n++,m>); receiver: int n=0; Msg m; while (1) { in(<n++,&m>); Ταυτόχρονος Προγραμματισμός 37 lalis@inf.uth.gr
FIFO επικοινωνία μηνυμάτων με πολλούς παραλήπτες sender: int n=0; Msg m; while (1) { out(<n++,m>); receiver: int n=0; Msg m; while (1) { rd(<n++,&m>); Ταυτόχρονος Προγραμματισμός 38 lalis@inf.uth.gr
FIFO επικοινωνία μηνυμάτων με πολλούς παραλήπτες και συλλογή μηνυμάτων sender: int n=0; Msg m; while (1) { out(<n++,m>); receiver: int n=0; Msg m; while (1) { rd(<n++,&m>); garbage collector: int n=0; Msg m; while (1) { rd(<n,&m>); sleep(t); in(<n++,m>); Ταυτόχρονος Προγραμματισμός 39 lalis@inf.uth.gr
Φιλόσοφοι init: for (i=0; i<n; i++) { out(<"fork",i>); Pi: int i; while (1) { /* think */ in(<"fork",left(i)>); in(<"fork",right(i)>); /* eat */ out(<"fork",left(i)>); out(<"fork",right(i)>); Ταυτόχρονος Προγραμματισμός 40 lalis@inf.uth.gr
Ευέλικτος συντονισμός Μπορεί να γραφτεί κώδικας που δουλεύει για έναν ανοιχτό/άγνωστο αριθμό διεργασιών, χωρίς καμία γνώση των στοιχείων επικοινωνίας τους Οι διεργασίες μπορεί να προσθαφαιρούνται και να επικοινωνούν με δυναμικό τρόπο Ο αποστολέας και ο παραλήπτης δεν χρειάζεται να υφίστανται την ίδια στιγμή για να επικοινωνήσουν Όπως σε όλα τα σχήματα συγχρονισμού/επικοινωνίας, πρέπει να υπάρχει προσυμφωνημένο «πρωτόκολλο» αλληλεπίδρασης Ταυτόχρονος Προγραμματισμός 41 lalis@inf.uth.gr
Πολλαπλασιασμός πινάκων 1 2 3 4 5 6 7 8 9 1 0 2 0 1 2 1 0 0 = 4 2 6 10 5 18 16 8 30 jobs 1 2 3 1 2 3 7 8 9 1 0 1 0 1 0 2 2 0 =1 1 + 2 0 + 3 1 = 4 =1 0 + 2 1 + 3 0 = 2 =7 2 + 8 2 + 9 0 = 30 Ταυτόχρονος Προγραμματισμός 42 lalis@inf.uth.gr
Init: for (i=0; i<n; i++) { out("a",i,a[i][]>; for (j=0; j<n; j++) { out("b",j,b[][j]>; Master: int i,j,r,c,res; for (i=0; i<n; i++) { for (j=0; j<n; j++) { out(<"job",i,j>); for (i=0; i<n; i++) { for (j=0; j<n; j++) { in(<"res",&r,&c,&res>); print(r,c,res); Worker: int r,c,res,vr[n],vc[n]; while (1) { in(<"job",&r,&c>); in(<"a",r,&vr[]); in(<"b",c,&vc[]); res=0; for (i=0; i<n; i++) { res=res+vr[i]*vc[i]; out(<"res",r,c,res>); Ταυτόχρονος Προγραμματισμός 43 lalis@inf.uth.gr
Init: for (i=0; i<n; i++) { out("a",i,a[i][]>; for (j=0; j<n; j++) { out("b",j,b[][j]>; Master: int i,j,k,r,c,res; for (i=0; i<n; i++) { for (k=0; k<n; k+=step) { out(<"job",i,k>); for (i=0; i<n; i++) { for (j=0; j<n; j++) { in(<"res",&r,&c,&res>); print(r,c,res); Worker: int r,c,k,res,vr[n],vc[n]; while (1) { in(<"job",&r,&k>); in(<"a",r,&vr[]); for (c=k; c<k+step; k++) { in(<"b",c,&vc[]); res=0; for (i=0; i<n; i++) { res=res+vr[i]*vc[i]; out(<"res",r,c,res>); Ταυτόχρονος Προγραμματισμός 44 lalis@inf.uth.gr
<job> Worker Master <job> <res> <res> <job> <res> Worker <job> <res> Worker dynamic worker pool Ταυτόχρονος Προγραμματισμός 45 lalis@inf.uth.gr
Υλοποίηση spaces Σύστημα με κοινή μνήμη Το space διατηρείται σε κοινόχρηστη περιοχή μνήμης Οι λειτουργίες προσθήκης/ανάγνωσης/απομάκρυνσης υλοποιούνται με τους κλασικούς μηχανισμούς συγχρονισμού, π.χ., semaphores Σύστημα χωρίς κοινή μνήμη Το space διατηρείται κεντρικοποιημένα σε έναν κόμβο ή καταναμημένα σε περισσότερους κόμβους Οι λειτουργίες προσθήκης/ανάγνωσης/απομάκρυνσης υλοποιούνται απομακρυσμένα με κάποιο μηχανισμό απομακρυσμένης επικοινωνίας, π.χ., sockets Ταυτόχρονος Προγραμματισμός 46 lalis@inf.uth.gr
P1 P2 P3 Tuple Space API Space Ταυτόχρονος Προγραμματισμός 47 lalis@inf.uth.gr
P1 P2 P3 Tuple Space API Tuple Space API Server Space Client Client Ταυτόχρονος Προγραμματισμός 48 lalis@inf.uth.gr
P1 P2 P3 Tuple Space API Tuple Space API Space Space Ταυτόχρονος Προγραμματισμός 49 lalis@inf.uth.gr