Κατανεµηµένα Συστήµατα Ι Χειµερινό Εξάµηνο 2007-2008 Περίληψη Ο στόχος του εργαστηρίου είναι η υλοποίηση κατανεµηµένων αλγόριθµων συναίνεσης µε την γλώσσα προγραµµατισµού nesc και την χρήση Active Messages στο περιβάλλον TinyOS. Μελέτη της συµπεριφοράς των αλγόριθµων µε την χρήση του TOSSIM σε γενικά δίκτυα υπό την παρουσία σφαλµάτων τερµατισµού. Υλοποίηση Αλγόριθµου Συναίνεσης Σε ένα σύγχρονο δίκτυο G, η συναίνεση απαιτεί την κοινή επιλογής µιας µοναδικής τιµής απο όλες τις διεργασίες του συστήµατος. Οταν οι διεργασίες καταλήξουν σε µια κοινά αποδεκτή απόφαση, όλες οι διεργασίες τερµατίζουν. Οι διεργασίες, δέχεται ως είσοδο µία τιµή i u απο το σύνολο S, δηλ. i u S. Στην συνέχεια εκτελεί έναν κατανεµηµένο αλγόριθµο συναίνεσης και αποφασίζει (σε συνεργασία µε το υπόλοιπο δίκτυο) µια µοναδική τιµή. Υπάρχουν πολλοί διαφορετικοί αλγόριθµοι συναίνεσης οι οποίοι απευθύνονται σε ορισµένους τύπους συστηµάτων που χρησιµοποιούν συγκεκριµένες ιδιότητες του συστήµατος για να εκτελεστούν. Παρ όλα αυτά, όλοι οι αλγόριθµοι µπορούν να περιγραφούν µε τον ίδιο τρόπο όταν ϑέλουµε να ορίσουµε την λειτουργικότητα που προσφέρουν στα υψηλότερα επίπεδα ενός συστήµατος. Η γλώσσα nesc προσφέρει ένα τρόπο περιγραφής της εσωτερικής λειτουργίας των αλγόριθµων µε γενικό τρόπο. Με την χρήση των interfaces µπορούµε να περιγράψουµε τις λειτουργίες των αλγόριθµων εκλογής αρχηγού µε γενικό, αφαιρετικό τρόπο. Ορίζουµε το interface ConsensusControl ως εξής : command result_t init(uint16_t deviceid, uint8_t value) αρχικοποιεί τις εσωτερικές µεταβλητές του αλγόριθµου. Η παράµετρος deviceid υποδηλώνει την ταυτότητα που ϑα χρησιµοποιήσει η διεργασία. Η παράµετρος value υποδηλώνει την τιµή εισόδου που ϑα χρησιµοποιήσει η διεργασία ως είσοδο. Το command επιστρέφει πάντα SUCCESS. command result_t start() ξεκινά τη διαδικασία συναίνεσης. Επιστρέφει πάντα SUCCESS. command uint8_t getvalue() επιστρέφει την τιµή που αποφασίσαν οι διεργασίες, αλλιώς UNKNOWN_VALUE αν η διαδικασία συναίνεσης δεν έχει ολοκληρωθεί. event result_t done(uint8_t value) όταν ο αλγόριθµος συναίνεσης ολοκληρωθεί, δη- µιουργείται ένα event όπου η παράµετρος value δηλώνει την κοινή τιµή που αποφάσισαν οι διεργασίες. Το event επιστρέφει πάντα SUCCESS. Σελ. 1 από 12
Ο κώδικας που αποτυπώνει το interface ConsensusControl στη γλώσσα nesc ϐρίσκεται στη σελίδα του µαθήµατος. Τοποθετήστε αυτό το αρχείο στον κατάλογο της εφαρµογής σας. Μια εφαρµογή που ϑέλει να εκτελέσει έναν κατανεµηµένο αλγόριθµο συναίνεσης (π.χ. για τη απόφαση µιας κοινής τιµής ϑερµοκρασίας από όλους τους κόµβους) ϑα χρησιµοποιήσει το παραπάνω interface χωρίς να έχει ιδιαίτερη σηµασία ποια ϑα είναι η τελική υλοποίηση των µεθόδων (δηλ. πως ϑα υλοποιήσουµε τον αλγόριθµο συναίνεσης). Υλοποιούµε την εφαρµογή lab3app όπου οι διεργασίες δέχονται ως είσοδο έναν αριθµό 8 bit. Για να µπορεί ο χειριστής του συστήµατος να διαγνώσει την κατάσταση που ϐρίσκονται οι συσκευές κατά την λειτουργία τους, η εφαρµογή χρησιµοποιεί τα Led των συσκευών ως εξής : Το κόκκινο led ανάβει όταν αρχίσει να εκτελείται ο αλγόριθµος. Οταν ολοκληρωθεί η εκτέλεση και τερµατίσει ο αλγόριθµος, το πράσινο Led ανάβει. Εφόσον έχουµε να κάνουµε µε ένα ασύγχρονο σύστηµα, υπάρχει περίπτωση οι συσκευές να µη ξεκινήσουν ταυτόχρονα αλλά να υπάρχει µια χρονική καθυστέρηση. Για να εξασφαλίσουµε ότι όλες οι συσκευές του συστήµατος είναι ενεργοποιηµένες και συµµετέχουν στον αλγόριθµο συναίνεσης χρησιµοποιούµε ένα Timer για να καθυστερήσουµε την εκτέλεση του αλγόριθµου. Η εκτέλεση του αλγόριθµου συναίνεσης και η ενηµέρωση της ολοκλήρωσης του γίνεται µε την υλοποίηση ενός task (το οποίο καλεί τη ConsensusControl.start()) και ένα event handler. Σύµφωνα µε τα παραπάνω, ορίζουµε το module lab3appm ως εξής : module lab3appm { provides { interface StdControl ; uses { interface ConsensusControl ; interface Leds ; interface Timer ; implementation { uint8_t m_values [20] = {0, 1, 1, 0, 1, 1, 1, 0, 2, 1, 0, 1, 1, 0, 2, 1 ; // I n i t i a l i z e the component. command result_t StdControl. i n i t ( ) { c a l l Leds. i n i t ( ) ; c a l l ConsensusControl. i n i t (TOS_LOCAL_ADDRESS, m_values [TOS_LOCAL_ADDRESS ] ) ; // Start things up set the timer to f i r e once a f t e r 3000ms command result_t StdControl. start ( ) { return c a l l Timer. start (TIMER_ONE_SHOT, 3000); // Halt execution of the application disables the clock component. command result_t StdControl. stop ( ) { return c a l l Timer. stop ( ) ; Σελ. 2 από 12
// Start the distributed consensus process task void startconsensus ( ) { c a l l Leds. redon ( ) ; // Start the consensus process c a l l ConsensusControl. start ( ) ; dbg (DBG_TEMP, " Distributed consensus process started.\n " ) ; // Event signaled when the distributed consensus process completed. event result_t ConsensusControl. done ( uint8_t value ) { dbg (DBG_TEMP, " Node %d decided value %d.\n", TOS_LOCAL_ADDRESS, value ) ; c a l l Leds. redoff ( ) ; c a l l Leds. greenon ( ) ; // Start the whole process event result_t Timer. f i r e d ( ) { post startconsensus ( ) ; Υλοποίηση του αλγόριθµου συναίνεσης SimpleConsensus Ο αλγόριθµος SimpleConsensus προσφέρει µια λύση για το πρόβληµα της κατανεµηµένης συναίνεσης σε γενικά δίκτυα όπου οι διεργασίες γνωρίζουν τη τοπολογία του δικτύου. Πρόκειται για έναν αλγόριθµο που απαιτεί O (diam(g)) γύρους και ανταλλάσσει O (m) µηνύµατα. Λόγω της ασύγχρονης λειτουργίας του συστήµατος, η σωστή εκτέλεση του αλγόριθµου SimpleConsensus απαιτεί την ύπαρξη µιας ουράς για τα εξερχόµενα µηνύµατα. Για αυτό τον λόγο χρησιµοποιού- µε το component QueuedSend που προσφέρει το ίδιο interface SendMsg µε το component GenericComm αλλά τοποθετεί τα µηνύµατα σε µια ουρά. Τα αρχεία που υλοποιούν το component QueuedSend είναι στον ϕάκελο /opt/tinyos-1.x/tos/lib/queue. Κατά την µεταγλώτισση της εφαρµογής µας, για να συµπεριληφθεί σωστά το component QueuedSend πρέπει να εισάγου- µε στο Makefile την εξής γραµµή : PFLAGS= -I%T/lib/Queue Η υλοποίηση του αλγόριθµου SimpleConsensus, σε υψηλό επίπεδο, αποτελείται από το module SimpleConsensusM που περιέχει την λογική της διαδικασίας, το component GenericComm που χρησιµοποιείται για την παραλαβή Active Messages και το component QueuedSend που χρησιµοποιείται για την αποστολή Active Messages. Το διάγραµµα διασύνδεσης απεικονίζεται γραφικά στην Εικ. 1. Σελ. 3 από 12
Σχήµα 1: Το διάγραµµα διασύνδεσης του SimpleConsensus includes ConsensusMsg ; configuration SimpleConsensus { provides interface StdControl ; provides interface ConsensusControl ; implementation { components SimpleConsensusM, QueuedSend, GenericComm; SimpleConsensusM. SendMsg > QueuedSend. SendMsg[AM_CONSENSUSMSG] ; SimpleConsensusM. ReceiveMsg > GenericComm. ReceiveMsg [AM_CONSENSUSMSG] ; SimpleConsensusM. Timer > TimerC. Timer [ unique ( " Timer " ) ] ; StdControl = GenericComm; StdControl = QueuedSend; ConsensusControl = SimpleConsensusM ; Το αρχείο ConsensusMsg.h ορίζει την δοµή των µηνυµάτων του αλγόριθµου και τις απαραίτητες σταθερές. Η δοµή του µηνύµατος ConsensusMsg είναι η ακόλουθη : Το πεδίο id χρησιµοποιείται για την αποθήκευση της ταυτότητας της διεργασίας που πρόκειται να στείλει το µήνυµα. Ο πίνακας values χρησιµοποιείται για την αποθήκευση των τιµών των άλλων διεργασιών που γνωρίζει η διεργασία που πρόκειται να στείλει το µήνυµα. enum { UNKNOWN_VALUE = 254, TOT_NODES = 16, TOT_ROUNDS = 40 ; typedef struct ConsensusMsg { uint16_t id ; uint8_t values [TOT_NODES] ; ConsensusMsg ; enum { AM_CONSENSUSMSG = 16 ; Σελ. 4 από 12
Το module SimpleConsensusM χρησιµοποιεί τα interface SendMsg και ReceiveMsg για την αποστολή και παραλαβή µηνυµάτων, το interface Timer για την περιοδική αποστολή των µηνυµάτων και προσφέρει το interface ConsensusControl. module SimpleConsensusM { provides { interface ConsensusControl ; uses { interface SendMsg; interface ReceiveMsg ; interface Timer ; Οι διεργασίες διατηρούν (α) µια µεταβλητή uint16_t m_id µε την ταυτότητα της διεργασίας, (ϐ) µια µεταβλητή uint8_t m_initvalue µε την τιµή εισόδου, (γ) έναν πίνακα uint8_t m_values[max_nodes] µε τις τιµές των διεργασιών στο δίκτυο, (δ) µια µεταβλητή uint8_t m_decision µε την απόφαση, (ε) µια µεταβλητή uint8_t m_count για την καταµέτρηση των µηνυµάτων και (στ) µια µεταβλητή TOS_Msg m_msg για την αποστολή µηνυµάτων. implementation { uint16_t m_id; uint8_t m_initvalue ; uint8_t m_values [MAX_NODES] ; uint8_t m_decision ; uint8_t m_msgcount; TOS_Msg m_msg;... Η αρχικοποίηση του αλγόριθµου γίνεται ως εξής : // I n i t i a l i z e the distributed consensus process. async command result_t ConsensusControl. i n i t ( uint16_t deviceid, uint16_t value ) { uint8_t i ; atomic { m_id = deviceid ; m_initvalue = value ; m_decision = UNKNOWN_VALUE; m_msgcount = 0; // I n i t i a l i z e array for ( i =0; i <MAX_NODES; i ++) m_values [ i ] = UNKNOWN_VALUE; dbg (DBG_TEMP, " SimpleConsensus : i n i t i a l i z e d.\n " ) ; και η συνάρτηση get υλοποιείται απλά : Σελ. 5 από 12
// Get decision async command uint8_t ConsensusControl. getvalue ( ) { return m_decision ; Η υλοποίηση της start ελέγχει κατά πόσο έχει ήδη ολοκληρωθεί η διαδικασία, δηλ. αν η m_decision δεν έχει τιµή UNKNOWN_VALUE αλλά την τελική απόφαση. Σε περίπτωση που δεν έχει ολοκληρωθεί η διαδικασία, η διεργασία ενεργοποιεί τον timer. Παρατηρήστε ότι η χρήση της καθολικής µεταβλητής γίνεται µε το πρόθεµα atomic. // Start the distributed consensus process. async command result_t ConsensusControl. start ( ) { uint8_t decision ; atomic decision = m_decision ; // Check i f already finished i f ( decision! = UNKNOWN_VALUE) return FAIL ; atomic m_values [ m_id] = m_initvalue ; dbg (DBG_TEMP, " SimpleConsensus : started with i n i t i a l value %d\n", m_initvalue ) ; // Start the timer c a l l Timer. start (TIMER_REPEAT, 1000); Τέλος, το interface ConsensusControl ορίζει και την χρήση του event done. Η δηµιουργία νέων event γίνεται από το task reportdone. Το task ελέγχει τις τιµές του συνόλου και εφόσον όλες οι τιµές είναι ίδιες, επιστρέφει την κοινή τιµή. Στην περίπτωση που οι τιµές δεν είναι ίδιες, επιστρέφει την µέγιστη τιµή. / Generate the event of the completion of the distributed consensus process / task void reportdone ( ) { uint8_t i, decision, maxvalue, allsame ; atomic { allsame = 0; // Check local set maxvalue = m_values [ 0 ] ; decision = m_values [ 0 ] ; for ( i =1; i < TOT_NODES; i ++) { // keep track of maximum i f ( m_values [ i ] > maxvalue ) maxvalue = m_values [ i ] ; // check i f values agree i f ( m_values [ i ]!= decision ) Σελ. 6 από 12
allsame = 1; // Check i f we do not have consensus i f ( allsame == 1) decision = maxvalue ; // Keep value m_decision = decision ; dbg (DBG_TEMP, " SimpleConsensus : completed.\n " ) ; signal ConsensusControl. done ( decision ) ; Χρησιµοποιούµε τον Timer για την αποστολή µηνυµάτων. Κάθε ϕορά που δηµιουργείτε ένα νέο event fired καλούµε το task sendmessage για την αποστολή ενός νέου µηνύµατος. Ο event handler ελέγχει αν έχουµε ολοκληρώσει το µέγιστο πλήθος αποστολών (σύµφωνα µε την σταθερά TOT_ROUNDS). Σε αυτή την περίπτωση σταµατάµε τον Timer και καλούµε το task reportdone. // Responde to Timer ticks event result_t Timer. f i r e d ( ) { uint16_t msgcount; atomic msgcount = m_msgcount; // Check i f number of t o t a l transmitions reached i f ( msgcount > TOT_ROUNDS) { c a l l Timer. stop ( ) ; post reportdone ( ) ; post sendmessage ( ) ; // Send a message to a l l neighboring processes task void sendmessage ( ) { // Access message body ConsensusMsg msgdata = ( ConsensusMsg ) m_msg. data ; uint8_t i ; // Set message contents msgdata >id = m_id; atomic for ( i =0; i <TOT_NODES; i ++) msgdata >values [ i ] = m_values [ i ] ; // Try to send the message c a l l SendMsg. send (TOS_BCAST_ADDR, s i z e o f ( ConsensusMsg ), &m_msg) ; Σελ. 7 από 12
dbg (DBG_TEMP, " SimpleConsensus : Sending \tconsensusmsg ( " ) ; for ( i =0; i <TOT_NODES; i ++) dbg (DBG_TEMP, "%d ", msgdata >values [ i ] ) ; dbg (DBG_TEMP, " ) \n " ) ; Το interface SendMsg ορίζει και την χρήση του event senddone. event handler για την καταµέτρηση των µηνυµάτων. Υλοποιούµε έναν απλό // Respond to the <code>sendmsg. senddone</code> event event r e s u l t_ t SendMsg. senddone ( TOS_MsgPtr msg, bool success ) { atomic m_msgcount++; Η παραλαβή των µηνυµάτων γίνεται µέσω του interface ReceiveMsg και τη διαχείριση του event ReceiveMsg. Η συνάρτηση ελέγχει τα περιεχόµενα του µηνύµατος και τα ενοποιεί µε τον πίνακα που διατηρεί η διεργασία. // Process a message received event TOS_MsgPtr ReceiveMsg. receive ( TOS_MsgPtr recv_packet ) { // Access message body ConsensusMsg msgdata = ( ConsensusMsg ) recv_packet >data ; uint8_t i ; dbg (DBG_TEMP, " SimpleConsensus : Received from %d \tconsensusmsg ( ", msgdata >id ) ; for ( i =0; i <TOT_NODES; i ++) dbg (DBG_TEMP, "%d ", msgdata >values [ i ] ) ; dbg (DBG_TEMP, " ) \n " ) ; // Merge received set with l o c a l copy atomic for ( i =0; i < TOT_NODES; i ++) { i f ( msgdata >values [ i ]! = UNKNOWN_VALUE) m_values [ i ] = msgdata >values [ i ] ; return recv_packet ; ιασύνδεση της εφαρµογής lab3app µε τον αλγόριθµο SimpleConsensus Η διασύνδεση της εφαρµογής lab3app µε τον αλγόριθµου SimpleConsensus, σε υψηλό επίπεδο, αποτελείται από το module lab3appm που περιέχει την λογική της εφαρµογής, το component SimpleConsensus που υλοποιεί έναν αλγόριθµο συναίνεσης, το component TimerC που χρησι- µοποιείται για την εκκίνηση της διαδικασίας και το component LedsC για την έξοδο της κατάστασης της συσκευής. Το διάγραµµα διασύνδεσης απεικονίζεται γραφικά στην Εικ. 1. configuration lab3app { implementation { Σελ. 8 από 12
Σχήµα 2: Το διάγραµµα διασύνδεσης της εφαρµογής lab3app components Main, lab3appm, SimpleConsensus, LedsC, TimerC ; Main. StdControl > lab3appm. StdControl ; Main. StdControl > SimpleConsensus. StdControl ; lab3appm. SpanningTreeControl > SimpleConsensus. SpanningTreeControl ; lab3appm. Leds > LedsC ; lab3appm. Timer > TimerC. Timer [ unique ( " Timer " ) ] ; Εκτελέστε τον αλγόριθµο για τις ακόλουθες περιπτώσεις : Πλήρες δίκτυο 5 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Πλήρες δίκτυο 10 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Γενικό δίκτυο 8 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Γενικό δίκτυο 16 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Παρατηρείστε τα µηνύµατα εξόδου. Πόσοι γύροι απαιτούνται για να προκύψει συµφωνία στις απο- ϕάσεις όλων των διεργασιών ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσονται ; Υλοποίηση του αλγόριθµου συναίνεσης OptSimpleConsensus Υλοποιείστε τον αλγόριθµο OptSimpleConsensus. Οι διεργασίες στέλνουν µήνυµα µόνο αν υπάρξει κάποια αλλαγή στον πίνακα που διατηρεί τις τιµές των άλλων διεργασιών. Εκτελέστε τον αλγόριθµο για τις ακόλουθες περιπτώσεις : Πλήρες δίκτυο 5 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Πλήρες δίκτυο 10 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Γενικό δίκτυο 8 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Γενικό δίκτυο 16 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Παρατηρείστε τα µηνύµατα εξόδου. Πόσοι γύροι απαιτούνται για να προκύψει συµφωνία στις απο- ϕάσεις όλων των διεργασιών ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσονται ; Ποσο ϐελτιώνει την απόδοση του SimpleConsensus η συγκεκριµένη τροποποίηση ; Σελ. 9 από 12
Προσοµοίωση Σφαλµάτων Επικοινωνίας Για να προσοµοιώσουµε σφάλµατα επικοινωνίας αρκεί να τροποποιείσουµε το αρχείο της τοπολογίας. Κάθε γραµµή του αρχείου περιγράφει ένα κανάλι ως εξής : sender ID : receiver ID : b i t error rate Το σφάλµα αφορά το λάθος που υπάρχει κατα την αποστολή ενός bit. Η τρίτη παράµετρος δηλώνει την πιθανότητα που υπάρχει ανα bit του µηνύµατος να αντιστραφεί απο 0 να γίνει 1 ή από 1 να γίνει 0. Κάθε bit ελέγχεται ανεξάρτητα. Οταν το ϑέτουµε σε 0 τότε δεν υπάρχει κανένα σφάλµα. Οταν το ϑέτουµε σε 1 τότε το κανάλι ειναι εντελώς αναξιόπιστο. Οταν το ϑέτουµε σε 0.01 τότε για κάθε bit που µεταδίδεται υπάρχει 1% πιθανότητα να αντιστραφεί. Το αρχείο για την τοπολογία 8 διεργασιών περιγράφεται ως εξής : 0:5:0 0:6:0 0:7:0 1:2:0 1:3:0... Αν υποθέσουµε ότι το κανάλι που ενώνει την διεργασία 0 µε την 6 αντιµετωπίζει σφάλµατα, µπο- ϱούµε να αλλάξουµε την αντίστοιχη γραµµή ϑέτοντας : 0:6:0.037 Προσοµοίωση Σφαλµάτων Τερµατισµού Συµφωνα µε το παραπάνω σφάλµα ανα bit η απώλια ανα πακέτο είναι 10%, όταν το µήκος των πακέτων είναι 36 byte (τυπικό µέγεθος πακέτου στο TinyOS). Τροποποιείστε τα αρχεία τοπολογίας για τα γενικά δίκτυα 8 και 16 κόµβων για τη δηµιουργία σφαλµάτων επικοινωνίας αλλάζοντας την 3η παράµετρο στο bit error rate όλων των καναλιών σε 0.037, 0.077 και 0.111 που αντιστοιχεί σε 10%, 20% και 30% απώλια πακέτων. Εκτελέστε τους αλγόριθµους SimpleConsensus και OptSimpleConsensus για τις τροποποιηµένες τοπολογίες. Παρατηρείστε τα µηνύµατα εξόδου. Πως επηρεάζεται η συµπεριφορά των αλγορίθµων ; Πόσοι γύροι απαιτούνται για να προκύψει συµφωνία στις αποφάσεις όλων των διεργασιών ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσονται ; Τροποποιούµε την εφαρµογή lab3app για να προσοµοιώσουµε σφάλµατα τερµατισµού. Χρησιµοποιούµε έναν δεύτερο Timer για να απενεργοποιήσουµε την εκτέλεση ορισµένων διεργασιών. Ο κώδικας που αποτυπώνει το lab3appfailures ϐρίσκεται στη σελίδα του µαθήµατος. Τοποθετήστε αυτό τα αρχεία σε ένα νέο κατάλογο. Εκτελέστε τους αλγόριθµους SimpleConsensus και OptSimpleConsensus για τις ακόλουθες περιπτώσεις : Πλήρες δίκτυο 5 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Πλήρες δίκτυο 10 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Γενικό δίκτυο 8 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Σελ. 10 από 12
Γενικό δίκτυο 16 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Παρατηρείστε τα µηνύµατα εξόδου. Πως επηρεάζεται η συµπεριφορά των αλγορίθµων ; Πόσοι γύροι απαιτούνται για να προκύψει συµφωνία στις αποφάσεις όλων των διεργασιών ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσονται ; Προσοµοίωση Βυζαντινών Σφαλµάτων Τροποποιούµε την εφαρµογή lab3app για να προσοµοιώσουµε ϐυζαντινά σφάλµατα. Χρησιµοποιούµε έναν δεύτερο Timer για να αλλιώσουµε την ταυτότητα και αρχική τιµή εισόδου ορισµένων διεργασιών. Ο κώδικας που αποτυπώνει το lab3appbyzantine ϐρίσκεται στη σελίδα του µαθήµατος. Τοποθετήστε αυτό τα αρχεία σε ένα νέο κατάλογο. Εκτελέστε τους αλγόριθµους SimpleConsensus και OptSimpleConsensus για τις ακόλουθες περιπτώσεις : Πλήρες δίκτυο 5 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Πλήρες δίκτυο 10 διεργασιών. (δεν δηλώνουµε αρχείο τοπολογίας) Γενικό δίκτυο 8 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Γενικό δίκτυο 16 διεργασιών. (προσοχή το αρχείο τοπολογίας έχει αλλάξει) Παρατηρείστε τα µηνύµατα εξόδου. Πως επηρεάζεται η συµπεριφορά των αλγορίθµων ; Πόσοι γύροι απαιτούνται για να προκύψει συµφωνία στις αποφάσεις όλων των διεργασιών ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσονται ; Εργαστηριακές Ασκήσεις 1. Εκτελέστε την εφαρµογή lab3app µε τον αλγόριθµο SimpleConsensus για τα γενικά δίκτυα 8 και 16 κόµβων και πλήρη δίκτυα 5 και 10 κόµβων. Πόσοι γύροι απαιτούνται για να συµφωνήσουν όλες οι διεργασίες ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσουν οι διεργασίες ; 2. Υλοποιείστε τον αλγόριθµο συναίνεσης OptSimpleConsensus. 3. Εκτελέστε την εφαρµογή lab3app µε τον αλγόριθµο OptSimpleConsensus για τα γενικά δίκτυα 8 και 16 κόµβων και πλήρη δίκτυα 5 και 10 κόµβων. Πόσοι γύροι απαιτούνται για να συµφωνήσουν όλες οι διεργασίες ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Σελ. 11 από 12
Πόσα µηνύµατα ανταλλάσουν οι διεργασίες ; Ποσο ϐελτιώνει την απόδοση του SimpleConsensus η συγκεκριµένη τροποποίηση ; 4. Τροποποιείστε τις τοπολογίες για τα γενικά δίκτυα 8 και 16 κόµβων για τη δηµιουργία σφαλµάτων επικοινωνίας αλλάζοντας την 3η παράµετρο στο bit error rate όλων των καναλιών από 0 σε 0.037, 0.077 και 0.111. 5. Εκτελέστε την εφαρµογή lab3app µε τους αλγόριθµους SimpleConsensus και OptSimpleConsensus για τα γενικά δίκτυα 8 και 16 κόµβων για κάθε περίπτωση bit error rate. Πόσοι γύροι απαιτούνται για να συµφωνήσουν όλες οι διεργασίες ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσουν οι διεργασίες ; 6. Τροποποιείστε την εφαρµογή για τη δηµιουργία σφαλµάτων τερµατισµού. 7. Εκτελέστε την εφαρµογή lab3appfailures µε τους αλγόριθµους SimpleConsensus και OptSimple- Consensus για τα γενικά δίκτυα 8 και 16 κόµβων και πλήρη δίκτυα 5 και 10 κόµβων. Πόσοι γύροι απαιτούνται για να συµφωνήσουν όλες οι διεργασίες ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσουν οι διεργασίες ; 8. Τροποποιείστε την εφαρµογή για τη δηµιουργία ϐυζαντινών σφαλµάτων. 9. Εκτελέστε την εφαρµογή lab3appfailures µε τον αλγόριθµο SimpleConsensus και OptSimpleConsensus για τα γενικά δίκτυα 8 και 16 κόµβων και πλήρη δίκτυα 5 και 10 κόµβων. Πόσοι γύροι απαιτούνται για να συµφωνήσουν όλες οι διεργασίες ; Ποιά είναι η ελάχιστη τιµή της σταθεράς TOT_ROUNDS που εξασφαλίζει την σωστή εκτέλεση του αλγόριθµου ; Πόσα µηνύµατα ανταλλάσουν οι διεργασίες ; Σελ. 12 από 12