ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ
Τμήμα Ηλεκτρονικών Μηχ. και Μηχ. Υπολογιστών

ΛΟΓ 201: Τεχνολογία Λογισμικού ΙΙ
http://www.softlab.ntua.gr/~nickie/TUC/log201/

3η Σειρά Ασκήσεων
Υποδείξεις


Γενικά

Η δημιουργία των δυο διεργασιών που απαιτούνται για την υλοποίηση του γενικού μοντέλου παραγωγού-καταναλωτή (producer-consumer), είναι απλή και έχει ήδη καλυφθεί στην παράδοση της 18/4/2000. Ο κώδικας της διεργασίας-παραγωγού θα πρέπει να επαναλαμβάνει συνεχώς τα ακόλουθα βήματα:

ενώ αντίστοιχα τα βήματα που πρέπει να επαναλαμβάνει συνεχώς ο κώδικας της διεργασίας-καταναλωτή είναι τα παρακάτω:

Για την παραγωγή των τυχαίων αριθμών μπορείτε να χρησιμοποιήσετε τη συνάρτηση rand της βιβλιοθήκης της C, η οποία παράγει τυχαίους ακέραιους αριθμούς μεταξύ 0 και RAND_MAX (μια σταθερά μεγαλύτερη από 1000).


Άσκηση 1

Για την επίτευξη επικοινωνίας μεταξύ των δυο διεργασιών, στην άσκηση αυτή σας ζητείται να χρησιμοποιήσετε τις διασωληνώσεις (pipes) του Unix, που περιγράφονται στην παράγραφο 8.2.5 του βιβλίου του Chan.

Χρήσιμες συναρτήσεις: pipe, read, write, close.

Η διασωλήνωση θα χρησιμοποιείται για την επικοινωνία των δυο διεργασιών προς τη μια κατεύθυνση. Η διεργασία-παραγωγός θα χρησιμοποιεί το ένα άκρο της για να γράφει τους αριθμούς, ενώ η διεργασία-καταναλωτής θα χρησιμοποιεί το άλλο άκρο για να τους διαβάζει. Ο συγχρονισμός των δυο διεργασιών θα πραγματοποιείται αυτόματα μέσω της διασωλήνωσης, η οποία:


Άσκηση 2

Για την επίτευξη επικοινωνίας μεταξύ των δυο διεργασιών, στην άσκηση αυτή σας ζητείται να χρησιμοποιήσετε τα μηνύματα (messages) του Unix System V, που περιγράφονται στην παράγραφο 10.3 του βιβλίου του Chan.

Χρήσιμες συναρτήσεις: msgget, msgsnd, msgrcv, msgctl.

Θα χρειαστεί επίσης να δημιουργήσετε για την αποστολή μηνυμάτων μια δομή της μορφής:

   struct message {
      long int mtype;
      char mtext[MAXMSG];
   };

στο πεδίο mtext της οποίας θα αποθηκεύετε την τιμή του αριθμού που μεταφέρεται.

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


Άσκηση 3

Για την επίτευξη επικοινωνίας μεταξύ των δυο διεργασιών, στην άσκηση αυτή σας ζητείται να χρησιμοποιήσετε τους σηματοφορείς (semaphores) και την κοινή μνήμη (shared memory) του Unix System V, που περιγράφονται στις παραγράφους 10.5 και 10.7 αντίστοιχα του βιβλίου του Chan.

Χρήσιμες συναρτήσεις:

Η κοινή μνήμη θα χρησιμοποιηθεί για την ανταλλαγή αριθμών μεταξύ των δυο διεργασιών. Η διεργασία-παραγωγός θα τοποθέτεί εκεί τους αριθμούς, και η διεργασία-καταναλωτής θα τους διαβάζει. Μια ακέραιη μεταβλητή είναι αρκετή ως κοινή μνήμη για το σκοπό αυτό.

Οι σηματοφορείς χρειάζονται έτσι ώστε οι δυο διεργασίες να συγχρονίζονται. Η έλλειψη συγχρονισμού μπορεί να οδηγήσει σε ένα από τα ακόλουθα μη επιθυμητά σενάρια:

Μια απλή λύση για την επίτευξη συγχρονισμού απαιτεί δυο σηματοφορείς με τιμές 0 και 1. Φυσικά είναι δυνατές και άλλες λύσεις.

Κάθε σηματοφορέας θα αντιστοιχεί σε μια από τις δυο διεργασίες. Αν έχει την τιμή 1, αυτό θα σημαίνει ότι η διεργασία μπορεί να προχωρήσει στη χρήση της κοινής μνήμης. Διαφορετικά, αν έχει την τιμή 0, αυτό σημαίνει ότι η διεργασία θα πρέπει να περιμένει γιατί η κοινή μνήμη χρησιμοποιείται από την άλλη διεργασία.

Σε κάθε βήμα της, προτού χρησιμοποιήσει την κοινή μεταβλητή, κάθε διεργασία θα προσπαθεί να μειώσει την τιμή του σηματοφορέα της. Στη συνέχεια, αφού τελειώσει τη δουλειά της, θα αυξάνει την τιμή του σηματοφορέα της άλλης διεργασίας, επιτρέποντάς της να χρησιμοποιήσει εκείνη την κοινή μεταβλητή. Με τον τρόπο αυτό εξασφαλίζεται ότι μόνο μια διεργασία κάθε φορά θα μπορεί να χρησιμοποιεί την κοινή μνήμη. Στην αρχή του προγράμματος, θα πρέπει ο σηματοφορέας του παραγωγού να έχει τιμή 1.


Νίκος Παπασπύρου (nickie@softlab.ntua.gr). 20/4/2000 .