Αρχική ΑΕΠΠ - Δομές Δεδομένων Λειτουργικά Συστήματα Δίκτυα Υπολογιστών ΙΙ Βάσεις Δεδομένων Παιδαγωγικά - Διδακτική

Εισαγωγικά

Εισαγωγή στα Λ.Σ. Βασικές Δομές Η/Υ Βασικές Δομές Λ.Σ

Διεργασίες

Διεργασίες Χρονοπρογραμματισμός Συγχρονισμός

Αδιέξοδα

Μνήμη

Μονοπρογραμματισμός Εναλλαγή Εικονική Μνήμη Κατάτμηση

Είσοδος / Έξοδος

Σύστημα Αρχείων

Διεπαφή Υλοποίηση

 Ιστορικό Πρόσφατες αλλαγές Εκτύπωση Αναζήτηση

Ιστορικό: OS.ClassicalProblems

Εμφάνιση μικρών αλλαγών - Αλλαγές κώδικα

04-09-2008 (20:25) από Άρης -
Πρόσθεση σειρών 47-90:
Αλλαγή σειρών 93-115 από:
σε:
Αλλαγή σειρών 124-139 από:

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);
Αλλαγή σειρών 139-145 από:

@]

σε:

@]

Αν ένας αναγνώστης φτάσει στο κρίσιμο τμήμα του έχει κάνει down τον db (γραμμή 11) αλλά όχι τον readersQueue (γραμμή 17). Έτσι, αν φτάσει ένας αναγνώστης μπορεί να κάνει down τον readersQueue. Αυτό θα κάνει όσους αναγνώστες φτάνουν να αναστέλλονται στη γραμμή 10. Όταν ο τελευταίος αναγνώστης βγει από το κρίσιμο τμήμα του θα κάνει up τον db (γραμμή 23) το οποίο ελευθερώνει τους εγγραφείς που έχουν ανασταλεί.

Αν ένας εγγραφέας είναι στο κρίσιμο τμήμα του, έχει κάνει down τόσο τον readersQueue, όσο και τον db. Αυτό έχει το αποτέλεσμα ότι ούτε άλλος εγγραφέας ούτε αναγνώστης μπορεί να μπει στο κρίσιμο τμήμα του. Επίσης, όσοι εγγραφείς φτάνουν αυξάνουν την μεταβλητή wc και περιμένουν στον readersQueue. Αυτό σημαίνει ότι όσο φτάνουν εγγραφείς, ένας ένας θα μπαίνουν στο κρίσιμο τμήμα τους και οι αναγνώστες θα περιμένουν. Μόνο ο τελευταίος εγγραφέας θα κάνει up τον readersQueue και θα μπορούν να προχωρήσουν οι αναγνώστες.

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

26-08-2008 (19:09) από Άρης -
Αλλαγή σειράς 15 από:
σε:
26-08-2008 (19:03) από Άρης -
Αλλαγή σειρών 17-19 από:

semaphore rc = 1; // Ελέγχει την πρόσβαση στα δεδομένα semaphore db = 1; // Ελέγχει την πρόσβαση στην μεταβλητή readcount

σε:

semaphore wsem = 1; // semaphore x = 1; //

Αλλαγή σειρών 21-22 από:
   while(true){
      wait(rc);            // Αποκλειστική πρόσβαση στην μεταβλητή readcount
σε:
   while(1){
      wait(x);
Αλλαγή σειρών 25-26 από:
             down(db);    // Προσπάθεια να πάρει αποκλειστική πρόσβαση στα δεδομένα
      signal(rc);
σε:
             wait(wsem);
      signal(x);
Αλλαγή σειράς 28 από:
      wait(rc);
σε:
      wait(x);
Αλλαγή σειρών 31-32 από:
             up(db);
      signal(rc);
σε:
             signal(wsem);
      signal(x);
Αλλαγή σειρών 37-38 από:
  while(true){
      down(db);
σε:
  while(1){
      wait(wsem);
Αλλαγή σειράς 40 από:
      up(db);
σε:
      signal(wsem);
Αλλαγή σειράς 51 από:

semaphore rc = 1, wc = 1; //

σε:

semaphore rsem, wsem = 1; //

Αλλαγή σειράς 57 από:
      wait(rc);
σε:
      wait(rsem);
Αλλαγή σειράς 61 από:
             wait(wc);
σε:
             wait(wsem);
Αλλαγή σειράς 63 από:
      signal(rc);
σε:
      signal(rsem);
Αλλαγή σειράς 69 από:
             signal(wc);
σε:
             signal(wsem);
Αλλαγή σειράς 79 από:
             wait(rc);
σε:
             wait(rsem);
Αλλαγή σειράς 81 από:
      wait(wc);
σε:
      wait(wsem);
Αλλαγή σειράς 83 από:
      signal(wc);
σε:
      signal(wsem);
Αλλαγή σειράς 87 από:
             signal(rc);
σε:
             signal(rsem);
Αλλαγή σειρών 90-91 από:

}

σε:

} @]

26-08-2008 (18:57) από Άρης -
Πρόσθεση σειρών 1-90:

Τελευταία ενημέρωση: 04-09-2008 (20:25)

Copyright 2008 - Άρης Φεργάδης