Επικοινωνία μεταξύ Διεργασιών και Σύνδρομες Διεργασίες

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Λειτουργικό Σύστημα (Operating System) 1o μέρος
Advertisements

Τι είναι ο προγραμματισμός
ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΔΙΕΡΓΑΣΙΩΝ
Προγραμματισμός Ι (αποφύγετέ τον!) 3) Διακοπτόμενος βρόχος: (αποφύγετέ τον!) float energy;......while(TRUE){drink_water(); if(energy
7.3.8 Μεταφραστές Ελληνογαλλική Σχολή Καλαμαρί - Τίκβα Χριστίνα.
Εφαρμογές Υπολογιστών Ά Λυκείου Κεφ. 4 Λογισμικό Συστήματος
Λειτουργικά Συστήματα
Νήματα στη Java Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία
Συστήματα εισόδου/εξόδου
Η επιστήμη των υπολογιστών
Λειτουργικά Συστήματα
Λειτουργικά Συστήματα
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ
ΛΟΓΙΣΜΙΚΟ ΣΥΣΤΗΜΑΤΟΣ Κεφάλαιο 4 ο Ελληνογαλλική Σχολή Καλαμαρί - Τίκβα Χριστίνα.
Κεφάλαιο 1ο: ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΤΩΝ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ
Τι είναι ο υπολογιστής; Τι είναι ο προγραμματισμός
Σύστημα Εργαστηριακών Εγγραφών βάσει Προτιμήσεων (ΣΕΕΠ) με τη βοήθεια Εμπείρου Συστήματος Πτυχιακή Εργασία Δημοσθένης Νικούδης (051092) 14/4/2011.
Λογισμικο συστηματοσ Κεφάλαιο 4ο
Κλασσικά Προβλήματα Επικοινωνίας Σύνδρομων Διεργασιών
Κεφάλαιο 6 Threads. 2 Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά.
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
Γλώσσα Προγραμματισμού
Αδιέξοδα (Deadlocks).
ΜΑΘ-3122/106 Προγραμματισμός
29/11/2004Εισαγωγή στο OpenMP1 OpenMP Αθήνα, Νοέμβριος 2004 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
1/12/2003Εισαγωγή στο OpenMP1 OpenMP Αθήνα, Νοέμβριος 2003 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Week 4: Exceptions Εβδομάδα 4: Εξαιρέσεις [Exceptions]
NIKOΛΑΟΣ ΝΤΙΡΛΗΣ 5ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΙΘΟΥΣΑ Β4 1.  Ένα thread έχει: ID, program counter, register set, stack  Μοιράζεται με τα άλλα threads της ίδιας διεργασίας.
5. Αμοιβαίος αποκλεισμός
Νήματα Οι διεργασίες έχουν τα παρακάτω συστατικά:
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
Τι είναι διεργασία Ένα πρόγραμμα σε εκτέλεση Η διεργασία περιλαμβάνει:
Σχεδίαση αλγορίθμων (2ο μέρος)
Διαχείριση μνήμης Υπόβαθρο Εναλλαγή Συνεχής κατανομή Σελιδοποίηση
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Ενότητα Α.4. Δομημένος Προγραμματισμός
Επικοινωνία μεταξύ Διεργασιών και Σύνδρομες Διεργασίες Interprocess Communication and Concurrent Processes.
Πρωτόκολλο αμοιβαίου αποκλεισμού (mutual exclusion) για δύο διεργασίες-CPN Tools Νάνος Λέανδρος 156 Τζιαλαμάνη Βιργινία 166.
Για τη διεκπεραίωση ενός προβλήματος πρέπει να ακολουθηθεί η εξής διαδικασία:  να γραφεί ο αλγόριθμος να συνταχθεί το πρόγραμμα σε γλώσσα υψηλού επιπέδου.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Λειτουργικά Συστήματα
Threads Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά η μία μετά.
Εντολές Επιλογής και Αποφάσεων
Παράλληλη/Κατανεμημένη Επεξεργασία και Εφαρμογές
Εφαρμογές Υπολογιστών Ά Λυκείου Κεφ. 4 Λογισμικό Συστήματος
Διεργασίες.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
Νήματα με την χρήση των Posix Threads (pthreads)‏.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
Λειτουργικά Συστήματα
ΕΙΣΑΓΩΓΉ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΉ ΝΊΚΟΣ ΠΑΠΑΔΆΚΗΣ ΛΟΓΙΣΜΙΚΟ ΤΟΥ ΗΛΕΚΤΡΟΝΙΚΟΥ ΥΠΟΛΟΓΙΣΤΗ.
Διαχείριση Πόρων (1/10) Εισαγωγή στην Πληροφορκή 1 Στα πρώτα χρόνια των υπολογιστών, όπου μόνο ένα πρόγραμμα είχε τη δυνατότητα να βρίσκεται στην κύρια.
Αντικειμενοστραφής Προγραμματισμός Ι
Κατανεμημένα Συστήματα
Συγχρονισμός Διεργασιών
Γνωριμία με το Λογισμικό του Υπολογιστή
Τι είναι διεργασία Ένα πρόγραμμα σε εκτέλεση Η διεργασία περιλαμβάνει:
Κατηγορίες και Προδιαγραφές Λογισμικού Η/Υ (Software)
Ανάπτυξη Μοντέλων Διακριτών Συστημάτων Μέρος Β
Λειτουργικά Συστήματα και Ασφάλεια Πληροφοριακών Συστημάτων ΔΙΕΡΓΑΣΙΕΣ
Το μοντέλο πελάτη - εξυπηρετητή
Διεργασίες Διεργασίες Διαδιεργασιακή Επικοινωνία (IPC)
ΔΙΕΡΓΑΣΙΕΣ.
ΣΥΓΧΡΟΝΑ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Τρίτη Έκδοση ANDREW S
Ιστορική Αναδρομή Λειτουργικών Συστημάτων (ΛΣ) Εισαγωγή : ο πυρήνας (kernel) / ο φλοιός (shell) Β ΕΠΑΛ
Εξαιρέσεις [Exceptions]
Λειτουργικά Συστήματα Αμοιβαίος Αποκλεισμός και Λάθη
Μεταγράφημα παρουσίασης:

Επικοινωνία μεταξύ Διεργασιών και Σύνδρομες Διεργασίες Interprocess Communication and Concurrent Processes

Περίληψη Σύνδρομος Προγραμματισμός Συνθήκη συναγωνισμού Συγχρονισμός διεργασιών Κρίσιμες περιοχές και αμοιβαίος αποκλεισμός Το Πρόβλημα Παραγωγών και Καταναλωτών Λύσεις βασισμένες στο λογισμικό Λύσεις βασισμένες στο υλικό (hardware). Λύσεις με Σηματοφόρους Παρακολουθητές Μηνύματα

Σύνδρομος Προγραμματισμός Σύνδρομος Προγραμματισμός Σύνδρομος Προγραμματισμός (concurrent programming): ταυτόχρονη εκτέλεση δύο ή περισσοτέρων διεργασιών σε ένα σύστημα. Πολυπρογραμματισμός (συνεχής εναλλαγή διεργασιών που εκτελούνται από τον επεξεργαστή) Συστήματα πολλαπλών επεξεργαστών Προβλήματα Επικοινωνία μεταξύ διεργασιών Καταμερισμός πόρων μεταξύ διεργασιών Ανταγωνιζόμενες διεργασίες Συνεργαζόμενες διεργασίες Συγχρονισμός των δραστηριοτήτων μεταξύ διεργασιών Τα προβλήματα εμφανίζονται στους τομείς Πολλαπλών εφαρμογών Δομή εφαρμογών (εφαρμογές δομημένες σαν πολλαπλές διεργασίες ή υποδιεργασίες) Δομή του ΛΣ (εφαρμογή του ΛΣ σαν πολλαπλές διεργασίες)

Σύνδρομες Διεργασίες Το ΛΣ (σε συνεργασία με το υλικό (hardware) του συστήματος) είναι υπεύθυνο για την επίλυση των πιο κάτω προβλημάτων Διαχείριση των εκτελούμενων διεργασιών και κατανομή πόρων Μια διεργασία μπορεί να μην γνωρίζει την ύπαρξη της άλλης και έτσι να ανταγωνίζονται για τον καταμερισμό των πόρων (competition) Μια διεργασία μπορεί να γνωρίζει έμμεσα την ύπαρξη της άλλης (π.χ., ύπαρξη κοινής μνήμης) οπόταν μπορεί να συνεργάζονται (collaborate) Μια διεργασία μπορεί να γνωρίζει άμεσα την ύπαρξη της άλλης (π.χ., έχουν σχεδιαστεί μαζί) οπόταν μπορεί να συνεργάζονται (collaborate). Προστασία του χώρου της μιας διεργασίες από παρεμβολές από άλλες διεργασίες. Παροχή τρόπων επικοινωνίας και συγχρονισμού Ανεξαρτησία αποτελεσμάτων από τη σχετική ταχύτητα εκτέλεσης

Απλό Παράδειγμα Υποθέστε ότι δύο διεργασίες Δ1 και Δ2 χρησιμοποιούν τον ακόλουθο κώδικα για να «ξανατυπώσουν» κάθε χαρακτήρα εισόδου στην έξοδο (οθόνη). void echo() { chIn= getChar(); chOut= chIn; putChar(chOut); } Για εξυπηρέτηση χώρου υπάρχει μόνο ένα αντίγραφο στη μνήμη το οποίο τρέχουν όλες οι διεργασίες. Ποιο το αναμενόμενο αποτέλεσμα του κώδικα;

Απλό Παράδειγμα Υποθέστε ότι οι είσοδος της Δ1 είναι x και την Δ2 y. Βρέστε ένα πιθανό ίχνος void echo() { chIn= getChar(); chOut= chIn; putChar(chOut); } Διεργασία 1 chIn= getChar(); //=x chOut= chIn; //=y putChar(chOut); Διεργασία 2 chIn= getChar(); //=y chOut= chIn; //=y putChar(chOut); Πρόβλημα: Το y τυπώθηκε δύο φορές ενώ το x καμιά.

Συνεργασία Διεργασιών: Παράδειγμα 1 Υποθέστε ότι οι Δ1 και Δ2 έχουν κοινές μεταβλητές a=1 και b=2. Δ1: a= a+b; Δ2: b= a+b; Βρέστε τις τελικές τιμές των μεταβλητών a και b. Διεργασία 1 a= 1+2 =3 Διεργασία 2 b= 3+2= 5 Διεργασία 1 a= 1+3= 4 Διεργασία 2 b= 1+2 =3 Πρόβλημα: Η σειρά με την οποία εκτελούνται οι εντολές επηρεάζει το τελικό αποτέλεσμα (race conditions).

Συνεργασία Διεργασιών: Παράδειγμα 1 Υποθέστε ότι οι Δ1 και Δ2 έχουν κοινές μεταβλητές a=1 και b=1. Βρέστε τις τελικές τιμές των μεταβλητών a και b. Διεργασία 1 a= a+1; b= b+1; Διεργασία 2 b= 2*b; a= 2*a; Δ1 a= 1+1=2 b= 1+1=2 Δ2 b=2*2=4 a=2*2=4 Δ1 a= 1+1=2 b= 2+1=3 Δ2 b=2*1=2 a=2*2=4 Πρόβλημα: Η σειρά με την οποία εκτελούνται οι εντολές επηρεάζει το τελικό αποτέλεσμα (race conditions).

Συνθήκη Συναγωνισμού (Race Conditions) Η σειρά με την οποία θα εκτελεστούν δύο ή περισσότερες εντολές δεν είναι καθορισμένη. Μπορεί να αλλάξει κάτω από συνθήκες μη ελεγχόμενες από τον προγραμματιστή Προγραμματιστικά λάθη αυτής της μορφής είναι πολύ δύσκολα να ανιχνευτούν και να διορθωθούν αφού η συμπεριφορά του προγράμματος μπορεί να αλλάξει από εκτέλεση σε εκτέλεση.

Κρίσιμες Περιοχές και Αμοιβαίος Αποκλεισμός Κρίσιμες περιοχές (critical region): μέρος του προγράμματος στο οποίο επιχειρείται πρόσβαση σε κοινό χώρο, κοινά αρχεία κλπ. Αμοιβαίος Αποκλεισμός (mutual exclusion): Μηχανισμός ο οποίος δεν επιτρέπει την ταυτόχρονη πρόσβαση σε κρίσιμες περιοχές από δύο ή περισσότερες διεργασίες. Για να επιτύχουμε αποδοτικό συντονισμό μεταξύ παράλληλων διεργασιών οι ακόλουθες συνθήκες πρέπει να ισχύουν Δεν πρέπει να βρίσκονται ταυτόχρονα σε κρίσιμη περιοχή περισσότερες από μία διεργασίες. Το αποτέλεσμα πρέπει να είναι ανεξάρτητο από τη ταχύτητα των επεξεργαστών ή τον καταμερισμό του χρόνου του επεξεργαστή. Διεργασία που τρέχει εκτός κρίσιμης περιοχής δεν μπορεί να αποκλείσει άλλη διεργασία Καμιά διεργασία δεν πρέπει να μπορεί να αποκλειστεί για πάντα.

Προστασία με Αμοιβαίο Αποκλεισμό Υποθέστε ότι οι Δ1 και Δ2 έχουν κοινές μεταβλητές a=1 και b=1. Διεργασία 1 enterCritical(); a= a+1; b= b+1; exitCritical(); Διεργασία 2 enterCritical; b= 2*b; a= 2*a; exitCritical(); Η εντολή enterCritical() δεν επιτρέπει σε άλλη διεργασία πρόσβαση στον προστατευμένο χώρο. Πρόσβαση επιτρέπεται μόνο μετά την εκτέλεση της exitCritical(). Με αυτό τον τρόπο εγγυούμαστε τη σωστή εκτέλεση Δ1 a= 1+1=2 b= 1+1=2 Δ2 b=2*2=4 a=2*2=4

Πρόβλημα Παραγωγών και Καταναλωτών Υποθέστε ότι n διεργασίες παράγουν (produce) κάποια δεδομένα τα οποία αποθηκεύουν σε μια κυκλική ενδιάμεση μνήμη (ουρά). m διεργασίες καταναλώνουν τα δεδομένα (consume) 1 … j j+1 k k+1 N-1 buf[N] out in array buf[N]; int in, out; /*global variables*/

Πρόβλημα Παραγωγών και Καταναλωτών array buf[N]; int in, out; /*global variables*/ void producer() { while(true) item= produce(); buf[in]= item; in= (in+1)%N; } void consumer() { while(true) item= buf[out]; consume(item); out= (out+1)%N; } Προβλήματα: Τι θα συμβεί αν η διαδικασία consumer() τρέξει όταν το buffer είναι άδειο; Τι θα συμβεί αν η διαδικασία producer() τρέξει όταν το buffer είναι γεμάτο;

Πρόβλημα Παραγωγών και Καταναλωτών array buf[N]; int nBuf=0; /*number of items in buffer*/ int in, out; /*global variables*/ void producer() { while(true) item= produce(); while(nBuf==N); buf[in]= item; in= (in+1)%N; nBuf++; } void consumer() { while(true) while(nBuf==0); item= buf[out]; consume(item); out= (out+1)%N; nBuf--; } Busy Waiting Προβλήματα: συγχρονισμός των διεργασιών

Πρόβλημα Συγχρονισμού void producer() { while(true) item= produce(); while(nBuf==N); buf[in]= item; in= (in+1)%N; nBuf++; } Υποθέστε ότι out= 5 in= 7 nBuf= 2 Producer 1 Buf[7]= item1; in=7+1= 8 nBuf= 3 Producer 2 Buf[7]= item2; in=7+1= 8 nBuf= 3 Υποθέτουμε ότι οι τιμές του in και nBuf αποθηκεύονται σε κάποια τοπική μεταβλητή (καταχωρητή).

Αμοιβαίος Αποκλεισμός (Mutual Exclusion) Κρίσιμη Περιοχή (critical region) Σε κάθε δεδομένη στιγμή, μόνο μια διεργασία μπορεί να βρίσκεται μέσα στην κρίσιμή περιοχή void consumer() { while(true) while(nBuf==0); item= buf[out]; consume(item); out= (out+1)%N; nBuf--; } void producer() { while(true) item= produce(); while(nBuf==N); buf[in]= item; in= (in+1)%N; nBuf++; } Κρίσιμη Περιοχή

Εφαρμογή Αμοιβαίου Αποκλεισμού Υποθέστε πως υπάρχουν μόνο δύο διεργασίες. int turn=0; /*global variable*/ void process0() { … while(turn!=0); /*criticalRegion*/ turn= 1; } void process1() { … while(turn!=1); /*criticalRegion*/ turn= 0; } Ναι! Πετυχαίνεται ο αμοιβαίος αποκλεισμός; Λύθηκε το πρόβλημα; Τι θα συμβεί εάν οι δύο διεργασίες εκτελούν την κρίσιμη περιοχή με διαφορετική συχνότητα; Διεργασία που τρέχει εκτός κρίσιμης περιοχής δεν αφήνει άλλη διεργασία να μπει στη κρίσιμη περιοχή. Όχι!

Εφαρμογή Αμοιβαίου Αποκλεισμού boolean interested[2]; /*global variable*/ void process0() { … while(interested[1]); interested[0]= true; /*criticalRegion*/ interested[0]= false; } void process1() { … while(interested[0]); interested[1]= true; /*criticalRegion*/ interested[1]= false; } Πετυχαίνεται ο αμοιβαίος αποκλεισμός; Η διεργασία 0 εκτελείται μέχρι το while loop, βρίσκει το interested[1]=true και αμέσως διακόπτεται. Η διεργασία 1 μπαίνει κανονικά στη κρίσιμη περιοχή αφού interested[0]=false. Στη συνέχεια μπαίνει και η διεργασία 0 στη κρίσιμη περιοχή. Όχι!

Εφαρμογή Αμοιβαίου Αποκλεισμού Λύση Peterson int turn= 0; boolean interested[2]; /*global variable*/ void process0() { … interested[0]= true; turn= 0; while(turn==0 && interested[1]); /*criticalRegion*/ interested[0]= false; } void process1() { … interested[1]= true; turn= 1; while(turn==1 && interested[0]); /*criticalRegion*/ interested[1]= false; } Πετυχαίνεται ο αμοιβαίος αποκλεισμός με χρήση λογισμικού. Μειονέκτημα: χρήση του busy-waiting

Αμοιβαίος Αποκλεισμός με Υποστήριξη Υλικού (Hardware Support) Ατομική εντολή (atomic instructions): είναι εντολές οι οποίες εκτελούνται μέσα σε ένα μόνο κύκλο του επεξεργαστή έτσι που να μην υπάρχει περίπτωση να διακοπούν από κάποιο σήμα διακοπής boolean testSet(int x) { if(x==0) x=1; return true; } else return false; Ο επεξεργαστής μπορεί να υποστηρίζει μια εντολή η οποία να υλοποιεί τη ρουτίνα testSet() σαν μια μόνο εντολή Παράδειγμα: TSL instruction in Tanenbaum Fig. 2-22.

Αμοιβαίος Αποκλεισμός με Υποστήριξη Υλικού (Hardware Support) int lock= 0; /*global variable*/ int N; /*Number of processes*/ Πετυχαίνεται ο αμοιβαίος αποκλεισμός με την υποστήριξη του υλικού. Μειονεκτήματα: Χρήση του busy-waiting Είναι πιθανή η παρατεταμένη στέρηση (starvation) μιας διεργασίας Υπάρχει η πιθανότητα αδιεξόδου στην περίπτωση που μια διεργασία υψηλότερης προτεραιότητας διακόψει την εκτέλεση διεργασίας που βρίσκεται στη κρίσιμη περιοχή. void process(int i) { while(true) … while(!testSet(lock)); /*criticalRegion*/ lock= 0; }

Σηματοφόροι (Semaphores) struct semaphore { int count; queueType queue; } Οι Σηματοφόροι είναι δομές υλοποιούνται από το πρόγραμμα μεταγλωττισμού (compiler) και οι οποίες υποστηρίζονται από το ΛΣ. void down(semaphore s) { s.count--; if(s.count < 0) addProcess(s.queue); sleep(); } void up(semaphore s) { s.count++; if(s.count <= 0) p= getProcess(s.queue); wakeup(p); } Δυαδικοί σηματοφόροι (binary semaphores – mutex)

Σηματοφόροι (Semaphores) Οι Σηματοφόροι αρχικοποιούνται σε κάποια μη-αρνητική τιμή Η ρουτίνα down() (ή wait()) μειώνει την τιμή κατά 1. Εάν η τιμή δεν είναι αρνητική τότε η διεργασία συνεχίζει κανονικά Εάν η τιμή γίνει αρνητική τότε σταματά η εκτέλεση της διεργασίας Η ρουτίνα up() (ή signal()) αυξάνει την τιμή κατά 1. Εάν η τιμή γίνει μηδέν ή παραμείνει αρνητική τότε μια διεργασία επανανεργοποιείται και γίνεται έτοιμη για εκτέλεση. Οι Δυαδικοί Σηματοφόροι αρχικοποιούνται στη τιμή 0 ή 1 Η ρουτίνα down() (ή wait()) ελέγχει την τιμή. Εάν η τιμή είναι 1, τότε την μετατρέπει σε 0 η διεργασία συνεχίζει κανονικά Εάν η τιμή είναι 0 τότε σταματά η εκτέλεση της διεργασίας Η ρουτίνα up() (ή signal()) Ελέγχει εάν κάποια διεργασία είναι απενεργοποιημένη και την επανανεργοποιεί Εάν δεν υπάρχει απενεργοποιημένη διεργασία μετατρέπει την τιμή σε 1.

Αμοιβαίος Αποκλεισμός με Σηματοφόρους semaphore lock= 1; /*global variable*/ int N; /*Number of processes*/ void process(int i) { while(true) … down(&lock); /*criticalRegion*/ up(&lock); } Πετυχαίνεται ο αμοιβαίος αποκλεισμός με την χρήση σηματοφόρων.

Το Πρόβλημα Παραγωγού-Καταναλωτή με Σηματοφόρους semaphore lock= 1; semaphore empty= N; /*buffer size*/ semaphore full= 0; void producer() { while(true) item= produce(); down(&empty); down(&lock); buf[in]= item; in= (in+1)%N; nBuf++; up(&lock); up(&full); } void consumer() { while(true) down(&full); down(&lock); item= buf[out]; out= (out+1)%N; nBuf--; up(&lock); up(&empty); consume(item); } Κρίσιμη Περιοχή

Αμοιβαίος Αποκλεισμός με Παρακολουθητές (monitors) Πρέπει απαραίτητα να υποστηρίζονται από τη γλώσσα προγραμματισμού Java, Concurrent Pascal, Modula-2 είναι παραδείγματα γλωσσών που υποστηρίζουν τους παρακολουθητές. Αποτελούνται από ένα σύνολο από δομές δεδομένων, μεταβλητές και ρουτίνες. Οι διάφορες διεργασίες έχουν πρόσβαση μόνο στις ρουτίνες αλλά όχι στις μεταβλητές. Αντίστοιχο της κλάσης (class) σε αντικειμενοστραφή προγραμματισμό Μια διεργασία δεν μπορεί να εκτελέσει ρουτίνες του παρατηρητή εάν την δεδομένη στιγμή μια άλλη διεργασία εκτελεί οποιαδήποτε άλλη ρουτίνα Ανά πάσα στιγμή, μόνο μια διεργασία μπορεί να εκτελείται στον παρατηρητή Πετυχαίνεται έτσι αυτόματα ο αμοιβαίος αποκλεισμός

Αμοιβαίος Αποκλεισμός με Παρακολουθητές (monitors) Ο παρακολουθητής διαθέτει ρουτίνες όπως το wait(s) και signal(s) οι οποίες αναστέλλουν και επανενεργοποιούν μια διεργασία βάση της τιμής της μεταβλητής συνθήκης s (condition variable). Σε τελική ανάλυση ο αμοιβαίος αποκλεισμός επιτυγχάνεται με τις τεχνικές που προαναφέρθηκαν (π.χ., σηματοφόρους) το πλεονέκτημα αυτής της μεθόδου είναι ότι την ευθύνη για την υλοποίηση του αμοιβαίου αποκλεισμού την έχει η γλώσσα προγραμματισμού και όχι ο προγραμματιστής. Επόμενος η εφαρμογή του αμοιβαίου αποκλεισμού γίνεται πιο εύκολη και η πιθανότητα προγραμματιστικού λάθους μειώνεται.

Το Πρόβλημα Παραγωγού-Καταναλωτή με Παρακολουθητές void producer() { while(true) item= produce(); PrdCns.insert(item); } monitor PrdCns(int i) { condition full, emplty; int nBuf; void insert(item) if (nBuf==N)wait(full); insert(item); nBuf= nBuf+1; if(nBuf==1) signal(empty); } void remove(item) if (nBuf)==0)wait(empty); remove(item); nBuf= nBuf-1; if(nBuf==N-1)signal(full); void consumer() { while(true) item= PrdCns.remove(); consume(item); }

Ανταλλαγή Μηνυμάτων Τι θα συμβεί σε περίπτωση που έχουμε ένα κατανεμημένο σύστημα με πολλούς επεξεργαστές οι οποίοι επικοινωνούν μέσω δικτύου; ΛΣ υποστηρίζουν την ανταλλαγή μηνυμάτων μέσω συστημικών κλήσεων. send(destination, &message); receive(source, &message); Πολλαπλά προβλήματα Τι θα συμβεί εάν το μήνυμα χαθεί; Τι θα συμβεί εάν χαθεί η επιβεβαίωση λήψης (Acknowledgement΄); Πιστοποίηση ταυτότητας (authentication). Τα προβλήματα αυτά είναι το θέμα του μαθήματος ΗΜΥ 360 Δίκτυα Υπολογιστών

Το Πρόβλημα Παραγωγού-Καταναλωτή με Μηνύματα void consumer() { int item; message m; for(int i=0; i<N; i++) send(producer, &m); while(true) receive(producer, &m); item= getItem(&m); send(producer,&m); consume(item); } void Producer() { int item; message m; while(true) item= produce(); receive(consumer, &m); buildMessage(&m,item); send(consumer,&m); }