User Tools

Site Tools


java:semaphores

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
java:semaphores [2016/05/15 20:25] – created gthanosjava:semaphores [2017/03/18 21:44] (current) – external edit 127.0.0.1
Line 3: Line 3:
 Ο σηματοφορέας είναι μία οντότητα συγχρονισμού μεταξύ ανεξάρτητων ροών εργασίας. Ας υποθέσουμε ότι έχουμε ένα buffer Ν θέσεων μηνυμάτων μέσω του οποίου επικοινωνούν δύο διεργασίες. Αρχικά το buffer είναι άδειο, η διεργασία Α προσθέτει μηνύματα στο buffer και η διεργασία Β τα διαβάζει και τα αφαιρεί από το buffer. Η διαδικασία υπόκειται στους εξής περιορισμούς: Ο σηματοφορέας είναι μία οντότητα συγχρονισμού μεταξύ ανεξάρτητων ροών εργασίας. Ας υποθέσουμε ότι έχουμε ένα buffer Ν θέσεων μηνυμάτων μέσω του οποίου επικοινωνούν δύο διεργασίες. Αρχικά το buffer είναι άδειο, η διεργασία Α προσθέτει μηνύματα στο buffer και η διεργασία Β τα διαβάζει και τα αφαιρεί από το buffer. Η διαδικασία υπόκειται στους εξής περιορισμούς:
   - Η διεργασία Β δεν μπορεί να διαβάσει από το buffer εάν το buffer είναι κενό.   - Η διεργασία Β δεν μπορεί να διαβάσει από το buffer εάν το buffer είναι κενό.
-  - Η διεργασία Α δεν μπορεί αν γράψει στο buffer εάν αυτό είναι γεμάτο.+  - Η διεργασία Α δεν μπορεί να γράψει στο buffer εάν το buffer είναι γεμάτο.
  
 Ας υποθέσουμε ότι ορίζουμε ένα σηματοφορέα ως εξής. Αρχικά ο σηματοφορέας έχει μία αρχική ακέραια τιμή μεγαλύτερη ή ίση με το μηδέν. Κάθε φορά που λαμβάνουμε ένα resource (θα εξηγηθεί) η τιμή του σηματοφορέα μειώνεται κατά 1, ενώ κάθε φορά που επιστρέφουμε ένα resource η τιμή αυξάνεται κατά 1. Εάν ο σηματοφορέας λάβει την τιμή μηδέν δεν μπορούμε να λάβουμε άλλο resource και η διεργασία που προσπαθεί να λάβει το resource μπλοκάρει.  Ας υποθέσουμε ότι ορίζουμε ένα σηματοφορέα ως εξής. Αρχικά ο σηματοφορέας έχει μία αρχική ακέραια τιμή μεγαλύτερη ή ίση με το μηδέν. Κάθε φορά που λαμβάνουμε ένα resource (θα εξηγηθεί) η τιμή του σηματοφορέα μειώνεται κατά 1, ενώ κάθε φορά που επιστρέφουμε ένα resource η τιμή αυξάνεται κατά 1. Εάν ο σηματοφορέας λάβει την τιμή μηδέν δεν μπορούμε να λάβουμε άλλο resource και η διεργασία που προσπαθεί να λάβει το resource μπλοκάρει. 
  
 Για το παραπάνω πρόβλημα ορίζουμε δύο σηματοφορείς (//write// και //read//) ως εξής: Για το παραπάνω πρόβλημα ορίζουμε δύο σηματοφορείς (//write// και //read//) ως εξής:
-  - Ένας σηματοφορέας //write// με αρχική τιμή Ν (Ν permits). Κάθε φορά που γράφουμε 1 μήνυμα στο buffer ο σηματοφορέας μειώνει την τιμή του κατά 1, ενώ κάθε φορά που διαβάζουμε 1 μήνυμα από το buffer ο σηματοφορέας αυξάνει την τιμή του κατά 1. +  - Ένας σηματοφορέας //writeSem// με αρχική τιμή Ν (Ν permits). Κάθε φορά που γράφουμε 1 μήνυμα στο buffer ο σηματοφορέας μειώνει την τιμή του κατά 1, ενώ κάθε φορά που διαβάζουμε 1 μήνυμα από το buffer ο σηματοφορέας αυξάνει την τιμή του κατά 1. 
-  - Ένας σηματοφορεας //read// με αρχική 0. Κάθε φορά που γράφουμε 1 μήνυμα στο buffer ο σηματοφορέας αυξάνει την τιμή του κατά 1, ενώ κάθε φορά που διαβάζουμε 1 μήνυμα από το buffer ο σηματοφορέας μειώνει την τιμή του κατά 1.+  - Ένας σηματοφορεας //readSem// με αρχική 0. Κάθε φορά που γράφουμε 1 μήνυμα στο buffer ο σηματοφορέας αυξάνει την τιμή του κατά 1, ενώ κάθε φορά που διαβάζουμε 1 μήνυμα από το buffer ο σηματοφορέας μειώνει την τιμή του κατά 1.
  
-Εάν το buffer είναι άδειο ο σηματοφορέας read έχει την τιμή 0 και η διαδικασία B μπλοκάρει μέχρι να γραφεί κάτι σε αυτό. Εάν το buffer είναι γεμάτο ο σηματοφορέας write έχει την τιμή 0 και η διαδικασία A μπλοκάρει μέχρι να διαβαστεί κάτι από το buffer.+Όταν το buffer είναι άδειος ο σηματοφορέας //readSem// έχει την τιμή 0 και η διαδικασία B μπλοκάρει μέχρι να γραφεί κάτι σε αυτό. Εάν το buffer είναι γεμάτο ο σηματοφορέας write έχει την τιμή 0 και η διαδικασία A μπλοκάρει μέχρι να διαβαστεί κάτι από το buffer.
  
 Ο κώδικας για το γράψιμο και το διάβασμα στο buffer δίνεται σχηματικά ως εξής: Ο κώδικας για το γράψιμο και το διάβασμα στο buffer δίνεται σχηματικά ως εξής:
Line 17: Line 17:
 <code java> <code java>
 // γράψιμο // γράψιμο
-  write.down()+  writeSem.down()
   buffer.write(msg);   buffer.write(msg);
-  read.up();+  readSem.up();
      
 // διάβασμα // διάβασμα
   String msg;   String msg;
-  read.down()+  readSem.down()
   msg = buffer.read();   msg = buffer.read();
-  write.up();+  writeSem.up();
 </code> </code>
  
java/semaphores.1463343906.txt.gz · Last modified: 2016/05/15 19:25 (external edit)