ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΡΟΛΟΓΙΑ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

Σχετικά έγγραφα
ΕΚΔΟΣΗ 1.1 ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΑΛΓΟΡΙΘΜΟΣ POLLING ΚΥΜΑΤΙΚΟΣ ΑΛΓΟΡΙΘΜΟΣ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β.

ΕΚΔΟΣΗ 1.1 ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΚΛΟΓΗ ΑΡΧΗΓΟΥ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΤΟ ΠΡΩΤΟΚΟΛΛΟ TARRY ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

ΕΚΔΟΣΗ 1.1 ΑΠΡΙΛΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΤΟ ΠΡΩΤΟΚΟΛΛΟ ECHO ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ ΣΤO MESSAGE PASSING INTERFACE - MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β.

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. MPI Απλές εντολές 03/13/2016. Οδηγίες αποστολής / παραλαβής μηνυμάτων, Υπολογισμός του π (

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 10/3/2017

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΓΕΝΙΚΟΙ ΓΡΑΦΟΙ ΣΤΟ MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

Φυσικά και λογικά ρολόγια. Κατανεμημένα Συστήματα 1

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

«Συγχρονισμός ρολογιών υπό την παρουσία σφαλμάτων»

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Message Passing Interface (MPI)

Προγραμματισμός συστημάτων UNIX/POSIX. Χρονομέτρηση

Εισαγωγή. E-03: Λειτουργικά Συστήµατα ΙΙ 6. Εαρινό Εξάµηνο SUN RPC. Κλήση Αποµακρυσµένων ιαδικασιών (RPC) Σύνδεση: Port Mapper.

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Παράλληλη Επεξεργασία

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. Γρήγορος οδηγός αναφοράς 1/4/2017

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Προγραµµατισµός µε ανταλλαγή µηνυµάτων Ι. Εισαγωγή στο MPI. Εφαρµογές Ανεξάρτητου Παραλληλισµού.

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Message Passing Interface (MPI)

Μεθόδων Επίλυσης Προβλημάτων

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 6/3/2016

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραμματισμός Ι (ΗΥ120)

Εκφωνήσεις ασκήσεων εργαστηρίου 1

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Επικοινωνία. Message-Passing Interface (MPI) Βασικές Κλήσεις για Sockets. Μοντέλο Μεταβίβασης Μηνυµάτων. Μοντέλα Παράλληλου Υπολογισµού

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

Ε-85: Ειδικά Θέµατα Λογισµικού

Δομημένος Προγραμματισμός (ΤΛ1006)

Αρχιτεκτονική κοινής μνήμης

Παράλληλα και Κατανεµηµένα Συστήµατα. Εισαγωγή

Κατανεμημένα Συστήματα. Javascript LCR example

Κατανεμημένα Συστήματα Ι

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Εργαστήριο 3 Εντολή for while, do while

Συστήµατα Παράλληλης Επεξεργασίας. Message Passing Interface (MPI)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Ενδεικτικές Λύσεις 1ου Σετ Ασκήσεων

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (pthreads)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Κεφάλαιο VIΙΙ Β. Δημακόπουλος

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Προγραμματισμός Η/Υ (ΤΛ2007 )

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Κατανεμημένα Συστήματα Ι

Διάλεξη 12: Διάχυση Μηνυμάτων. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

Σύστημα Διαμοιρασμού Βιβλιογραφικών Αναφορών. Κοντοτάσιου Ιωάννα ΑΜ 3125 Μπέσσας Απόστολος ΑΜ 3171

Εισαγωγή στον Προγραμματισμό

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών. Οδηγίες εργαστηρίου. Συστήματα Παράλληλης Επεξεργασίας 9 ο Εξάμηνο

Σύστημα Διαχείρισης Σκεπτόμενων Συσκευών CASE STUDY

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Μεταβίβαση μηνυμάτων. Κεφάλαιο 5 (νέο βιβλίο) Κεφάλαιο 8 (παλιές σημειώσεις)

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

ΑΣΚΗΣΗ 1: TO ΠΕΡΙΒΑΛΛΟΝ ΕΡΓΑΣΙΑΣ DEV-C++

Εκλογή αρχηγού σε σύγχρονο δακτύλιο: Οι αλγόριθμοι LCR και HS. 1 Ο αλγόριθμος LCR (Le Lann, Chang, and Roberts)

30/4/2012 Συστήματα κατανεμημένης μνήμης και ο προγραμματισμός τους (Ι) Β. Δημακόπουλος

Δομημένος Προγραμματισμός

Εμπειρική αποτίμηση παράλληλων προγραμμάτων

Κατανεμημένα Συστήματα Ι

Βασικές έννοιες. Κατανεμημένα Συστήματα 1

Εισαγωγή στον Προγραμματισμό

Περίληψη Φροντιστηρίου. Κατανεμημένα Συστήματα Ι. Το περιβάλλον DAP - Χαρακτηριστικά. Το περιβάλλον DAP Τι είναι.

Εργαστήριο 5 fork(), exec(), signals

MPI: Message Passing Interface

Εισαγωγή στον Προγραμματισμό

οµήτης παρουσίασης Marzullo και Neiger αλγόριθµος Παράδειγµα Distributed Debugging Εισαγωγικά

Προγραμματισμός Ι (HY120)

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Transcript:

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

CONTENTS ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ... 2 Κατανεμημένα Ρολόγια... 2 Εισαγωγή... 2 Φυσικά Ρολόγια... 2 Ακρίβεια ρολογιού... 2 Συγχρονισμός Φυσικού Ρολογιού... 2 Αλγόριθμος του Christian... 4 Αλγόριθμος του Berkeley... 5 Νέα εργαλεία στο MPI... 6 Η συνάρτηση MPI_WTIME()... 6 Η συνάρτηση sleep()... 7 Το tag MPI_ANY_SOURCE... 7 Εργαστηριακή Άσκηση Κατανεμημένα Ρολόγια... 8 Βήμα 1: Μετρώντας τον χρόνο... 8 Βήμα 2: Ο αλγόριθμος του Cristian 1 η Έκδοση... 9 Βήμα 3: Ο αλγόριθμος του Cristian 2 η Έκδοση... 11 Βήμα 4: Ο αλγόριθμος του Berkeley... 12 Δραστηριότητες... 15 Βιβλιογραφία... 16 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 1

ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ ΦΥΣΙΚΑ ΡΟΛΟΓΙΑ Πολλές φορές, όπως έχουμε ήδη διαπιστώσει, σε ένα κατανεμημένο σύστημα μας είναι πολύ χρήσιμο για να κάνουμε πιο εύκολη την ζωή μας, να έχουμε φυσικό ρολόι σε κάθε κόμβο με σκοπό να εξυπηρετούνται κάποιες λειτουργίες των αλγορίθμων μας όταν απαιτείται κάποια χρονική σειρά σε συγκεκριμένα γεγονότα. Τέτοιες περιπτώσεις είναι το πρόβλημα του συγχρονισμού, το πρόβλημα επικύρωσης δοσοληψιών, το πρόβλημα πιστoποίησης και άλλα. Γενικά το πρόβλημα στα φυσικά ρολόγια εντοπίζεται στο ότι δεν είναι πάντα διαθέσιμο ένα κεντρικοποιημένο ρολόι με το οποίο σχετικά εύκολα θα μπορούσαν να συγχρονιστούν όλοι μας οι κόμβοι (αν και η ύπαρξη τεχνολογιών όπως GPS δεν κάνει κάτι τέτοιο πλέον όνειρο). Συνεπώς με κάποιο τρόπο εμείς πρέπει να διασφαλίσουμε ότι το ρολόι κάθε κόμβου σε κάποια στιγμή κατά την διάρκεια της εκτέλεσης του συστήματος θα έχει την ίδια τιμή t. Ιδανικά αυτή η τιμή t θα πρέπει να είναι και ίση με την t (t=t ) όπου t η πραγματική ώρα, χωρίς αυτό όμως να επηρεάζει την λειτουργία του συστήματός μας καθώς το πρόβλημα δεν είναι να έχουμε την σωστή ώρα αλλά κάποια κοινή. Λαμβάνοντας τώρα υπόψη την ανακρίβεια του εκάστοτε hardware του ρολογιού βλέπουμε πως σε επίπεδο λογισμικού η ώρα την στιγμή t είναι: C(t) = H(t) α + β όπου H(t) είναι η τιμή του φυσικού ρολογιού, α η μονάδα μέτρησης του φυσικού ρολογιού και β η τιμή της ώρας 0, η διόρθωση δηλαδή που έχει γίνει στο ρολόι. Όπως ήδη είπαμε τα ρολόγια δεν είναι τέλεια, δηλαδή σχεδόν ποτέ δεν τυχαίνει να είναι C(t)=H(t). ΑΚΡΙΒΕΙΑ ΡΟΛΟΓΙΟΥ Όσον αφορά το επίπεδο του υλικού η ακρίβεια ενός ρολογιού μπορεί να δίνεται από δύο μετρικές τον ρυθμό απόκλισης και την διαφορά. Ο ρυθμός απόκλισης (drift) είναι ο ρυθμός με τον οποίο το ρολόι επιβραδύνει η επιταχύνει κατά την μέτρηση του χρόνου. Ένα ιδανικό ρολόι δεν θα αποκλίνει καθόλου. Κάθε άλλο θα πηγαίνει πιο γρήγορα ή πιο αργά, από πολύ έως λίγο. Αυτό μετράει ο ρυθμός απόκλισης. Η διαφορά (skew) δύο ρολογιών C1 και C2 ορίζεται σαν C1(t) C2(t) δηλαδή σαν την απόλυτη τιμή της διαφοράς των τιμών των δύο ρολογιών την χρονική στιγμή t. Αν θέλουμε να δούμε την διαφορά ενός ρολογιού από την πραγματική ώρα προφανώς παίρνουμε C(t) Η(t). ΣΥΓΧΡΟΝΙΣΜΟΣ ΦΥΣΙΚΟΥ ΡΟΛΟΓΙΟΥ Η ουσία του προβλήματος έγκειται στο πως θα καταφέρουμε στο κατανεμημένο μας σύστημα να διορθώσουμε την ώρα του ρολογιού του εκάστοτε κόμβου έτσι ώστε να είναι σωστή ή καλύτερα να συμβαδίζει με τις ώρες των άλλων κόμβων. Μία λύση θα ήταν ο κάθε κόμβος να λαμβάνει από κάποιον άλλον την ώρα και ανάλογα με τον χρησιμοποιούμενο αλγόριθμο να την διορθώνει κατάλληλα. Σε μία ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 2

τέτοια περίπτωση αν το ρολόι είχε θετικό ρυθμό απόκλισης τότε θα πρέπει να τοποθετήσει την ώρα του πίσω σε σχέση με αυτή που ήταν. Κάτι τέτοιο θα ήταν προβληματικό. Φανταστείτε ένα σύστημα για το οποίο ξέρουμε ότι έγινε κάποια ενέργεια την χρονική στιγμή Α και ξαφνικά η στιγμή αυτή αποτελεί πλέον το μέλλον. Συνεπώς λοιπόν πρέπει να είμαστε προσεκτικοί με το ποιο στοιχείο του ρολογιού θα πρέπει να αλλάξουμε. Δεν πρέπει λοιπόν αυτό να είναι η τιμή του ρολογιού αυτή καθαυτή αλλά ο ρυθμός του. Στο παραπάνω παράδειγμα με το ρολόι που επιταχύνει αν μικραίναμε το ρυθμό του κατάλληλα μέσα σε λίγο χρόνο θα είχε την σωστή ώρα χωρίς άλλα προβλήματα. Ο συγχρονισμός ρολογιών μπορεί να είναι εσωτερικός ή εξωτερικός. Εσωτερικός θεωρείται αν οι κόμβοι διεργασίες P i, i=1,..., n είναι συγχρονισμένες μεταξύ τους έτσι ώστε να εξασφαλίζεται για κάθε ζεύγος διεργασιών σε κάθε χρονική στιγμή t θα έχουμε C u(t) C v(t) δ με το δ να είναι η μέγιστη διαφορά των ρολογιών και δ 0. Προφανώς εδώ δεν υπάρχει εξωτερική πηγή ρολογιού και οι διεργασίες με βάση κάποιον αλγόριθμο συγχρονίζονται από μόνες τους, γι αυτό και εσωτερικός. Εξωτερικό συγχρονισμό έχουμε όταν οι διεργασίες συγχρονίζονται με ένα εξωτερικό ρολόι C global και συγχρονισμός επιτυγχάνεται όταν για κάθε ζεύγος διεργασιών και οποιαδήποτε χρονική στιγμή t ισχύει C u(t) C global(t) δ, με δ 0. Το δ έχει το ίδιο νόημα με πριν. Από τους ορισμούς των δύο ειδών συγχρονισμών προκύπτει άμεσα ότι αν σε ένα κατανεμημένο σύστημα έχουμε τις διεργασίες εξωτερικά συγχρονισμένες με διαφορά δ θα είναι ταυτόχρονα και εσωτερικά συγχρονισμένες με διαφορά 2δ. Κάτι αντίστροφο δεν ισχύει, δηλαδή αν γνωρίζουμε ότι οι διεργασίες είναι εσωτερικά συγχρονισμένες δεν μπορούμε να πούμε κάτι για τον εξωτερικό συγχρονισμό τους. Πρέπει να έχουμε υπόψη ότι επειδή τα ρολόγια που έχουμε στην διάθεσή μας δεν είναι τέλεια ακόμα και αν τα συγχρονίσουμε μια χρονική στιγμή t, μετά από κάποιο χρόνο, ο οποίος εξαρτάται από το πόσο επιβραδύνει η επιταχύνει το κάθε ρολόι, τα δύο ρολόγια και πάλι θα έχουν διαφορετική ώρα. Συνεπώς ο συγχρονισμός θα είναι μια επαναληπτική διαδικασία και συγκεκριμένα θα πρέπει να συγχρονίσουμε τα τοπικά ρολόγια περιοδικά το λιγότερο κάθε δ/2ρ με δ την μέγιστη διαφορά που θέλουμε να πετύχουμε και ρ την σταθερά ρυθμού απόκλισης των ρολογιών που έχουμε στην διάθεσή μας (την χειρότερη). Είπαμε το λιγότερο καθώς για τον συγχρονισμό των ρολογιών θα τρέχει ένας κατανεμημένος αλγόριθμος, ο οποίος θα περιλαμβάνει αποστολή και λήψη μηνυμάτων κάτι που θα αργεί την όλη διαδικασία. Εξ αιτίας αυτού προφανώς έχουμε και επιπλέον επιβάρυνση του συστήματος με μηνύματα ενώ σοβαρά πρέπει όπως πάντα να λαμβάνεται υπόψη ότι μηνύματα μπορεί να χαθούν άρα συνεπώς να μην επιτευχθεί συγχρονισμός του συστήματος σε κάποια φάση του αλγορίθμου όπου θα έπρεπε να υπήρχε. Όπως είπαμε και πριν ο εξωτερικός συγχρονισμός απαιτεί την ύπαρξη κάποιου ρολογιού με το οποίο μπορούμε να επικοινωνήσουμε και θα το θεωρούμε αξιόπιστη πηγή. Κάτι τέτοιο μπορεί να γίνει είτε με συστήματα παγκόσμιας γεωγραφικής θέσης (GPS) είτε με ραδιοφάρους. Με τα μεν πρώτα μπορούμε να πάρουμε την παγκόσμια ώρα και με τους ραδιοφάρους την τοπική. Αν στο σύστημά μας έχουμε δυνατότητα επικοινωνίας με τέτοιο ρολόι η κάτι παρεμφερές τότε ο εξωτερικός συγχρονισμός θα ήταν κάτι σχετικά εύκολο για τα τοπικά ρολόγια της κάθε διεργασίας. Σε αρκετές περιπτώσεις όμως κάτι τέτοιο δεν είναι εφικτό είτε λόγω κόστους είτε μεγάλης κατανάλωσης ενέργειας δυσανάλογης με τις συσκευές του κατανεμημένου μας συστήματος είτε λόγω μεγέθους. Ωστόσο κάτι λειτουργικό θα ήταν κάποιες από ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 3

τις συσκευές του συστήματός μας να είχαν αυτήν την δυνατότητα και οι υπόλοιπες να συγχρονίζονται με βάση αυτές. Κάτι τέτοιο γίνεται στον αλγόριθμο του Christian που ακολουθεί. ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ CHRISTIAN Ένα μέρος από τους κόμβους του συστήματος έχουν πρόσβαση σε πηγές ρολογιού που θεωρούνται αξιόπιστες (π.χ. GPS) και οι υπόλοιπες όχι. Αυτό κάνει το σύστημά μας ετερογενές. Υπάρχει τουλάχιστον 1 τέτοια διεργασία, έστω P server. 1. Όταν μία διεργασία P u βρίσκεται σε φάση συγχρονισμού στέλνει μήνυμα synch στην P server ρωτώντας την την ώρα. Ταυτόχρονα κρατάει στην μνήμη της την ώρα που έστειλε το μήνυμα (t send). 2. Όταν η διεργασία P server απαντήσει με το μήνυμα time(t) που περιέχει την ώρα της, η P u κρατάει την ώρα που έλαβε το μήνυμα (t rcv). Έτσι είναι σε θέση να υπολογίσει τον χρόνο που έκανε το μήνυμα να φτάσει από την στιγμή που έστειλε εκείνη το synch μήνυμα έστω T roundtrip = t rcv t send. O Τ roundtrip θεωρούμε ότι δεν έχει σημαντικό σφάλμα και πράγματι περιλαμβάνει τον ακριβή χρόνο καθυστέρησης. 3. Η διεργασία P u θέτει την τιμή του ρολογιού της σε t = T server+t roundtrip 2 Με αυτόν τον τρόπο επιτυγχάνεται ο συγχρονισμός για κάθε διεργασία. Επιπλέον, η διεργασία μπορεί να υπολογίσει ή ίσως να ξέρει το άνω όριο και το κάτω όριο για τον χρόνο μετάδοσης σε κάθε κανάλι, συνεπώς της είναι δυνατόν να ρυθμίζει τον ρυθμό μετάδοσης για τον συγχρονισμό στο t d = T min+t max. 2 Στην μέθοδο του Christian υπολογίζεται t d = T roundtrip 2 T min. Η παραπάνω ανάλυση της μεθόδου του Christian μπορεί να γίνει με χρήση της πιθανοτικής μεθόδου και με της T min, T max, T roundtrip να είναι τυχαίες μεταβλητές. Ανάλογα με την τοπολογία, την ταχύτητα και το πόσοι κόμβοι έχουν το πλεονέκτημα της σωστής ώρας ο αλγόριθμος δίνει διαφορετικά T min, T max, και T roundtrip για την κάθε διεργασία P u. Μία παράμετρος για την αποδοτικότητα του συστήματος είναι η διεργασία P server η οποία όπως γίνεται αντιληπτό θα έχει μεγάλο φόρτο εργασίας και σε κάποιες περιπτώσεις π.χ. σε ταυτόχρονες αιτήσεις θα καθυστερεί.. ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 4

ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ BERKELEY Ο αλγόριθμος του Berkeley ανήκει στην κατηγορία αλγορίθμων που δεν χρησιμοποιούν διακομιστή ώρας. Χρησιμοποιήθηκε στο συγχρονισμό των ρολογιών δικτύων συστημάτων Berkeley UNIX. Από το δίκτυο των υπολογιστών ένας ανακηρύσσεται αρχηγός (master) και αναλαμβάνει να συντονίσει το συγχρονισμό των ρολογιών. Ο αρχηγός περιοδικά ζητάει να μάθει από τους κόμβους (slaves) την τοπική ώρα. Ο αρχηγός γνωρίζοντας τις τοπικές τιμές ρολογιών και μια προσέγγιση των καθυστερήσεων δικτύου, εκτιμάει τις τοπικές ώρες (κατά αντιστοιχία με τον αλγόριθμο του Cristian), υπολογίζει τη μέση τιμή και ενημερώνει κάθε κόμβο για τη διόρθωση που πρέπει να κάνει. 1. Ο αρχηγός στέλνει τη δικιά του ώρα στους υπολοίπους κόμβους. 2. Οι άλλοι κόμβοι στέλνουν στον αρχηγό την απόκλιση της ώρας τους Δt i με βάση την ώρα του αρχηγού. 3. Ο αρχηγός υπολογίζει τη μέση απόκλιση 4. Ο αρχηγός θέτει την ώρα του και στέλνει τα ανάλογα μηνύματα στους υπολοίπους κόμβους (- Δt i + c) για να θέσουν και τη δικιά τους ώρα. Με αυτόν τον τρόπο επιτυγχάνεται ο συγχρονισμός για κάθε διεργασία. ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 5

ΝΕΑ ΕΡΓΑΛΕΙΑ ΣΤΟ MPI Για να κατανοήσουμε καλύτερα τα προγράμματα που θα παρουσιαστούν παρακάτω, χρειαζόμαστε κάποια νέα εργαλεία στο MPI. Η ΣΥΝΑΡΤΗΣΗ MPI_WTIME() Σύνταξη Σημασιολογία Παράδειγμα double MPI_Wtime(void) Η συνάρτηση MPI_Wtime() επιστρέφει τον χρόνο που έχει περάσει σε δευτερόλεπτα από μια τυχαία χρονική στιγμή στο παρελθόν Tpast. Είναι ευθύνη του προγραμματιστή να μετατρέψει την τιμή επιστροφής σε δευτερόλεπτα. H Tpast παραμένει double starttime, endtime; starttime = MPI_Wtime();... stuff to be timed... endtime = MPI_Wtime(); elapsed = endtime-starttime; printf("that took %f seconds\n", elapsed); ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 6

σταθερή για όσο χρόνο ζει η διεργασία. Η ΣΥΝΑΡΤΗΣΗ SLEEP() Σύνταξη Σημασιολογία Παράδειγμα void sleep(double time) Η συνάρτηση sleep(double time) αναστέλλει την λειτουργία της διεργασίας για time δευτερόλεπτα. Σε συστήματα linux εμπεριέχεται στην βιβλιοθήκη <unistd.h>. do stuff sleep(1.5); do stuff after 1.5 sec ΤΟ TAG MPI_ANY_SOURCE Σε πάρα πολλές περιπτώσεις μία διεργασία μπορεί να περιμένει ένα μήνυμα χωρίς όμως απαραίτητα να γνωρίζει τον αποστολέα του μηνύματος. Σε αυτή την περίπτωση, δεν μπορούμε να συμπληρώσουμε το πεδίο source στην συνάρτηση MPI_Recv. Για να λύσουμε αυτό το πρόβλημα, χρησιμοποιούμε το tag MPI_ANY_SOURCE. Έτσι, εάν χρησιμοποιήσουμε τον παρακάτω κώδικα μπορούμε (1) να λάβουμε μήνυμα από οποιοδήποτε αποστολέα και (2) να μάθουμε ποιος είναι αυτός ο αποστολέας, με το status.mpi_source. MPI_Status status; MPI_Recv(&req, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status); MPI_Send(&Cutc, 1, MPI_DOUBLE, status.mpi_source, 0, MPI_COMM_WORLD); ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 7

ΕΡΓΑΣΤΗΡΙΑΚΗ ΆΣΚΗΣΗ Σε αυτό το τμήμα της εργαστηριακής άσκησης θα δοκιμάσουμε να υλοποιήσουμε κάποιες εκδόσεις του αλγορίθμου του Cristian και να δοκιμάσουμε την επίδοσή τους. Κατά την διάρκεια εκτέλεσης του εργαστηριακού οδηγού θα πρέπει να συμπληρώνετε παράλληλα και την εργαστηριακή σας αναφορά, πρότυπο της οποίας μπορείτε να βρείτε στο openclass του μαθήματος. Η εργαστηριακή αναφορά θα πρέπει να έχει παραδοθεί την ημέρα πριν το επόμενο εργαστήριο, σύμφωνα με τις οδηγίες. Βήμα 1: Μετρώντας τον χρόνο Στο πρώτο βήμα της εργαστηριακής άσκησης θα προσπαθήσουμε να μετρήσουμε χρονικές διάρκειες χρησιμοποιώντας την συνάρτηση MPI_Wtime(). Για αυτό το λόγο: 1. Συνδεθείτε σε ένα λειτουργικό Linux (Ubuntu ή LUbuntu). 2. Ανοίξτε ένα terminal 3. Δημιουργήστε έναν φάκελο MPI_ABCD, όπου ABCD το μητρώο σας. Για να το πετύχετε αυτό, εκτελέστε την εντολή mkdir MPI_ABCD. Στην συνέχεια μπείτε στον φάκελο εκτελώντας την εντολή cd MPI_ABCD. 4. Δημιουργήστε το αρχείο time.c εκτελώντας την εντολή gedit time.c 5. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include <mpi.h> #include <stdio.h> #include <unistd.h> #include <time.h> #include <limits.h> int main(int argc, char** argv) double t1, t2; MPI_Init(NULL, NULL); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); t1 = MPI_Wtime(); sleep(5); t2 = MPI_Wtime(); printf("process %d needed %1.5f to execute sleep(5).\n", rank, t2-t1); fflush(stdout); MPI_Finalize(); return 0; ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 8

6. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc time.c o time 7. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 10./time. Σε αυτή την εντολή, η παράμετρος np καθορίζει το πλήθος των διεργασιών που θα δημιουργηθούν στον «κόσμο» μας. 8. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. Τι παρατηρείτε; Βήμα 2: Ο αλγόριθμος του Cristian 1 η Έκδοση Σε αυτό το βήμα θα υλοποιήσουμε τον αλγόριθμο του Cristian, με τις εξής παραδοχές: a) Ο TimeServer θα είναι η διεργασία 0. b) Κάθε διεργασία θα ρωτήσει μία φορά τον TimeServer για την ώρα. c) Ο χρόνος επεξεργασίας δεν θα ληφθεί υπόψη. d) Κάθε διεργασία θα χρησιμοποιήσει την συνάρτηση MPI_Wtime() για να θέσει το ρολόι της. Αυτό θα μας δημιουργήσει πρόβλημα, μιας και όλες οι διεργασίες θα έχουν (σχεδόν) την ίδια ώρα. Για τον λόγο αυτό θα «ξεσυγχρονίσουμε» το ρολόι κάθε διεργασίας με έναν τυχαίο αριθμό. Συνεπώς: 1. Ανοίξτε ένα terminal 2. Μπείτε στον φάκελο εκτελώντας την εντολή cd MPI_ABCD. 3. Δημιουργήστε το αρχείο cristian1.c εκτελώντας την εντολή gedit cristian1.c 4. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include <mpi.h> #include <stdio.h> #include <unistd.h> #include <time.h> #include <limits.h> int main(int argc, char** argv) double t0, t1, Cutc, correction, cf; int i, req = 1; MPI_Init(NULL, NULL); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); srand(time(null) + rank); int rt = rand()%300 + 1;//random time from 1 to 300, for producing different clocks if (rank == 0) printf("\ntime server initializing\n"); ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 9

t1 = MPI_Wtime() + rt - 1494000000; printf("my clock says: %1.5f\n", t1); for (i = 1; i < world_size; i++) MPI_Recv(&req, 1, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); Cutc = MPI_Wtime() + rt - 1494000000; MPI_Send(&Cutc, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); else t0 = MPI_Wtime() + rt - 1494000000; MPI_Send(&req, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); //sleep(1);//add network latency MPI_Recv(&Cutc, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); t1 = MPI_Wtime() + rt - 1494000000; correction = Cutc + (t1 - t0) / 2; if (t1 > correction) printf("process %d has to slow down (wait) for %1.3f in order to catch up\n", rank, t1 - correction); else printf("process %d has to add %1.3f to the clock in order to catch up\n", rank, correction - t1); fflush(stdout); fflush(stdout); MPI_Finalize(); return 0; 5. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc cristian1.c o cristian1 6. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 10./cristian1. Σε αυτή την εντολή, η παράμετρος np καθορίζει το πλήθος των διεργασιών που θα δημιουργηθούν στον «κόσμο» μας. 7. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 10

Βήμα 3: Ο αλγόριθμος του Cristian 2 η Έκδοση Σε αυτό το βήμα θα τροποποιήσουμε το προηγούμενο πρόγραμμα, έτσι ώστε κάθε διεργασία να μην κάνει αίτημα μόνο μία φορά, αλλά να συγχρονίζει το ρολόι της όσες φορές θέλει. Έτσι, κάθε διεργασία «κοιμάται» για ένα τυχαίο χρονικό διάστημα και μετά εκτελεί τον συχρονισμό. 1. Ανοίξτε ένα terminal 2. Μπείτε στον φάκελο MPI_ABCD. 3. Δημιουργήστε το αρχείο gen_graph.c εκτελώντας την εντολή gedit cristian2.c 4. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include <mpi.h> #include <stdio.h> #include <unistd.h> #include <time.h> #include <limits.h> int main(int argc, char** argv) double t0, t1, Cutc, correction, cf; int i, req = 1; MPI_Init(NULL, NULL); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Status status; srand(time(null) + rank); int rt = rand()%300 + 1;//random time from 1 to 300, for producing different clocks if (rank == 0) printf("\ntime server initializing\n"); t1 = MPI_Wtime() + rt - 1494000000; printf("my clock says: %1.5f\n", t1); while (1) MPI_Recv(&req, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status); Cutc = MPI_Wtime() + rt - 1494000000; MPI_Send(&Cutc, 1, MPI_DOUBLE, status.mpi_source, 0, MPI_COMM_WORLD); else while (1) sleep(rand()%10 + 1); ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 11

t0 = MPI_Wtime() + rt - 1494000000; MPI_Send(&req, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); //sleep(1);//add network latency MPI_Recv(&Cutc, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); t1 = MPI_Wtime() + rt - 1494000000; correction = Cutc + (t1 - t0) / 2; if (t1 > correction) printf("process %d has to slow down (wait) for %1.3f in order to catch up\n", rank, t1 - correction); else printf("process %d has to add %1.3f to the clock in order to catch up\n", rank, correction - t1); fflush(stdout); fflush(stdout); MPI_Finalize(); return 0; 5. Προσπαθήστε να προβλέψετε την έξοδο του προγράμματος 6. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc cristian2.c o cristian2 7. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 10./cristian2 8. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. Βήμα 4: Ο αλγόριθμος του Berkeley Σε αυτό το βήμα υλοποιήσουμε τον αλγόριθμο του Berkeley. 1. Ανοίξτε ένα terminal 2. Μπείτε στον φάκελο MPI_ABCD. 3. Δημιουργήστε το αρχείο berkeley.c εκτελώντας την εντολή gedit berkeley.c 4. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include <mpi.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <limits.h> ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 12

int main(int argc, char** argv) double t0, t1, newtime, correction, meandev, dev, totaldev, tserver; int i, req = 1; MPI_Init(NULL, NULL); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); srand(time(null) + rank); int rt = rand()%300 + 1;//random time from 1 to 300, for producing different clocks if (rank == 0) double* pt; pt = (double*)malloc(world_size * sizeof(double));; totaldev = 0; printf("\ntime server initializing\n"); t1 = MPI_Wtime() + rt - 1494000000; printf("my clock says: %1.5f\n", t1); for (i = 1; i < world_size; i++) MPI_Send(&t1, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); MPI_Recv(&dev, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); pt[i] = dev; totaldev = totaldev + dev; meandev = totaldev / world_size; printf("\nmean DEVIATION = %1.2f\n", meandev); for (i = 1; i < world_size; i++) correction = meandev - pt[i]; MPI_Send(&correction, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); else ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 13

t0 = MPI_Wtime() + rt - 1494000000; MPI_Recv(&tserver, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); dev = t0 - tserver; MPI_Send(&dev, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); MPI_Recv(&correction, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); printf("process %d received a correction of %1.2f, and now has time %1.2f\n", rank, correction, t0 + correction); fflush(stdout); fflush(stdout); MPI_Finalize(); return 0; 5. Προσπαθήστε να προβλέψετε την έξοδο του προγράμματος 6. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc berkeley.c o berkeley 7. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 10./berkeley 8. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 14

ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ Προσπαθήστε να λύσετε τις παρακάτω δραστηριότητες. Οι απαντήσεις κάθε δραστηριότητας θα πρέπει να εμφανίζονται στην εργαστηριακή σας αναφορά. 1. Μετατρέψτε το παράδειγμα του βήματος 2, έτσι ώστε η διεργασία k να περιμένει k δευτερόλεπτα πριν στείλει το αίτημά της για συγχρονισμό του ρολογιού της. Με αυτόν τον τρόπο η διεργασία TimeServer δεν θα έχει ταυτόχρονα πολλές αιτήσεις. Τι παρατηρείτε; 2. Μετατρέψτε το παράδειγμα του βήματος 3, έτσι ώστε να λαμβάνετε υπόψη και τον χρόνο επεξεργασίας της διεργασίας TimeServer. 3. Μετατρέψτε το παράδειγμα του βήματος 3 έτσι ώστε να υπάρχουν 2 TimeServers. Κάθε διεργασία που επιθυμεί να συγχρονίσει το ρολόι της θα πρέπει να κάνει αίτημα και στους 2 TimeServers και ως ώρα θα χρησιμοποιεί τον μέσο όρο των απαντήσεων. 4. Προσθέστε σχόλια στον κώδικα του βήματος 4. 5. Τροποποιήστε τον κώδικα του βήματος 4, έτσι ώστε ο TimeServer να εκκινεί την διαδικασία και να ενημερώνει τα ρολόγια όλων των υπολοίπων διεργασιών κάθε 10 δευτερόλεπτα. ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 15

ΒΙΒΛΙΟΓΡΑΦΙΑ "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 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 16