java:semaphores
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
java:semaphores [2016/05/15 20:25] – created gthanos | java: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 |
Ας υποθέσουμε ότι ορίζουμε ένα σηματοφορέα ως εξής. Αρχικά ο σηματοφορέας έχει μία αρχική ακέραια τιμή μεγαλύτερη ή ίση με το μηδέν. Κάθε φορά που λαμβάνουμε ένα 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 είναι άδειο ο σηματοφορέας | + | Όταν το buffer είναι άδειος ο σηματοφορέας |
Ο κώδικας για το γράψιμο και το διάβασμα στο buffer δίνεται σχηματικά ως εξής: | Ο κώδικας για το γράψιμο και το διάβασμα στο buffer δίνεται σχηματικά ως εξής: | ||
Line 17: | Line 17: | ||
<code java> | <code java> | ||
// γράψιμο | // γράψιμο | ||
- | | + | |
buffer.write(msg); | buffer.write(msg); | ||
- | | + | |
| | ||
// διάβασμα | // διάβασμα | ||
String msg; | String msg; | ||
- | | + | |
msg = buffer.read(); | msg = buffer.read(); | ||
- | | + | |
</ | </ | ||
java/semaphores.1463343906.txt.gz · Last modified: 2016/05/15 19:25 (external edit)