Αρχική ΑΕΠΠ - Δομές Δεδομένων Λειτουργικά Συστήματα Δίκτυα Υπολογιστών ΙΙ Βάσεις Δεδομένων Παιδαγωγικά - Διδακτική
Εισαγωγή στα Λ.Σ. Βασικές Δομές Η/Υ Βασικές Δομές Λ.Σ
Διεργασίες Χρονοπρογραμματισμός Συγχρονισμός
Μονοπρογραμματισμός Εναλλαγή Εικονική Μνήμη Κατάτμηση
Εμφάνιση μικρών αλλαγών - Αλλαγές κώδικα
void writer(){
while(1){ wait(y); writecount++; if (writecount==1) wait(rsem); signal(y); wait(wsem); doWriting(); signal(wsem); wait(y); writecount--; if (writecount==0) signal(rsem); signal(y); }
void writer(void) {
down(&wc_mutex); wc++; if (wc==1) down(&readersQueue); up(&wc_mutex); down(&db); write_db(); up(&db); down(&wc_mutex); wc--; if (wc==0) up(&readersQueue); up(&wc_mutex);
@]
@]
Αν ένας αναγνώστης φτάσει στο κρίσιμο τμήμα του έχει κάνει down τον db (γραμμή 11) αλλά όχι τον readersQueue (γραμμή 17). Έτσι, αν φτάσει ένας αναγνώστης μπορεί να κάνει down τον readersQueue. Αυτό θα κάνει όσους αναγνώστες φτάνουν να αναστέλλονται στη γραμμή 10. Όταν ο τελευταίος αναγνώστης βγει από το κρίσιμο τμήμα του θα κάνει up τον db (γραμμή 23) το οποίο ελευθερώνει τους εγγραφείς που έχουν ανασταλεί.
Αν ένας εγγραφέας είναι στο κρίσιμο τμήμα του, έχει κάνει down τόσο τον readersQueue, όσο και τον db. Αυτό έχει το αποτέλεσμα ότι ούτε άλλος εγγραφέας ούτε αναγνώστης μπορεί να μπει στο κρίσιμο τμήμα του. Επίσης, όσοι εγγραφείς φτάνουν αυξάνουν την μεταβλητή wc και περιμένουν στον readersQueue. Αυτό σημαίνει ότι όσο φτάνουν εγγραφείς, ένας ένας θα μπαίνουν στο κρίσιμο τμήμα τους και οι αναγνώστες θα περιμένουν. Μόνο ο τελευταίος εγγραφέας θα κάνει up τον readersQueue και θα μπορούν να προχωρήσουν οι αναγνώστες.
Εδώ μπορεί να παρατηρηθεί το αντίστοιχο φαινόμενο με την προτεραιότητα στους αναγνώστες, δηλαδή, ότι οι αναγνώστες μπορεί να λιμοκτονούν ή τουλάχιστον να υφίστανται μεγάλες καθυστερήσεις.
semaphore rc = 1; // Ελέγχει την πρόσβαση στα δεδομένα semaphore db = 1; // Ελέγχει την πρόσβαση στην μεταβλητή readcount
semaphore wsem = 1; // semaphore x = 1; //
while(true){ wait(rc); // Αποκλειστική πρόσβαση στην μεταβλητή readcount
while(1){ wait(x);
down(db); // Προσπάθεια να πάρει αποκλειστική πρόσβαση στα δεδομένα signal(rc);
wait(wsem); signal(x);
wait(rc);
wait(x);
up(db); signal(rc);
signal(wsem); signal(x);
while(true){ down(db);
while(1){ wait(wsem);
up(db);
signal(wsem);
semaphore rc = 1, wc = 1; //
semaphore rsem, wsem = 1; //
wait(rc);
wait(rsem);
wait(wc);
wait(wsem);
signal(rc);
signal(rsem);
signal(wc);
signal(wsem);
wait(rc);
wait(rsem);
wait(wc);
wait(wsem);
signal(wc);
signal(wsem);
signal(rc);
signal(rsem);
}
} @]
Copyright 2008 - Άρης Φεργάδης