23. Η λύση του προβλήματος παραγωγού/καταναλωτή με monitor

                Το πρόβλημα του παραγωγού/καταναλωτή είναι ένα κλασικό πρόβλημα συγχρονισμού. Οι διεργασίες παραγωγού και καταναλωτή μοιράζονται ένα κοινό  Buffer (με οκτώ θέσεις (slots) στο παράδειγμα αυτό). Ο παραγωγός εκτελεί ένα άπειρο βρόχο, στον οποίο θέτει νέα αντικείμενα στο buffer και ο καταναλωτής εκτελεί ένα άπειρο βρόχο κατά τον οποίο καταργεί αντικείμενα από το buffer. Οι ακόλουθες σημαντικές προϋποθέσεις πρέπει να πληρούνται από τον παραγωγό και καταναλωτή:

 

·         Το πολύ μία διεργασία (παραγωγός ή ο καταναλωτής) μπορεί να έχει πρόσβαση το κοινό buffer ανά πάσα στιγμή. Αυτή η κατάσταση ονομάζεται αμοιβαίος αποκλεισμός.

·         Όταν o Buffer είναι πλήρης (έχουν ληφθεί και τα οκτώ slots), ο παραγωγός θα πρέπει να τεθούν σε κατάσταση sleep. Θα πρέπει να ξυπνήσει όταν ένα άδειο slot γίνει διαθέσιμο. Αυτό ονομάζεται συγχρονισμός.

·         Όταν το buffer είναι άδειο, ο καταναλωτής θα πρέπει να τεθεί σε κατάσταση sleep. Θα πρέπει μόνο να ξυπνήσει όταν γεμίσει ένα slot. Αυτή η διαδικασία ονομάζεται επίσης συγχρονισμός.

Αυτός ο προσομοιωτής εμφανίζει μια λύση στο πρόβλημα του καταναλωτή-παραγωγού με τη χρήση ενός monitor που ονομάζεται ProducerConsumer. To monitor έχει δυο διαδικασίες: EnterItem(Εισαγωγή αντικειμένου) και RemoveItem(Εξαγωγή αντικειμένου). Η οθόνη έχει δύο μεταβλητές: full και empty.  Μια μεταβλητή μετρητής δείχνει τον αριθμό των γεμάτων slot στο buffer. Αυτή η μεταβλητή είναι μια μεταβλητή του monitor και σε αυτήν έχουν πρόσβαση μονάχα μία από τις δύο διαδικασίες παρακολούθησης. Ο πάγκος εργασίας που πρόκειται να δείτε, δείχνει τον κώδικα των διεργασιών  παραγωγοού και καταναλωτή, τον κώδικα του monitor, καθώς και τον κοινό buffer.  Μπορείτε να λειτουργήσετε τον πάγκο εργασίας σε μια κατάσταση βήμα προς βήμα πατώντας το κουμπί STEP κάτω από κάθε διαδικασία.  Αυτό θα προωθήσει τη διεργασία με βάση τον κώδικά της. Όταν μια διεργασία περιμένει κάποια συνθήκη μια σφαίρα που αντιστοιχεί στη διεργασία θα εμφανίζεται μέσα στον κώδικα του Monitor να δείχνει που  υποτίθεται να επανέλθει η διεργασία. Μπορείτε να δείτε πώς το περιεχόμενο μνήμης και πως η μεταβλητή μετρητής αλλάζει ως αποτέλεσμα της εκτέλεσης της διεργασίας. Ένα παράθυρο κάτω από κάθε διεργασία υποδηλώνει αν η διαδικασία βρίσκεται σε λειτουργία ή κοιμάται. Μπορείτε επίσης να εκτελέσετε τον προσομοιωτή σε μια κατάσταση animation πατώντας το κουμπί ANIMATE. Θα δείτε τους ελέγχους που σας επιτρέπουν να αλλάξετε τη ταχύτητα εκτέλεσης και τον χρόνο που απαιτείται για έναν παραγωγό να παράγει ένα στοιχείο και για έναν καταναλωτή να καταναλώσει ένα στοιχείο.