Επισκόπηση Κατανεµηµένα Συστήµατα Ι Μάθηµα Βασικής Επιλογής, Χειµερινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων Χρήστος Κονίνης Ορέστης Ακριβόπουλος Example Τρίτη, 9 Νοεµβρίου 2010 Υπολογιστικό 1. Αποφασίζουµε για όλες τις µεταβλητές που χρειάζεται ο αλγόριθµός 2. Τις δηλώνουµε στο αρχείο processor.h ως private µεταβλητές π.χ.: private : bool i s _leader_ ; / / ; 3. Τις αρχικοποιείται στον constructor του processor.cpp π.χ.: Processor : : Processor ( ) { is_leader_ = false ; 4. Τις αρχικοποιείται επιπλέον αν χρειάζεται στην boot() ή special_boot() του processor.cpp π.χ.: void Processor : : boot ( void ) { i f ( i d ( ) == 0) { i s _ l e a d e r _ = true ; 5. Τοποθετούµε τον κώδικα για τα περιοδικά tasks στη work() π.χ.: 6. Για κάθε τύπο µηνύµατος ϑα έχουµε µια µέθοδο handle_ τύπος µηνύµατος _message() και τοποθετούµε εκεί τον κώδικα για την επεξεργασία του
Χρήσιµες συναρτήσεις που µπορείτε να καλέσετε Χρήσιµες συναρτήσεις που µπορείτε να καλέσετε - παράδειγµα Οι πιο σηµαντικές συναρτήσεις ενός µηνύµατος είναι: int source_w().id() : Ο κόµβος που έστειλε το µήνυµα. set_size(int) : Θέτουµε το µέγεθος του µηνύµατος, δεν πρόκειται για το πραγµατικό µέγεθος των δεδοµένων που στέλνουµε αλλά για εικονικό µέγεθος int size() : Παίρνουµε µέγεθος του µηνύµατος που έχουµε ϑέσει double timestamp_time() : Η χρονική στιγµή που στάλθηκε το µήνυµα, το ϑέτει αυτόµατα ο κόµβος-αποστολέας Προσθέστε τον παρακάτω κώδικα ώστε να γνωρίζετε από ποιόν πήρατε µήνυµα: void Processor : : handle_flooding_message ( const Message& f l o o d i n g ) throw ( ) { cout << id ( ) << " : Received flooding msg from "<< flooding. source_w Επισκόπηση (1 of 4) Example Μέχρι τώρα για να εκτελέσουµε τις εξοµοιώσεις γράφουµε όλες τις παραµέτρους σε ένα.conf αρχείο Αλλά τι γίνεται σε περίπτωση που ϑέλουµε να έχουµε πιο πολύπλοκο έλεγχο των εξοµοιώσεων; Για παράδειγµα έστω ότι χρειαζόµαστε να εκτελέσουµε 100 ϕορές µια εξοµοίωση for-loops if-then Το είναι ένας διαφορετικός τρόπος για να γράφουµε config αρχεία που µας επιτρέπει µεγαλύτερο έλεγχο της εξοµοίωσης
(2 of 4) (3 of 4) Οι κύριες εντολές ενός config αρχείου είναι: 1. shawn.setglobalvariable("variable","value") : Θέτει µια µεταβλητή, είναι ισοδύναµο µε variable=value στο κλασικό config αρχείο 2. shawn.runcommand( "task-name", "extra parameters") : Εκτελεί ένα µια εντολή (task) µε παραµέτρους Το υποστηρίζει πλήρη σύνταξη Java οπότε µπορείτε: Να δηλώσετε µεταβλητές π.χ. int i = 0 Να τυπώσετε διαγνωστικά µηνύµατα π.χ. System.out.println("i = " + i) Να χρησιµοποιήσετε for-loops π.χ. for(int i=0; i<10; i++) Παράδειγµα αρχείου shawn.runcommand ( " prepare_world ", " edge_model= simple comm_model= disk_graph range =10" ) ; shawn. runcommand ( " rect_world ", " width =5 height =5 count=30 processors=helloworld " ) ; shawn. runcommand ( " simulation ", " max_iterations = 1 0 " ) ; Ισοδύναµο config αρχείο prepare_world edge_model= s i m p l e comm_model= disk_graph range=1 r e c t _ w o r l d width =5 height =5 count =30 p r o c e s s o r s = h e l l o w o r l d s i m u l a t i o n m a x _ i t e r a t i o n s =10 (4 of 4) Example Για να ξεκινήσετε µια εξοµοίωση µε το δίνεται την εντολή από τον ϕάκελο buildfiles: Παράδειγµα αρχείου java j a r.. / jshawn allinone. j a r \ s. / shawn \ b c on f _ f il e. jshawn Μετατρέψτε το παρακάτω config σε jshawn και εκτελέστε µια εξοµοιώση: prepare_world edge_model= l i s t comm_model= disk_graph \ transm_model= s t a t s _ c h a i n range=1 chain_transm_model name= r e l i a b l e r e c t _ w o r l d width =50 height =50 count =5000 p r o c e s s o r s = h e l l o w o r l d s i m u l a t i o n m a x _ i t e r a t i o n s =10 c o n n e c t i v i t y d u m p _ t r a n s m i s s i o n _ s t a t s
Επισκόπηση - Υλοποίηση Example Ο αλγόριθµος : 1. Στον πρώτο γύρο, ένας processor στέλνει ένα µήνυµα σε όλους τους γείτονές του 2. Μόλις µια διεργασία λάβει ένα µήνυµα: Αν έχει ξαναστείλει µήνυµα τότε το αγνοεί Αν δεν έχει ξαναστείλει µήνυµα, τότε στέλνει ένα µήνυµα στους γείτονές της 3. Η εξοµοίωση τερµατίζει όταν το µήνυµα έχει διαδοθεί σε όλο το δίκτυο (όλες οι διεργασίες έχουν παραλάβει το µήνυµα) - Υλοποίηση Λεπτοµέρειες υλοποίησης του αλγορίθµου : Για την υλοποίηση ϑα χρησιµοποιήσετε το template(σκελετό κώδικα) που ϑα ϐρείτε στην σελίδα του µαθήµατος ϑα χρειαστείτε µια µεταβλητή για τον αλγόριθµο ώστε να διατηρείτε την πληροφορία αν έχει στείλει µήνυµα π.χ.: bool send_msg : Αν έχω ήδη στείλει µήνυµα. Χρειάζεται να τροποποιήσετε µόνο τις µεθόδους special_boot(), boot() και handle_flooding_message() του floodmax_processor.cpp - Πειραµατική αξιολόγιση Πειραµατική αξιολόγηση του αλγορίθµου : Σας Ϲητείται να µετρήσετε: Χρονική πολυπλοκότητα του αλγορίθµου : Ο αριθµός των γύρων (iterations) µέχρι τον τερµατισµό του αλγορίθµου Πολυπλοκότητα µηνυµάτων του αλγορίθµου : Ο αριθµό των µηνυµάτων που στείλανε οι διεργασίες κατά την εκτέλεση του αλγορίθµου Θα εκτελέσετε 10 εξοµοιώσεις του αλγορίθµου Για εξοµοιώσεις ϑα χρησιµοποιήσετε τις τοπολογίες (SHAWN-FixDensity-Topologies.tar.bz2) που σας δίνονται στην σελίδα του µαθήµατος Τα ονόµατα των αρχείων ακολουθούν την εξής σύµβαση: fix-density- αριθµός κόµβων - µέση πυκνότητα κόµβων - διάµετρος δικτύου.xml: 10 κόµβοι διάµετρος 4 fix-density-10-8.8-2.xml: 10 κόµβοι διάµετρος 2 πυκνότητα 8.8
FloodMax - Πειραµατική αξιολόγιση Ακολουθεί ένα παράδειγµα για το πως πρέπει να είναι το config αρχείο που ϑα χρειαστείτε: Παράδειγµα config αρχείου για την Ασκηση 3 prepare_world edge_model= l i s t comm_model= disk_graph \ transm_model= s t a t s _ c h a i n range=1 chain_transm_model name= r e l i a b l e load_world f i l e = f i x density 10 8.8 2.xml p r o c e s s o r s = f l o o d i n g s i m u l a t i o n m a x _ i t e r a t i o n s =100 d u m p _ t r a n s m i s s i o n _ s t a t s