Αρχική ΑΕΠΠ - Δομές Δεδομένων Λειτουργικά Συστήματα Δίκτυα Υπολογιστών ΙΙ Βάσεις Δεδομένων Παιδαγωγικά - Διδακτική

Εισαγωγικά

Εισαγωγή στα Λ.Σ. Βασικές Δομές Η/Υ Βασικές Δομές Λ.Σ

Διεργασίες

Διεργασίες Χρονοπρογραμματισμός Συγχρονισμός

Αδιέξοδα

Μνήμη

Μονοπρογραμματισμός Εναλλαγή Εικονική Μνήμη Κατάτμηση

Είσοδος / Έξοδος

Σύστημα Αρχείων

Διεπαφή Υλοποίηση

 Ιστορικό Πρόσφατες αλλαγές Εκτύπωση Αναζήτηση

Ιστορικό: OS.Semaphore

Απόκρυψη μικρών αλλαγών - Αλλαγές περιεχομένου

24-06-2008 (15:55) από 194.63.239.168 -
Αλλαγή σειρών 158-161 από:
#Πόσες διαφορετικές τιμές της μεταβλητής Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;

#Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό σημαφόρο @@s@@ (αρχική τιμή 1). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;
σε:
*Πόσες διαφορετικές τιμές της μεταβλητής @@x@@ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;

*Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό σημαφόρο @@s@@ (αρχική τιμή 1). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;
Αλλαγή σειρών 184-185 από:
#Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό δυαδικό σημαφόρο @@t@@ (αρχική τιμή 0). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;
σε:
*Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό δυαδικό σημαφόρο @@t@@ (αρχική τιμή 0). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;
24-06-2008 (15:53) από 194.63.239.168 -
Πρόσθεση σειρών 137-204:
----
Το παρακάτω ζεύγος διεργασιών διαμοιράζεται μια κοινή μεταβλητή @@x@@.

(:source lang=cpp:) [@
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@@.

#Πόσες διαφορετικές τιμές της μεταβλητής Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;

#Υποθέστε ότι τα προγράμματα τροποποιούνται για να χρησιμοποιήσουν ένα κοινό σημαφόρο @@s@@ (αρχική τιμή 1). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;

(:source lang=cpp:) [@
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). Πόσες διαφορετικές τιμές του Χ μπορούν να προκύψουν όταν ολοκληρωθεί η εκτέλεση και των δύο διεργασιών;

(:source lang=cpp:) [@
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;
}
@]
24-06-2008 (15:44) από 194.63.237.23 -
Πρόσθεση σειρών 96-136:
Δίνεται τμήμα προγράμματος που αποτελείται από τρεις διεργασίες που συγχρονίζονται από δύο σημαφόρους.

(:source lang=cpp:) [@
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 να έχουν μη μηδενικές τιμές;
24-06-2008 (15:39) από 194.63.237.23 -
Αλλαγή σειρών 24-25 από:
Το πρόγραμμα που βλέπεις παρακάτω αποτελείται από τρεις διεργασίες. Οι διεργασίες τυπώνουν επαναληπτικά από ένα μήνυμα και συγχρονίζονται με τις υπόλοιπες διεργασίες του ίδιου προγράμματος με σηματοφορείς. Τι θα βλέπει ο χρήστης που τρέχει τα προγράμματα αυτά, με ποια σειρά δηλαδή θα τυπώνονται τα μηνύματα των δυο προγραμμάτων;
σε:
Το τμήμα του προγράμματος που βλέπεις παρακάτω αποτελείται από τρεις διεργασίες. Οι διεργασίες τυπώνουν επαναληπτικά από ένα μήνυμα και συγχρονίζονται με τις υπόλοιπες διεργασίες του ίδιου προγράμματος με σηματοφορείς. Τι μηνύματα θα βλέπει ο χρήστης που τρέχει τις διεργασίες, με ποια σειρά δηλαδή θα τυπώνονται τα μηνύματα;
Αλλαγή σειρών 59-90 από:
Το πρόγραμμα που βλέπεις παρακάτω αποτελείται από τρεις διεργασίες. Οι διεργασίες τυπώνουν επαναληπτικά από ένα μήνυμα και συγχρονίζονται με τις υπόλοιπες διεργασίες του ίδιου προγράμματος με σηματοφορείς. Τι θα βλέπει ο χρήστης που τρέχει τα προγράμματα αυτά, με ποια σειρά δηλαδή θα τυπώνονται τα μηνύματα των δυο προγραμμάτων;

[@program Mhnymata2;
var s1, s2, s3: semaphore;
procedure P1;
begin
while true do begin
P(s1);
writeln(‘∆ιεργασία 1’);
V(s2);
end
end;
procedure P2;
begin
while true do begin
P(s2); V(s1); P(s2);
writeln(‘∆ιεργασία 2’);
V(s3);
end
end;
procedure P3;
begin
while true do begin
P(s3);
writeln(‘∆ιεργασία 3’);
V(s1);
end
end;
begin
s1 := 1; s2 := 0; s3 := 0;
parbegin P1 || P2 || P3 parend
end. @]
σε:
Το τμήμα του προγράμματος που βλέπεις παρακάτω αποτελείται από τρεις διεργασίες. Οι διεργασίες τυπώνουν επαναληπτικά από ένα μήνυμα και συγχρονίζονται με τις υπόλοιπες διεργασίες του ίδιου προγράμματος με σηματοφορείς. Τι μηνύματα θα βλέπει ο χρήστης που τρέχει τις διεργασίες, με ποια σειρά δηλαδή θα τυπώνονται τα μηνύματα;

(:source lang=cpp:) [@
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);
}
}
@]

----
24-06-2008 (15:36) από 194.63.237.23 -
Αλλαγή σειρών 26-61 από:
[@program Mhnymata1;
σε:
(:source lang=cpp:) [@
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);
}
}
@]

----

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

[@program Mhnymata2;
Αλλαγή σειράς 66 από:
down(s1);
σε:
P(s1);
Αλλαγή σειράς 68 από:
up(s2);
σε:
V(s2);
Αλλαγή σειράς 74 από:
down(s2);
σε:
P(s2); V(s1); P(s2);
Αλλαγή σειράς 76 από:
up(s3);
σε:
V(s3);
Αλλαγή σειράς 82 από:
down(s3);
σε:
P(s3);
Αλλαγή σειράς 84 από:
up(s1);
σε:
V(s1);
Διαγραφή σειρών 89-123:
end. @]

----

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

[@program Mhnymata2;
var s1, s2, s3: semaphore;
procedure P1;
begin
while true do begin
P(s1);
writeln(‘∆ιεργασία 1’);
V(s2);
end
end;
procedure P2;
begin
while true do begin
P(s2); V(s1); P(s2);
writeln(‘∆ιεργασία 2’);
V(s3);
end
end;
procedure P3;
begin
while true do begin
P(s3);
writeln(‘∆ιεργασία 3’);
V(s1);
end
end;
begin
s1 := 1; s2 := 0; s3 := 0;
parbegin P1 || P2 || P3 parend
24-06-2008 (15:28) από 194.63.237.23 -
Πρόσθεση σειρών 1-90:
! Ασκήσεις

Στο πρόγραμμα των τραπεζικών αναλήψεων μπορούμε να χρησιμοποιήσουμε ένα σηματοφορέα με όνομα «s» για να βεβαιωθούμε ότι ο λογαριασμός θα ενημερωθεί σωστά. Σημείωσε στο παρακάτω «πρόγραμμα» τα σημεία που πρέπει να εκτελεστούν οι λειτουργίες down(&s) και up(&s).

#Ρώτα τον πελάτη για το ποσό ανάληψης Α.
#Διάβασε το ποσό του λογαριασμού Χ.
#Βρες το υπόλοιπο του λογαριασμού Υ = Χ-Α.
#Καταχώρησε το νέο υπόλοιπο Υ στο λογαριασμό.
#Δώσε στον πελάτη τα χρήματα και την απόδειξη.

----

Το πρόγραμμα της δανειστικής βιβλιοθήκης μπορεί να χρησιμοποιήσει το σηματοφορέα με όνομα «book» για να μη «δανείζει» το ίδιο βιβλίο σε πολλούς χρήστες συγχρόνως. Τοποθέτησε τις λειτουργίες down(&book) και up(&book) στα κατάλληλα σημεία μέσα στο πρόγραμμα:

#Ρώτα το χρήστη τον τίτλο του βιβλίου που επιθυμεί να δανειστεί.
#Βρες την καταχώρηση του βιβλίου και εμφάνισε τα στοιχεία του.
#Ρώτα το χρήστη αν θέλει να δανειστεί το βιβλίο αυτό.
#Έλεγξε αν το βιβλίο δεν είναι δανεισμένο.
#Σημείωσε τον κωδικό του χρήστη στην καταχώρηση του βιβλίου.
#Τύπωσε το δανειστικό σημείωμα για την παραλαβή του βιβλίου.

----

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

[@program Mhnymata1;
var s1, s2, s3: semaphore;
procedure P1;
begin
while true do begin
down(s1);
writeln(‘∆ιεργασία 1’);
up(s2);
end
end;
procedure P2;
begin
while true do begin
down(s2);
writeln(‘∆ιεργασία 2’);
up(s3);
end
end;
procedure P3;
begin
while true do begin
down(s3);
writeln(‘∆ιεργασία 3’);
up(s1);
end
end;
begin
s1 := 1; s2 := 0; s3 := 0;
parbegin P1 || P2 || P3 parend
end. @]

----

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

[@program Mhnymata2;
var s1, s2, s3: semaphore;
procedure P1;
begin
while true do begin
P(s1);
writeln(‘∆ιεργασία 1’);
V(s2);
end
end;
procedure P2;
begin
while true do begin
P(s2); V(s1); P(s2);
writeln(‘∆ιεργασία 2’);
V(s3);
end
end;
procedure P3;
begin
while true do begin
P(s3);
writeln(‘∆ιεργασία 3’);
V(s1);
end
end;
begin
s1 := 1; s2 := 0; s3 := 0;
parbegin P1 || P2 || P3 parend
end. @]

Τελευταία ενημέρωση: 24-06-2008 (15:55)

Copyright 2008 - Άρης Φεργάδης