Κλασσικά Προβλήματα Επικοινωνίας Σύνδρομων Διεργασιών Classical Problems in Interprocess Communication
Περίληψη Producer-Consumer Problem Dinning Philosophers Readers-Writers Problem Sleeping Barber Αυτά είναι κλασσικά προβλήματα τα οποία παρουσιάζονται στη βιβλιογραφία με σκοπό την σύγκριση διαφόρων αλγορίθμων που έχουν προταθεί για το πρόβλημα του συγχρονισμού διεργασιών
Dinning Philosophers Problem Πέντε φιλόσοφοι κάθονται γύρω από ένα κυκλικό τραπέζι με πέντε πιάτα μακαρόνια και πέντε πιρούνια. Για να μπορεί να φάει ο κάθε φιλόσοφος πρέπει να κρατά δύο πιρούνια. take_fork() Ρουτίνα που επιτρέπει στον κάθε φιλόσοφο να πιάσει ένα πιρούνι. Εάν δεν υπάρχει πιρούνι ελεύθερο περιμένει μέχρι να ελευθερωθεί ένα πιρούνι.
Πρώτη Λύση # define N 5 /*Number of philosophers*/ void philosopher(int i) { while(true) think(); take_fork(i); take_fork((i+1)%N); eat(); put_fork(i); put_fork((i+1)%N); } Προβλήματα; Αδιέξοδο (deadlock) Παρατεταμένη στέρηση (starvation)
Άλλες Πιθανές Λύσεις # define N 5 /*Number of philosophers*/ void philosopher(int i) { while(true) think(); take_fork(i); take_fork((i+1)%N); eat(); put_fork(i); put_fork((i+1)%N); } Κρίσιμη Περιοχή Όμως μόνο ένας φιλόσοφος μπορεί να τρώει κάθε φορά. Τυχαία καθυστέρηση (randomization) Εάν δεν υπάρχει ελεύθερο δεξί πιρούνι, τότε αφήνω και το αριστερό και ξαναδοκιμάζω μετά από κάποια τυχαία καθυστέρηση. Πρόβλημα: σε κάποιες εφαρμογές αυτός ο τρόπος μπορεί να μη δουλεύει.
Λύση με Σηματοφόρους (Μέρος 1)
Λύση με Σηματοφόρους (Μέρος 2)
Readers/Writers Problem Μοντέλο που ισχύει στα προβλήματα με βάσεις δεδομένων. Υποθέτουμε πως υπάρχει κάποιος κοινός χώρος μνήμης (π.χ., ένα αρχείο) Υπάρχουν n διεργασίες οι οποίες μπορούν να διαβάσουν κάποια πληροφορία από το αρχείο. Υπάρχουν m διεργασίες οι οποίες μπορούν να γράψουν κάποια πληροφορία στο αρχείο. Πως διαφέρει αυτό το πρόβλημα από το πρόβλημα παραγωγών / καταναλωτών; Όταν μια διεργασία διαβάζει τα δεδομένα δεν τα καταναλώνει (άλλες διεργασίες μπορούν να διαβάσουν την ίδια πληροφορία)
Readers/Writers Problem Διατύπωση του προβλήματος Ταυτόχρονα μπορούν να διαβάζούν τα δεδομένα αρκετοί readers. Μόνο ένας writer μπορεί να γράφει ανά πάσα στιγμή. Όταν γράφει ένας writer δεν μπορεί κανένας reader να διαβάζει.
Πιθανή Λύση με Σηματοφόρους
Πιθανή Λύση με Σηματοφόρους Πια είναι πιθανά προβλήματα της λύσης αυτής; Τι θα συμβεί εάν readers φτάνουν κάθε 3 δευτερόλεπτα και τελειώνουν μετά από 5 δευτερόλεπτα; Ο writer δεν μπορεί ποτέ να τρέξει!
Sleeping Barber Problem
Πιθανή Λύση Επίσης υποθέστε πως υπάρχουν οι ρουτίνες cut_hair() και get_haircut().
Πιθανή Λύση
Do Something Great (DSG) semaphore s1=1, s2=1; void process1(){ while(true){ down(&s1); down(&s2); DSG(); up(&s2); up(&s1); } void process2(){ while(true){ down(&s2); down(&s1); DSG(); up(&s1); up(&s2); } Πιο πιθανό πρόβλημα έχουν οι πιο πάνω διεργασίες; Αδιέξοδο (Deadlock)!!!