Ασκήσεις
Στο πρόγραμμα των τραπεζικών αναλήψεων μπορούμε να χρησιμοποιήσουμε ένα σηματοφορέα με όνομα «s» για να βεβαιωθούμε ότι ο λογαριασμός θα ενημερωθεί σωστά. Σημείωσε στο παρακάτω «πρόγραμμα» τα σημεία που πρέπει να εκτελεστούν οι λειτουργίες down(&s) και up(&s).
- Ρώτα τον πελάτη για το ποσό ανάληψης Α.
- Διάβασε το ποσό του λογαριασμού Χ.
- Βρες το υπόλοιπο του λογαριασμού Υ = Χ-Α.
- Καταχώρησε το νέο υπόλοιπο Υ στο λογαριασμό.
- Δώσε στον πελάτη τα χρήματα και την απόδειξη.
Το πρόγραμμα της δανειστικής βιβλιοθήκης μπορεί να χρησιμοποιήσει το σηματοφορέα με όνομα «book» για να μη «δανείζει» το ίδιο βιβλίο σε πολλούς χρήστες συγχρόνως. Τοποθέτησε τις λειτουργίες down(&book) και up(&book) στα κατάλληλα σημεία μέσα στο πρόγραμμα:
- Ρώτα το χρήστη τον τίτλο του βιβλίου που επιθυμεί να δανειστεί.
- Βρες την καταχώρηση του βιβλίου και εμφάνισε τα στοιχεία του.
- Ρώτα το χρήστη αν θέλει να δανειστεί το βιβλίο αυτό.
- Έλεγξε αν το βιβλίο δεν είναι δανεισμένο.
- Σημείωσε τον κωδικό του χρήστη στην καταχώρηση του βιβλίου.
- Τύπωσε το δανειστικό σημείωμα για την παραλαβή του βιβλίου.
Το τμήμα του προγράμματος που βλέπεις παρακάτω αποτελείται από τρεις διεργασίες. Οι διεργασίες τυπώνουν επαναληπτικά από ένα μήνυμα και συγχρονίζονται με τις υπόλοιπες διεργασίες του ίδιου προγράμματος με σηματοφορείς. Τι μηνύματα θα βλέπει ο χρήστης που τρέχει τις διεργασίες, με ποια σειρά δηλαδή θα τυπώνονται τα μηνύματα;
typedef int semaphore; /* οι σημαφόροι είναι ακέραιοι "ειδικής" κατηγορίας */
semaphore s1 = 1;
semaphore s2 = 0;
semaphore s3 = 0;
void procedure1(void) {
while(TRUE) {
down(&s1);
printf("Διεργασία 1")
up(&s2);
}
}
void procedure2(void) {
while(TRUE) {
down(&s2);
printf("Διεργασία 2");
up(&s3);
}
}
void procedure3(void) {
while(TRUE) {
down(&s3);
printf("Διεργασία 3");
up(&s1);
}
}
Το τμήμα του προγράμματος που βλέπεις παρακάτω αποτελείται από τρεις διεργασίες. Οι διεργασίες τυπώνουν επαναληπτικά από ένα μήνυμα και συγχρονίζονται με τις υπόλοιπες διεργασίες του ίδιου προγράμματος με σηματοφορείς. Τι μηνύματα θα βλέπει ο χρήστης που τρέχει τις διεργασίες, με ποια σειρά δηλαδή θα τυπώνονται τα μηνύματα;
typedef int semaphore; /* οι σημαφόροι είναι ακέραιοι "ειδικής" κατηγορίας */
semaphore s1 = 1;
semaphore s2 = 0;
semaphore s3 = 0;
void procedure1(void) {
while(TRUE) {
down(&s1);
printf("Διεργασία 1")
up(&s2);
}
}
void procedure2(void) {
while(TRUE) {
down(&s2);
up(&s1);
down(&s2);
printf("Διεργασία 2");
up(&s3);
}
}
void procedure3(void) {
while(TRUE) {
down(&s3);
printf("Διεργασία 3");
up(&s1);
}
}
Δίνεται τμήμα προγράμματος που αποτελείται από τρεις διεργασίες που συγχρονίζονται από δύο σημαφόρους.
typedef int semaphore; /* οι σημαφόροι είναι ακέραιοι "ειδικής" κατηγορίας */
semaphore u = 3;
semaphore v = 0;
void procedure1(void) {
while(TRUE) {
down(&u);
printf("C")
up(&v);
}
}
void procedure2(void) {
while(TRUE) {
down(&v);
printf("A");
printf("B");
up(&v);
}
}
void procedure3(void) {
while(TRUE) {
down(&v);
printf("D");
}
}
Για να απαντήσετε τις παρακάτω ερωτήσεις υποθέστε ότι όταν ξεκινά η εκτέλεση οι διεργασίες επιτρέπεται να εκτελούνται μέχρις ότου και οι τρεις εισέλθουν σε κατάσταση «Υπο Αναστολή», στο σημείο αυτό η εκτέλεση σταματά.
- Υποθέτοντας ότι η εκτέλεση τελικά σταματά, πόσα ‘C’ θα εκτυπωθούν;
- Υποθέτοντας ότι η εκτέλεση τελικά σταματά, πόσα ‘D’ θα εκτυπωθούν;
- Πόσα είναι τα λιγότερα ‘Α’ που μπορούν να εκτυπωθούν;
- Η ακολουθία ‘CABABDDCABCABD’ είναι δυνατόν να εμφανισθεί;
- Η ακολουθία ‘CABACDBCABDD’ είναι δυνατόν να εμφανισθεί;
- Είναι δυνατόν να σταματήσει η εκτέλεση και κάποιο από τα U,V να έχουν μη μηδενικές τιμές;
Το παρακάτω ζεύγος διεργασιών διαμοιράζεται μια κοινή μεταβλητή x
.
int x = 5;
void procedure1(void) {
int y;
y = 2*x;
x = y;
}
void procedure2(void) {
int z;
z = x+1;
x = z;
}
Οι εντολές εντός κάθε διεργασίας εκτελούνται σειριακά, αλλά οι εντολές της διεργασίας procedure1
είναι δυνατόν να εκτελεσθούν με οποιαδήποτε σειρά ως προς τις εντολές της διεργασίας procedure2
.
- Πόσες διαφορετικές τιμές της μεταβλητής
x
μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;
- Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό σημαφόρο
s
(αρχική τιμή 1). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;
typedef int semaphore;
semaphore s = 1;
int x = 5;
void procedure1(void) {
int y;
down(&s);
y = 2*x;
x = y;
up(&s);
}
void procedure2(void) {
int z;
down(&s);
z = x+1;
x = z;
up(&s);
}
- Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό δυαδικό σημαφόρο
t
(αρχική τιμή 0). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;
typedef int semaphore;
semaphore t = 0;
int x = 5;
void procedure1(void) {
int y;
y = 2*x;
x = y;
up(&t);
}
void procedure2(void) {
int z;
down(&t);
z = x+1;
x = z;
}