Χώροι Πλειάδων (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 rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 8 lalis@inf.uth.gr
P1 3 fields match 3 fields rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 9 lalis@inf.uth.gr
P1 match rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 10 lalis@inf.uth.gr
P1 match rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 11 lalis@inf.uth.gr
P1 no match rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 12 lalis@inf.uth.gr
P2 out(< john,43,1.80>) rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 13 lalis@inf.uth.gr
P2 < john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 14 lalis@inf.uth.gr
P2 < john,43,1.80> P3 out() rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 15 lalis@inf.uth.gr
P2 < john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 16 lalis@inf.uth.gr
in(<&s,&i,1.65>) P2 < john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 17 lalis@inf.uth.gr
in(<&s,&i,1.65>) P2 s = mary, i = 23 < john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 18 lalis@inf.uth.gr
P2 < john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 19 lalis@inf.uth.gr
rd(< mary,&i,1.65>) P2 < john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 20 lalis@inf.uth.gr
rd(< mary,&i,1.65>) P2 i = 23 < john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 21 lalis@inf.uth.gr
< john,43,1.80> rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 22 lalis@inf.uth.gr
< john,43,1.80> P5 out(< nick,15,1.75, hello >) rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 23 lalis@inf.uth.gr
< john,43,1.80> < nick,15,1.75, hello > rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 24 lalis@inf.uth.gr
P6 out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 25 lalis@inf.uth.gr
P6 out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 26 lalis@inf.uth.gr
out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > rd(<&s,&i,1.75>) P4 Ταυτόχρονος Προγραμματισμός 27 lalis@inf.uth.gr
out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > rd(<&s,&i,1.75>) s = bla,i = 5 P4 Ταυτόχρονος Προγραμματισμός 28 lalis@inf.uth.gr
out(< bla,5,1.75>) < john,43,1.80> < nick,15,1.75, hello > Ταυτόχρονος Προγραμματισμός 29 lalis@inf.uth.gr
Συγχρονισμός Η λειτουργία out δεν μπλοκάρει Οι λειτουργίες in/rd μπλοκάρουν μέχρι να βρεθεί συμβατή πλειάδα για απομάκρυνση/διάβασμα Αν δύο ή περισσότερες διεργασίες επιχειρήσουν να απομακρύνουν την ίδια πλειάδα ταυτόχρονα (in), μόνο μια από αυτές θα το καταφέρει Οι πλειάδες που βρίσκονται ήδη στο tuple space δεν αλλάζουν μια πλειάδα μπορεί να αφαιρεθεί και να επανατοποθετηθεί, αλλαγμένη, στο tuple space, τότε πρόκειται όμως για μια διαφορετική πλειάδα Πολλά από τα «κλασικά» προβλήματα και σχήματα συγχρονισμού λύνονται πολύ εύκολα Ταυτόχρονος Προγραμματισμός 30 lalis@inf.uth.gr
Αμοιβαίος αποκλεισμός init: out(<"lock">); Pi: while (1) { in(<"lock">); /* mutual exclusion */ out(<"lock">); Ταυτόχρονος Προγραμματισμός 31 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>); Ταυτόχρονος Προγραμματισμός 32 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>); Ταυτόχρονος Προγραμματισμός 33 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>); Ταυτόχρονος Προγραμματισμός 34 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 */ Ταυτόχρονος Προγραμματισμός 35 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)>); Ταυτόχρονος Προγραμματισμός 36 lalis@inf.uth.gr
Ευέλικτος συντονισμός Μπορεί να γραφτεί κώδικας που δουλεύει για έναν ανοιχτό/άγνωστο αριθμό διεργασιών, χωρίς καμία γνώση των στοιχείων επικοινωνίας τους Οι διεργασίες μπορεί να προσθαφαιρούνται και να επικοινωνούν με δυναμικό τρόπο Ο αποστολέας και ο παραλήπτης δεν χρειάζεται να υφίστανται την ίδια στιγμή για να επικοινωνήσουν Όπως σε όλα τα σχήματα επικοινωνίας, απαιτείται προσυμφωνημένο «πρωτόκολλο» αλληλεπίδρασης Ταυτόχρονος Προγραμματισμός 37 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 Ταυτόχρονος Προγραμματισμός 38 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>); Ταυτόχρονος Προγραμματισμός 39 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>); Ταυτόχρονος Προγραμματισμός 40 lalis@inf.uth.gr
<job> Worker Master <job> <res> <res> <job> <res> Worker <job> <res> Worker dynamic worker pool Ταυτόχρονος Προγραμματισμός 41 lalis@inf.uth.gr
Υλοποίηση spaces Τοπικά: Κοινόχρηστη μνήμη Συγχρονισμός λειτουργιών out, in, rd με τους κλασικούς μηχανισμούς, π.χ., σηματοφόρους Κατανεμημένα: Το space διατηρείται σε έναν εξυπηρετητή που προσπελάζουν οι διεργασίες πάνω από το δίκτυο Εναλλακτικά, κατανομή του space σε πολλούς Η/Υ Υλοποίηση λειτουργιών out, in, rd με μηχανισμούς διαδιεργασιακής επικοινωνίας, π.χ., υποδοχείς Ταυτόχρονος Προγραμματισμός 42 lalis@inf.uth.gr
P1 P2 P3 Tuple Space API Space Ταυτόχρονος Προγραμματισμός 43 lalis@inf.uth.gr
P1 P2 P3 Tuple Space API Tuple Space API Server Space Client Client Ταυτόχρονος Προγραμματισμός 44 lalis@inf.uth.gr
P1 P2 P3 Tuple Space API Tuple Space API Space Space Ταυτόχρονος Προγραμματισμός 45 lalis@inf.uth.gr