6 η σειρά ασκήσεων Άλκης Γεωργόπουλος Α.Μ. 39 Αναστάσιος Κοντογιώργης Α.Μ. 43 Άσκηση 1. Απαντήσεις Η αλλαγή ενός ρολογιού προς τα πίσω µπορεί να προκαλέσει ανεπιθύµητη συµπεριφορά σε κάποια προγράµµατα. Για παράδειγµα, έστω ότι ένας χρήστης αποθηκεύει το αρχείο mylib.c την χρονική στιγµή 10:27:53.0. Μετά από 3 δευτερόλεπτα το ρολόι έχει γυρίσει προς τα πίσω και δείχνει 10:27:51.0. Κάποιος άλλος χρήστης θέλει να µεταγλωττίσει το αρχείο myprog.c το οποίο χρησιµοποιεί το mylib.c, οπότε καλεί το πρόγραµµα make. Όµως το make βλέπει ότι το mylib.o έχει timestamp 10:27:53.0 ενώ το mylib.c έχει 10:27:51.0. Έτσι δεν µεταγλωττίζει το mylib.c, χρησιµοποιεί την παλιά έκδοση του mylib.o και τελικά το εκτελέσιµο πρόγραµµα µπορεί να παρουσιάζει προβλήµατα λόγω ασυµβατότητας εκδόσεων (π.χ. διαφορετικές παράµετροι σε συναρτήσεις) ενώ ο πηγαίος κώδικας να είναι σωστός. Για να διορθωθεί η απόκλιση των 4 δευτερολέπτων µέσα σε 8 δευτερόλεπτα, αρκεί το ρολόι να τρέχει δυο φορές πιο αργά για 8 δευτερόλεπτα. ηλαδή αν ο timer προκαλεί 100 interrupts ανά δευτερόλεπτο και ο software counter αυξάνεται κάθε φορά κατά 10, τώρα θα πρέπει να αυξάνεται κατά 5. Για παράδειγµα, αν ο counter την χρονική στιγµή 10:27:54.0 έχει τιµή 37674000, στο επόµενο interrupt θα πρέπει να του ανατεθεί τιµή 37674005 και άρα η ώρα θα είναι ακόµα 10:27:54.0 (το 0,5 δεν θα φαίνεται σε µια απλή κλήση gettime). Στον επόµενο χτύπο ο counter θα γίνει 37674010 και άρα η ώρα θα είναι 10:27:54.1. Συνεχίζοντας µε αυτόν τον τρόπο µετά από 8 δευτερόλεπτα το ρολόι θα δείχνει 10:27:58.0 και θα είναι συγχρονισµένο. Άσκηση 2. Σύµφωνα µε τον αλγόριθµο του Cristian θα πρέπει να θέσει το ρολόι του στο άθροισµα του timestamp και του χρόνου διάδοσης. Για τον υπολογισµό του χρόνου διάδοσης, όταν ο χρόνος επεξεργασίας δεν είναι γνωστός, βασιζόµαστε µόνο στο round-trip delay, το οποίο διαιρούµε µε το 2.
Αν επιλέξουµε να πάρουµε τον µέσο όρο των µετρήσεων, τότε βρίσκουµε ότι η καθυστέρηση διάδοσης t p είναι (22 + 25 + 20) / 6 = 11.17 msec. Αν επιλέξουµε την µικρότερη καθυστέρηση σαν την πιο αντιπροσωπευτική, τότε βρίσκουµε ότι η καθυστέρηση διάδοσης t p είναι 20 / 2 = 10 msec. Αν επιλέξουµε να αγνοήσουµε τις µετρήσεις πάνω από κάποιο κατώφλι καθυστέρησης, τότε πιθανώς να βρούµε διαφορετικό αποτέλεσµα. Για παράδειγµα αν έχουµε κατώφλι = 23 msec τότε η δεύτερη µέτρηση απορρίπτεται και ο µέσος όρος των άλλων δύο µας δίνει t p = 11 msec. Όσον αφορά το ποιον από αυτούς τους χρόνους θα πρέπει να χρησιµοποιήσει ο client για το συγχρονισµό του ρολογιού του, το βιβλίο απλά αναφέρει «when the reply comes in, the value in the message can be increased by this amount [(T 1 T 2 ) / 2] to give an estimate of the server s current time». Εποµένως θα χρησιµοποιήσει απλά τον τελευταίο από τους χρόνους. Βέβαια µπορούν κι εδώ να ακολουθηθούν οι προηγούµενες τεχνικές (µέσος όρος, µικρότερη καθυστέρηση, αγνόηση µετρήσεων πάνω από κατώφλι) οπότε σε κάθε περίπτωση ο client θα χρησιµοποιήσει διαφορετικό χρόνο. Τελικά αν υποθέσουµε ότι χρησιµοποιεί τον τελευταίο χρόνο και του προσθέτει t p = 11.17 msec, τότε θα πρέπει να θέσει το ρολόι του στις 10:54:28.353. Η πληροφορία ότι ο χρόνος από την αποστολή µέχρι τη λήψη ενός µηνύµατος είναι τουλάχιστον 8msec δεν είναι χρήσιµη. Αν δινόταν ότι ο χρόνος επεξεργασίας της αίτησης στον server είναι τουλάχιστον 8 msec, τότε θα αφαιρούσαµε 8 msec από όλα τα round trips, ώστε τελικά σαν round trips να θεωρούσαµε τα Round-trip (ms) Time (hr:min:sec) 14 10:54:23.674 17 10:54:25.450 12 10:54:28.342 Στη συνέχεια θα εφαρµόζαµε πάλι οποιαδήποτε από τις παραπάνω παραλλαγές του αλγορίθµου του Cristian ώστε να πάρουµε τα τελικά αποτελέσµατα. Για παράδειγµα, αν υποθέσουµε ότι βρίσκει τον µέσο όρο t p = 7.17 msec και τον προσθέτει στον τελευταίο χρόνο, τότε θα πρέπει να θέσει το ρολόι του στις 10:54:28.349 Άσκηση 3. ιακρίνουµε δύο περιπτώσεις: 1) Εάν ο αριθµός των γεγονότων µεταξύ των e και e είναι 0, τότε προφανώς ισχύει L(e) = L(e ). 2) Θα δείξουµε µε επαγωγή ότι ισχύει e e L(e) < L(e ). Έστω m o αριθµός των µηνυµάτων που µεσολαβούν των γεγονότων e και e. Για m = 1, έχουµε L(m) = L(e) + 1 και L(e ) = L(m) + 1. Άρα L(e ) = L(e) +2 > L(e).
Έστω ότι ισχύει για m = k. ηλαδή όταν µεσολαβούν k γεγονότα δεχόµαστε ότι ισχύει L(e) < L(e ). Θα δείξουµε ότι ισχύει για m = k + 1. Αν για m = k γεγονότα L(e ) = A > L(e) για m = k+1 L(e ) = A+1 > L(e). Οπότε δείξαµε ότι σε κάθε περίπτωση ισχύει e e L(e) L(e ). Άσκηση 4. (α) Κατά την ανταλλαγή µηνυµάτων µεταξύ δύο διεργασιών i και j, για κάθε µήνυµα που λαµβάνει η διεργασία i από την διεργασία j, αυξάνει το V i [i] κατά 1, διατηρώντας το πάντα µεγαλύτερο ή ίσο από το V j [j]. Υπάρχει όµως η περίπτωση δύο µηνύµατα της V j να φτάσουν σε αντίστροφη σειρά. Τότε πιθανώς V i [i] < V j [j], αλλά σ αυτήν την περίπτωση η διεργασία i θα αναβάλλει το µήνυµα της διεργασίας j που έφτασε πρώτο επειδή δεν είναι στη σειρά που το περιµένει. Έτσι θα επεξεργαστεί πρώτο το παλιότερο µήνυµα µε αποτέλεσµα πάντα να είναι V i [i] V i [j], (β) Έστω ότι το γεγονός e έγινε στην διεργασία i και το e στην j. Από την παραπάνω ανισότητα συµπεραίνουµε ότι V i [i] V i [j] και V j [j] V j [i]. Επειδή όµως η διεργασία i δεν έχει ενηµερωθεί για το συµβάν e, είναι V i [j] < V j [j] και αντίστοιχα για την διεργασία j είναι Vj[i] < Vi[i]. Εποµένως δεν µπορεί να ισχύει ούτε V(e) V(e ) αλλά ούτε V(e ) V(e). Τελικά αν ισχύει V(e) < V(e ) τότε µε απαγωγή σε άτοπο µπορούµε να συµπεράνουµε ότι e e, γιατί αν ήταν παράλληλα τότε δείξαµε ότι η προηγούµενη ανισότητα δεν µπορεί να ισχύει, ενώ αν ίσχυε ότι e e τότε εξ ορισµού θα ήταν V(e) > V(e ), δηλαδή άτοπο. Άσκηση 5. Με την χρήση των timestamps του Lamport, δύο παράλληλα γεγονότα (π.χ. δύο updates) παραµένουν ασυσχέτιστα (δεν υπάρχει σχέση a? b ώστε να διαταχθούν χρονικά). Έτσι είναι αδύνατο να επιτευχθεί totally ordered multicasting.
Όµως όταν κάθε κόµβος στέλνει acknowledgement, τότε το acknowledgement του a σαφώς έπεται του γεγονότος a, αλλά µπορεί επίσης να διαταχθεί χρονικά και σε σχέση µε το b, γιατί θα του έχει βάλει timestamp η διεργασία που προκάλεσε το b. Έτσι µε την χρήση acknowledgements µπορούµε να διατάξουµε χρονικά τα ίδια τα acknowledgements και να πετύχουµε totally ordered multicasting, θεωρώντας ότι τα a και b έγιναν µε την ίδια σειρά όπως και τα acknowledgements τους. Άσκηση 6. Ο προτεινόµενος αλγόριθµος λύνει το πρόβληµα των περισσοτέρων από ένα ELECTION µηνυµάτων σε ένα δακτύλιο. Για λόγους απλότητας στη περιγραφή θα θεωρήσουµε ότι υπάρχουν δύο µηνύµατα που διασχίζουν το δακτύλιο και πρέπει να παραµείνει µόνο το ένα. Παρόλα αυτά ο αλγόριθµος που θα περιγράψουµε γενικεύεται για n αριθµό ELECTION µηνυµάτων. Υποθέτουµε ότι ο Α και ο Β αντιλαµβάνονται ταυτόχρονα ότι ο προηγούµενος coordinator δεν λειτουργεί πλέον και προωθούν ταυτόχρονα στο δακτύλιο δύο ELECTION µηνύµατα. Χωρίς βλάβη της γενικότητας υποθέτουµε ότι ο Α (ένας από τους δύο δηλαδή) βρίσκεται πριν από το Β στη διάταξη του δακτυλίου. Οπότε ο Β µετά από κάποιο αριθµό βηµάτων θα πάρει το ELECTION µήνυµα από τον Α. Ο Β θα δει ότι δεν υπάρχει στη λίστα του µηνύµατος το δικό του process id, οπότε θα καταλάβει ότι δεν είναι το µήνυµα που αυτός προώθησε στο δακτύλιο αλλά ένα άλλο µήνυµα από άλλη διεργασία. Τότε απλά δεν στέλνει το µήνυµα στην επόµενη διεργασία που βρίσκεται µετά από αυτόν, οπότε και το επιπλέον µήνυµα σταµατάει την άσκοπη διάσχιση του δακτυλίου. Άσκηση 7. Το ζητούµενο throughput ορίζεται ως ο µέγιστος αριθµός προσπελάσεων κοινών πόρων που µπορούν να πραγµατοποιηθούν στη µονάδα του χρόνου. Για τον ορισµό του maximum throughput θεωρούµε τον ελάχιστο µέσο χρόνο που απαιτείται για να προσπελάσει µια διεργασία ένα διαµοιραζόµενο πόρο. Ουσιαστικά
είναι o χρόνος που χρειάζεται για να εισέλθει στη κρίσιµη περιοχή, έστω t εισόδου, συν το χρόνο που χρειάζεται να µείνει η διεργασία στη κρίσιµη περιοχή, έστω t εργασίας. Άρα max_throughput = 1 / (min_t εισόδου + min_t εργασίας ) αµοιβαίοι αποκλεισµοί ανά δευτερόλεπτο. Από τους γνωστούς αλγορίθµους για επίτευξη αµοιβαίου αποκλεισµού, αυτός µε τη µικρότερη καθυστέρηση για την είσοδο µιας διεργασίας σε κρίσιµη περιοχή είναι ο Centralized, που απαιτεί 2 µηνύµατα. Αν υποθέσουµε ότι το κάθε µήνυµα απαιτεί χρόνο t1 sec και ο µέσος παραµονής µιας διεργασίας στη κρίσιµη περιοχή είναι t2 sec. Η χρονική καθυστέρηση είναι 2*t1 + t2 sec. Άρα το throughput θα είναι 1/(2*t1 + t2) αµοιβαίοι αποκλεισµοί ανά δευτερόλεπτο. Άσκηση 8. Οι τρεις βασικές λειτουργίες που χαρακτηρίζουν το 2PL ισχύουν και για το κατανεµηµένο 2PL. Σε αυτή τη περίπτωση όµως ισχύουν επιπλέον οι εξής θεωρήσεις: - Τα δεδοµένα βρίσκονται κατανεµηµένα σε αντίγραφα σε πολλά µηχανήµατα του συστήµατος. - Κάθε µηχάνηµα διαθέτει τον δικό του scheduler που διαχειρίζεται τις αιτήσεις για transactions - Επιπλέον διαθέτει και τον δικό του data manager στον οποίο προωθούνται οι αιτήσεις για προσπέλαση στα τοπικά δεδοµένα Σύµφωνα µε αυτή την επέκταση του ορισµού, το κατανεµηµένο 2PL µπορεί να πραγµατοποιήσει κατανεµηµένα transactions εκτελώντας τις τρεις βασικές 2PL λειτουργίες, αλλά στα τοπικά δεδοµένα κάθε µηχανής.