ΕΚΔΟΣΗ 1.1 ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΚΛΟΓΗ ΑΡΧΗΓΟΥ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ
CONTENTS ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ... 2 Εκλογή αρχηγού... 2 Εισαγωγή... 2 Ο Αλγόριθμος του LaLann... 3 Περιγραφή του πρωτοκόλλου του LeLann... 3 Το πρωτόκολλο των Chang & Roberts... 4 Περιγραφή του πρωτοκόλλου... 4 Εργαστηριακή Άσκηση Εκλογή Αρχηγού... 5 Βήμα 1: Ο αλγόριθμος LaLann... 5 Βήμα 2: Ο αλγόριθμος Chang & Roberts... 7 Δραστηριότητες... 10 ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 1
ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΚΛΟΓΗ ΑΡΧΗΓΟΥ ΕΙΣΑΓΩΓΗ Το πρόβλημα αυτό εμφανίζεται σε περιπτώσεις όπου μια διεργασία πρέπει να επιλεγεί για να "αναλάβει" κάποιον υπολογισμό σε επίπεδο δικτύου. Ένας τέτοιος υπολογισμός μπορεί να είναι για παράδειγμα η εκτέλεση μιας σειράς ενεργειών για την αρχικοποίηση κάποιων διεργασιών, για την έναρξη εκτέλεσης ενός κατανεμημένου υπολογισμού ή για την αρχικοποίηση του δικτύου μετά από κάποια αποτυχία (πχ δημιουργία του token σε δίκτυα token ring). Άλλωστε, στις προηγούμενες εργαστηριακές μας ασκήσεις έχουμε χρησιμοποιήσει κόμβους με ειδικούς ρόλους (π.χ. timeserver), οι οποίοι θα μπορούσαν να είχαν προκύψει μέσα από έναν αλγόριθμο εκλογής αρχηγού. Πολλοί κατανεμημένοι αλγόριθμοι (πχ BFS-Breadth First Search, MST- Minimum Spanning Tree, MIS- Maximal Independed Set) προϋποθέτουν την ύπαρξη μιας τέτοιας διεργασίας αρχηγού. Επειδή δεν είναι γνωστό από την αρχή πόσες και ποιες διεργασίες συμμετέχουν σε ένα δίκτυο, δεν μπορεί να οριστεί μια τέτοια διεργασία εκ των προτέρων, επομένως απαιτείται η ύπαρξη ενός κατάλληλου αλγορίθμου για την επιλογή μιας τέτοιας διεργασίας - αρχηγού. Το πρόβλημα αυτό πρώτος το έθεσε ο LeLann (1977), ο οποίος πρότεινε και την πρώτη λύση. Το πρόβλημα εκλογής αρχηγού αποτυπώνει τα βασικά χαρακτηριστικά μιας μεγάλης ομάδας προβλημάτων που αντιμετωπίζουν τα πραγματικά κατανεμημένα συστήματα και εμφανίζεται σε πολλές παραλλαγές. Η εκλογή αρχηγού σε ένα δίκτυο απαιτεί την επιλογή μιας μοναδικής διεργασίας που θα βρεθεί στην κατάσταση "αρχηγός" (ή "εκλεγμένη") ενώ όλες οι άλλες διεργασίες βρίσκονται στην κατάσταση "μηαρχηγός" (ή "μη εκλεγμένη"). Πιο συγκεκριμένα, θεωρούμε ότι κάθε διεργασία έχει μια μοναδική ταυτότητα (ID), επιλεγμένη από ένα αυστηρά διατεταγμένο σύνολο. Το πρόβλημα εκλογής αρχηγού απαιτεί ξεκινώντας από μια διαμόρφωση του δικτύου όπου όλες οι διεργασίες βρίσκονται στην ίδια κατάσταση να καταλήξουμε σε μία διαμόρφωση του δικτύου όπου μόνο μια διεργασία βρίσκεται στη κατάσταση "αρχηγός". Μερικές παραλλαγές του προβλήματος προκύπτουν ανάλογα με το αν οι υπόλοιπες διεργασίες χρειάζεται να γνωρίζουν ότι δεν είναι στην κατάσταση αρχηγός ή να γνωρίζουν την ταυτότητα της διεργασίας-αρχηγού. ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 2
Ένας αλγόριθμος επιλύει το πρόβλημα εκλογής αρχηγού όταν ικανοποιεί τις παρακάτω προδιαγραφές: Όλες οι διεργασίες εκτελούν τον ίδιο τοπικό αλγόριθμο. Ο αλγόριθμος είναι αποκεντρωτικός, δηλαδή ο υπολογισμός μπορεί να ξεκινήσει από ένα αυθαίρετο, μη κενό υποσύνολο των διεργασιών. Ο αλγόριθμος φτάνει σε μια τερματική διαμόρφωση σε κάθε υπολογισμό, και σε αυτή τη διαμόρφωση υπάρχει ακριβώς μια διεργασία που βρίσκεται στην κατάσταση αρχηγός και όλες οι υπόλοιπες βρίσκονται στην κατάσταση "μη-αρχηγός". Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ LALANN Υποθέσεις του αλγορίθμου: Η τοπολογία του δικτύου είναι δακτύλιος ή υπάρχει ένας γεννητικός δακτύλιος στο δίκτυο. Κάθε κόμβος είναι αξιόπιστος και διαθέτει μια μοναδική ταυτότητα (επώνυμο δίκτυο). Ο χρονισμός είναι ασύγχρονος. Ο αριθμός των κόμβων είναι Ν (δεν είναι απαραίτητο να είναι γνωστό το Ν στο δίκτυο). Τα κανάλια είναι αξιόπιστα και είναι FIFO. Υπάρχει η αίσθηση του προσανατολισμού στο δακτύλιο. Nextp είναι ο επόμενος γείτονας του κόμβου p (αριστερόστροφα ή δεξιόστροφα) ΠΕΡΙΓΡΑΦΗ ΤΟΥ ΠΡΩΤΟΚΟΛΛΟΥ ΤΟΥ LELANN Το πρωτόκολλο μπορεί να το ξεκινήσουν ένας ή περισσότεροι αρχικοποιητές. Κάθε αρχικοποιητής στέλνει ένα μήνυμα που περιέχει την ταυτότητά του. Το μήνυμα του αρχικοποιητή p καταλήγει στο ίδιο κόμβο αφού κάνει μια πλήρη περιστροφή. Στο τέλος του πρωτοκόλλου ο κάθε αρχικοποιητής κόμβος έχει σχηματίσει και γνωρίζει το σύνολο των ταυτοτήτων των αρχικοποιητών του δικτύου και μπορεί να επιλέξει με ένα κοινό κριτήριο (π.χ. τη μεγαλύτερη ή τη μικρότερη ταυτότητα) τον αρχηγό. Οι μη αρχικοποιητές δεν συμμετέχουν ενεργά στη διαδικασία εκλογής και απλώς προωθούν στον επόμενο κόμβο τα μηνύματα που λαμβάνουν. ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 3
ΤΟ ΠΡΩΤΟΚΟΛΛΟ ΤΩΝ CHANG & ROBERTS Το μοντέλο του δικτύου: Η επικοινωνία είναι ασύγχρονη. Τα κανάλια επικοινωνίας και οι επεξεργαστές είναι αξιόπιστοι. Κάθε επεξεργαστής έχει ένα μοναδικό id (υποθέτουμε πως οι ταυτότητες βρίσκονται στο διάστημα 0.. Ν-1). Η τοπολογία είναι δακτύλιος μιας κατεύθυνσης. εν είναι απαραίτητο να είναι γνωστό το Ν στους επεξεργαστές. ΠΕΡΙΓΡΑΦΉ ΤΟΥ ΠΡΩΤΟΚΌΛΛΟΥ Το πρωτόκολλο εκλέγει ως αρχηγό τον κόμβο με το μεγαλύτερο id. Θεωρούμε πως υπάρχουν ένας ή περισσότεροι αρχικοποιητές του πρωτοκόλλου. Κάθε αρχικοποιητής μεταπίπτει σε κατάσταση candidate. Κάθε candidate στέλνει την ταυτότητά του στον δακτύλιο. Ένας κόμβος candidate που λαμβάνει ένα μήνυμα, συγκρίνει την ληφθείσα ταυτότητα με τη δικιά του. Αν η ληφθείσα ταυτότητα είναι μεγαλύτερη, τότε ο κόμβος μεταπίπτει σε κατάσταση defeated και στέλνει στο δίκτυο το μήνυμα με τη μεγαλύτερη ταυτότητα. Ένας μη αρχικοποιητής απλώς μεταδίδει τα μηνύματα που λαμβάνει. Αρχικά, μετά το πρώτο μήνυμα που έλαβε μεταπίπτει σε κατάσταση defeated. ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 4
ΕΡΓΑΣΤΗΡΙΑΚΗ ΆΣΚΗΣΗ ΕΚΛΟΓΗ ΑΡΧΗΓΟΥ Σε αυτό το τμήμα της εργαστηριακής άσκησης θα δοκιμάσουμε να υλοποιήσουμε κάποιες εκδόσεις των αλγορίθμου εκλογής αρχηγού και να δοκιμάσουμε την επίδοσή τους. Κατά την διάρκεια εκτέλεσης του εργαστηριακού οδηγού θα πρέπει να συμπληρώνετε παράλληλα και την εργαστηριακή σας αναφορά, πρότυπο της οποίας μπορείτε να βρείτε στο openclass του μαθήματος. Η εργαστηριακή αναφορά θα πρέπει να έχει παραδοθεί την ημέρα πριν το επόμενο εργαστήριο, σύμφωνα με τις οδηγίες. Βήμα 1: Ο αλγόριθμος LaLann Σε αυτό το βήμα θα υλοποιήσουμε τον αλγόριθμο του Lalann σε δακτύλιο. Υποθέστε πως ο αριθμός των ενεργών διεργασιών χρηστών σε κάθε διεργασία δεν μεταβάλλεται κατά την ώρα εκτέλεσης του πρωτοκόλλου υπολογισμού. 1. Ανοίξτε ένα terminal 2. Μπείτε στον φάκελο MPI_ABCD. 3. Δημιουργήστε το αρχείο wave3.c εκτελώντας την εντολή gedit wave3.c 4. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include <mpi.h> ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 5
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <limits.h> #include <unistd.h> int main(int argc, char** argv) int i; MPI_Init(NULL, NULL); //Arxikopoioume to MPI int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); int world_size; int *w; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int ack = 0; int maxweight, tmp, np, leader, OK_W, tmpw, tmpi, flag; MPI_Status status; int myweight[2], RSCV[2]; // printf("process %d has weight %d\n", world_rank, myweight); leader = -1; srand(time(null) + rank);//initialize random function. Use world_rank to get different seeds! int previous = rank - 1; // Node before, in the ring int next = rank + 1; // Node after, in the ring if (previous == -1) previous = world_size - 1; if (next >= world_size) next = 0; w = (int*)malloc(world_size * 10 * sizeof(int) ); //Starting LaLann printf("-------starting LaLann-------\n"); myweight[0] = rank; myweight[1] = rand()%100000 + 1; MPI_Send(&myweight, 2, MPI_INT, next, 0, MPI_COMM_WORLD); w[rank] = myweight[1]; MPI_Recv(&RSCV, 2, MPI_INT, previous, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); while (RSCV[0]!= rank) w[rscv[0]] = RSCV[1]; MPI_Send(&RSCV, 2, MPI_INT, next, 0, MPI_COMM_WORLD); MPI_Recv(&RSCV, 2, MPI_INT, previous, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); printf("-------elections finished-------\n"); sleep(1); maxweight = -1; for (i=0;i<world_size;i++) ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 6
if(w[i] > maxweight) maxweight = w[i]; leader = i; printf("i am node %d and the leader is %d\n", rank, leader); MPI_Finalize(); Βήμα 2: Ο αλγόριθμος Chang & Roberts Σε αυτό το βήμα θα υλοποιήσουμε τον αλγόριθμο των Chang & Roberts. Στο δακτύλιο δεν υπάρχει ένας μοναδικός κόμβος που μπορεί να παίξει το ρόλο του αρχικοποιητή. Υποθέστε πως κάθε κόμβος του κατανεμημένου συστήματος υποστηρίζει κάθε χρονική στιγμή έναν αριθμό ενεργών διεργασιών χρηστών. Ο αριθμός αυτός ανήκει στο διάστημα 1..30. Έτσι, αρχικά ο αλγόριθμος θα αποφασίσει για τον αρχηγό και στην συνέχεια θα υπολογίζει το σύνολο των ενεργών διεργασιών χρηστών του δικτύου, μια ορισμένη χρονική στιγμή. Υποθέστε πως ο αριθμός των ενεργών διεργασιών χρηστών σε κάθε διεργασία δεν μεταβάλλεται κατά την ώρα εκτέλεσης του πρωτοκόλλου υπολογισμού. 1. Ανοίξτε ένα terminal 2. Μπείτε στον φάκελο MPI_ABCD. 3. Δημιουργήστε το αρχείο wave3.c εκτελώντας την εντολή gedit wave3.c 4. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include <mpi.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <limits.h> int main(int argc, char** argv) int i; MPI_Init(NULL, NULL); //Arxikopoioume to MPI int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int ack = 0; int nproc = rand()%30 + 1; ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 7
int maxweight, tmp, np, OK_INIT, OK_W, tmpw, tmpi, flag; MPI_Status status; int myweight; // printf("process %d has weight %d\n", world_rank, myweight); int IAMINITIATOR = rand()%2; //While this node be part of the election game? srand(time(null) + world_rank);//initialize random function. Use world_rank to get different seeds! int previous = world_rank - 1; // Node before, in the ring int next = world_rank + 1; // Node after, in the ring if (previous == -1) previous = world_size - 1; if (next >= world_size) next = 0; //All nodes send their weight and status to node 0 and node 0 decides whether everything is OK if (world_rank!=0) MPI_Recv(&flag, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); while (flag == 0) myweight = rand()%100000 + 1;//Random weight IAMINITIATOR = rand()%2; MPI_Send(&myweight, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); MPI_Send(&IAMINITIATOR, 1, MPI_INT, 0, 1, MPI_COMM_WORLD); printf("process %d sends the weight %d and the status %d\n", world_rank, myweight, IAMINITIATOR); MPI_Recv(&flag, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if (IAMINITIATOR == 1) printf("process %d is waiting for elections\n", world_rank); if (world_rank == 0) printf("-------checking IF ALL NODES HAVE DIFFERENT WEIGHTS-------\n"); myweight = rand()%100000 + 1; while (flag == 0) OK_INIT = 0; OK_W = 1; for (i = 1; i < world_size; i++) MPI_Send(&flag, 1, MPI_INT, i, 0, MPI_COMM_WORLD); int max = -1; ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 8
MPI_STATUS_IGNORE); MPI_STATUS_IGNORE); for (i = 1; i < world_size; i++) MPI_Recv(&tmpw, 1, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_Recv(&tmpI, 1, MPI_INT, i, 1, MPI_COMM_WORLD, if (tmpi == 1) OK_INIT = 1; if (tmpw > max) max = tmpw; else if (tmpw == max) OK_W = 0; if ((OK_W == 1) && (OK_INIT == 1)) flag = 1; else flag = 0; for (i = 1; i < world_size; i++) MPI_Send(&flag, 1, MPI_INT, i, 0, MPI_COMM_WORLD); printf("-------end CHECKING-------\n\n"); //End of initialization phase //Starting Chang & Roberts printf("-------starting Chang & Roberts-------\n"); for (i = 0; i < world_size; i++) if (i == 0) maxweight = myweight; MPI_Send(&maxweight, 1, MPI_INT, next, 2, MPI_COMM_WORLD); // printf("process %d sends the weight %d\n", world_rank, myweight); MPI_Recv(&tmp, 1, MPI_INT, previous, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if (tmp > maxweight) maxweight = tmp; if (myweight == maxweight) printf("process %d is the leader with weight %d\n", world_rank, myweight); IAMINITIATOR = 1; printf("-------elections finished-------\n"); if (myweight == maxweight) int sum = 0; printf("-------polling PROTOCOL STARTING-------\n"); next = world_rank; for (next = 0; next < world_size; next++) if (next!= world_rank) MPI_Send(&ack, 1, MPI_INT, next, 2, MPI_COMM_WORLD); printf("leader %d awakes process %d\n", world_rank, next); ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 9
MPI_Recv(&np, 1, MPI_INT, next, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); sum = sum + np; printf("total PROCESSES are %d\n", sum); printf("-------polling PROTOCOL ENDING-------\n"); if (myweight!= maxweight) MPI_Recv(&ack, 1, MPI_INT, MPI_ANY_SOURCE, 2, MPI_COMM_WORLD, &status); MPI_Send(&nproc, 1, MPI_INT, status.mpi_source, 2, MPI_COMM_WORLD); MPI_Finalize(); 5. Προσπαθήστε να προβλέψετε την έξοδο του προγράμματος 6. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc changroberts.c o changroberts 7. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 10./changroberts 8. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ Προσπαθήστε να λύσετε τις παρακάτω δραστηριότητες. Οι απαντήσεις κάθε δραστηριότητας θα πρέπει να εμφανίζονται στην εργαστηριακή σας αναφορά. 1. Μετατρέψτε το παράδειγμα του βήματος 1, έτσι ώστε ο αρχικοποιητής να εκκινεί την διαδικασία εκλογής αρχηγού κάθε 60 δευτερόλεπτα. 2. Προσθέστε σχόλια και στο πρόγραμμα του βήματος 1. 3. Προσθέστε σχόλια και στο πρόγραμμα του βήματος 2. 4. Μετατρέψτε το παράδειγμα του βήματος 2 έτσι ώστε να ο αρχικοποιητής να υπολογίζει το χρονικό διάστημα που απαιτείται για να ολοκληρωθεί ο αλγόριθμος. 5. Μετατρέψτε το πρόγραμμα του βήματος 2 έτσι ώστε ο δακτύλιος να έχει αριστερόστροφο προσανατολισμό. ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 10
6. Βιβλιογραφία "MPI: The Complete Reference" by Snir, Otto, Huss-Lederman, Walker, and Dongarra, MIT Press (also in Postscript and html) "Using MPI: Portable Parallel Programming with the Message-Passing Interface, " by Gropp, Lusk and Skjellum, MIT Press Designing and Building Parallel Programs, by Ian Foster, Addison-Wesley, 1995. Parallel Programming with MPI, by Peter Pacheco, Morgan-Kaufmann, 1997. MPI θεωρία και Εφαρμογές, A. Μάργαρης, Εκδόσεις Τζιόλα, 2008. Homepage: http:// www.mcs.anl.gov/mpi ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 11