Ιούνιος+2005

Θέμα 5ο (15 Βαθμοί)
 * 1) Εξηγήστε γιατί/πως μπορούμε σε ένα σύγχρονο σύστημα με βλάβες crash να προσομοιώσουμε ένα σύγχρονο σύστημα με βλάβες fail-stop.
 * 2) Δώστε σε ψευδοκώδικα την υλοποίηση αυτής της λειτουργικότητας, έτσι ώστε κάθε διεργασία να ειδοποιεί την τοπική εφαρμογή για μια βλάβη το αργότερο Tfd από τη στιγμή που συνέβει. Συζητήστε τις υποθέσεις που γίνονται για τα φυσικά ρολόγια των διεργασιών, καθώς και κατά πόσο η λύση σας είναι βέλτιστη αναφορικά με τον αριθμό των μηνυμάτων που στέλνονται πάνω από το δίκτυο.
 * 3) Εξηγήστε γιατί αυτή η προσέγγιση δεν μπορεί να εφαρμοστεί σε ένα ασύγχρονο σύστημα.
 * 4) Εξηγήστε αν/πως μπορούν να προσομοιωθούν βλέβες fail-stop σε ένα ασύγχρονο σύστημα.

__Λύση:__ 1. Αν το σύστημά μας είναι σύγχρονο μπορούμε να εκμεταλευτούμε την ιδιότητά του να παρέχει εγγύηση για το άνω χρονικό όριο μετάδοσης ενός μηνύματος ανάμεσα σε διεργασίες και το ρυθμό απόκλισης των ρολογιών των διεργασιών. Έτσι μπορούμε να προσομοιώσουμε ένα σύστημα fail-stop αν αναθέσουμε σε μια διεργασία την ακόλουθη διαδικασία:
 * Στέλνει σε κάθε διεργασία ένα μήνυμα ελέγχου και περιμένει απάντηση.
 * Αν δεν υπάρξει απάντηση μετά από 2*(άνω όριο μετάδοσης μηνύματος), η διεργασία έχει παρουσιάσει βλάβη
 * Ενημερώνουμε το σύστημα

2. Ψευτοκώδικας: __check (procedure p)__: bool flag = false; send (p,); while(t recv (PONG); > flag = true; > break; > } if (flag == false) broadcast (FAIL, p);

__on recv():__ send(control,PONG);

Αναθέτουμε σε μία διεργασία control να τρέχει την check. Για κάθε check ταξιδεύουν στο δίκτυο δύο μηνύματα. Αν εντοπιστεί βλάβη σε μία διεργασία, ειδοποιούνται για το γεγονός οι υπόλοιπες διεργασίες με broadcast. Άρα, σε περίπτωση βλάβης μιας διεργασίας, ταξιδεύουν πάνω από το δίκτυο τόσα μηνύματα όσες και οι διεργασίες για να ειδοποιηθούν. Η διεργασία control τρέχει την check κάθε Tfd-2*(άνω όριο μετάδοσης μηνύματος), ώστε να ενημερώνεται εγκαίρως το σύστημα. Κάνουμε τη σύμβαση πως τα ρολόγια των διεργασιών είναι συγχρονισμένα ή ότι συγχρονίζονται τακτικά μέσω διεργασίας.

3. Αυτή η προσέγγιση δεν μπορεί να εφαρμοστεί σε ένα ασύγχρονο σύστημα, καθώς απαιτείται αφενός να υπάρχει γνωστό άνω όριο μετάδοσης μηνύματος μεταξύ διεργασιών, ώστε να διακρίνουμε αν έχει υποστεί βλάβη και αφεταίρου για να είναι καλά συγχρονισμένα τα ρολόγια των διεργασιών.

4. Μια παρόμοια μέθοδος μπορεί να εφαρμοστεί και σε ασύγχρονο σύστημα, αν οριστεί από τον προγραμματιστή το άνω όριο απόκρισης στην check, ή αν οριστεί από τις ίδιες τις εφαρμογές δυναμικά μέσω στατιστικών αποτελεσμάτων του χρόνου μετάδοσης ενός μηνύματος. Υπάρχει όμως πάντα η πιθανότητα λάθους, σε περίπτωση που το δίκτυο είναι αργό. Αν μια διεργασία λάβει ένα μήνυμα πως έπαθε βλάβη ενώ δεν έχει υποστεί στην πραγματικότητα τερματίζει μόνη της τη λειτουργία της.

Comment: Εχω μια ερώτηση. Η εντολή recv δεν περιμενει "παγωμένη" μέχρι να πάρει απάντηση? Αν ναι τότε με το που έρθει η απάντηση τα βγεί απ το while. Αλλά αν δεν έρθει θα κολλήσουμε στην εντολή recv..Oπότε τότε δεν έχει νόημα και το while. Sorry αν δεν θυμαμαι καλα την λειτουργικότητα του recv. Επίσης θα μπορούσαμε να πούμε και σαν λύση αυτό που λέει στην σελίδα 34 της διαφάνειας intro?