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

Σχετικά έγγραφα
Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Διεργασίες (Processes)

Λειτουργικά Συστήματα Η/Υ

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα

Εισαγωγή στα Λειτουργικά Συστήματα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

Αμοιβαίος αποκλεισμός

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

2.3 Επικοινωνία Διεργασιών

Αδιέξοδα (Deadlocks)

ΔΙΕΡΓΑΣΙΕΣ. Λειτουργικά Συστήματα Ι. Διδάσκων: Καθ. Κ. Λαμπρινουδάκης ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι

2.4 Κλασσικά Προβλήματα IPC

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι ΙΕΡΓΑΣΙΕΣ ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΙΕΡΓΑΣΙΕΣ

Μάθημα 4 ο. Κρίσιμα Τμήματα και Αμοιβαίος Αποκλεισμός

Λειτουργικά Συστήματα

Ενότητα 4 (Κεφάλαιο 5) Συντρέχων Προγραμματισμός

ENOTHTA 3 ΣYNTPEXΩN ΠPOΓPAMMATIΣMOΣ

Συγχρονισµός: Αδιέξοδο & Παρατεταµένη Στέρηση

Ε-85: Ειδικά Θέµατα Λογισµικού

ΛΟΓΙΣΜΙΚΟ (software)

Λογισµικό (Software SW) Γλώσσες

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση

Λειτουργικά Συστήματα

Συγχρονισμός Μέρος Α : Κρίσιμο τμήμα και κλειδώματα

Επιτεύγµατα των Λ.Σ.

Θοδωρής Ανδρόνικος Τμήμα Πληροφορικής, Ιόνιο Πανεπιστήμιο

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1


Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

ροµολόγηση Επεξεργαστή

Σύγχρονη επικοινωνία με ανταλλαγή μηνυμάτων (CSP message passing model) Ταυτόχρονος Προγραμματισμός 1

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Λειτουργικά Συστήματα (ΗΥ222)

ΚΕΦΑΛΑΙΟ 9. Ταυτόχρονος προγραμματισμός και νήματα. 9.1 Εισαγωγή

Μηχανισμοί και προγραμματιστικές δομές συγχρονισμού. Προβλήματα συγχρονισμού (και λύσεις)

Επικοινωνία Διεργασιών (ΙnterProcess Communication, IPC)

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΑΔΙΕΡΓΑΣΙΑΚΗ ΕΠΙΚΟΙΝΩΝΙΑ ΣΥΓΧΡΟΝΙΣΜΟΣ

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

Προβλήματα Συγχρονισμού (με ελεγκτή) Ταυτόχρονος Προγραμματισμός 1

Κρίσιμη Περιοχή Υπό Συνθήκη (Conditional Critical Regions) Ταυτόχρονος Προγραμματισμός 1

Σκοπός Μαθήματος. Λειτουργικά Συστήματα Η/Υ. Γενικές Πληροφορίες. Στόχοι Μαθήματος ΚΕΦΑΛΑΙΟ 1 - ΕΙΣΑΓΩΓΗ. Θεωρία: Εργαστήριο: Κεφάλαιο 1 «Εισαγωγή»

Νήµατα. ιεργασίες και νήµατα Υλοποίηση νηµάτων Ελαφριές διεργασίες Αξιοποίηση νηµάτων. Κατανεµηµένα Συστήµατα 10-1

Περιγραφή και Έλεγχος ιεργασιών

Συγχρονισμός & σηματοφόροι. Προγραμματισμός II 1

Εργαστήριο 14. Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t)

Κεφάλαιο 4 Διεργασίες Β Τάξη ΕΠΑΛ

Α. Ερωτήσεις Ανάπτυξης

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

Κεφάλαιο 3: Λειτουργικά Συστήµατα

Κατανεμημένα Συστήματα

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

Λειτουργικά Συστήματα

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA

Κεφάλαιο 3. Διδακτικοί Στόχοι

ιεργασίες και Επεξεργαστές στα Κατανεµηµένων Συστηµάτων

Εισαγωγή στην Πληροφορική

Διάλεξη 8: Πρόβλημα Αμοιβαίου Αποκλεισμού. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

Το μάθημα. Λειτουργικά Συστήματα Πραγματικού Χρόνου Βασικές Έννοιες 6. Ενσωματωμένα Συστήματα (embedded systems) Παραδείγματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Λιβανός Γιώργος Εξάμηνο 2017Β

Χρονοπρογραµµατισµός ιεργασιών (Process Scheduling)

Υλοποίηση Σηματοφόρων

Λειτουργικά Συστήματα Πραγματικού Χρόνου

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

13.2 Παράλληλος Προγραµµατισµός Γλωσσάρι, Σελ. 1

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες»

Παράλληλη Επεξεργασία

Κατανεμημένα Συστήματα: Θεωρία και Προγραμματισμός. Ενότητα # 8: Ταυτοχρονισμός και νήματα Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Αµοιβαίοςαποκλεισµός. Κατανεµηµένα Συστήµατα 03-1

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

CSLab National Technical University of Athens

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1

a = 10; a = k; int a,b,c; a = b = c = 10;

Εισαγωγή στον Προγραμματισμό

Λιβανός Γιώργος Εξάμηνο 2017Β

3.1 Λειτουργικό Σύστηµα. Λειτουργικό Σύστηµα (2) ΚΕΦΑΛΑΙΟ 3: Λειτουργικά Συστήµατα. Ο υπολογιστής σαν σκέτο hardware έχει περιορισµένη χρησιµότητα

ΚΕΦΑΛΑΙΟ 3: Λειτουργικά Συστήµατα

Διαδικασιακός Προγραμματισμός

Λειτουργικά Συστήματα Πραγματικού Χρόνου

Λειτουργικά Συστήματα (Λ/Σ)

Ποια ιδιότητα αϖό τις δύο τελευταίες είναι ϖιο ισχυρή;

Λειτουργικά συστήματα πραγματικού χρόνου

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Ενότητα 2 (Κεφάλαιο 3) Περιγραφή και Έλεγχος Διεργασιών. Περιεχόμενα. Ανάγκη ύπαρξης διεργασιών 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα. Ενότητα # 2: Διεργασίες και Νήματα Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Σύγχρονη επικοινωνία με ανταλλαγή μηνυμάτων (CSP message passing model) Ταυτόχρονος Προγραμματισμός 1

Δομές Δεδομένων & Αλγόριθμοι

Διάλεξη 9: Αλγόριθμοι Αμοιβαίου Αποκλεισμού με τη χρήση μεταβλητών Ανάγνωσης/Εγγραφής. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Λειτουργικά Συστήματα (Λ/Σ)

Εισαγωγή στα Λειτουργικά συστήματα Ι. Καθηγητής Κώστας Αναγνωστόπουλος

Το Πρόβληµα Οµοφωνίας Σύγχρονα Συστήµατα Μεταβίβασης Μηνύµατος Μοντέλο Κατάρρευσης (crash model) Οι διεργασίες µπορούν να σταµατούν να εκτελούνται σε

Transcript:

Επικοινωνία µεταξύ ιεργασιών και Σύνδροµες ιεργασίες Interprocess Communication and Concurrent Processes Περίληψη Σύνδροµος Προγραµµατισµός Συνθήκη συναγωνισµού Συγχρονισµός διεργασιών Κρίσιµες περιοχές και αµοιβαίος αποκλεισµός Το Πρόβληµα Παραγωγών και Καταναλωτών Λύσεις βασισµένες στο λογισµικό Λύσεις βασισµένες στο υλικό (hardware). Λύσεις µε Σηµατοφόρους Παρακολουθητές Μηνύµατα 1

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

Απλό Παράδειγµα Υποθέστε ότι δύο διεργασίες 1 και 2 χρησιµοποιούν τον ακόλουθο κώδικα για να «ξανατυπώσουν» κάθε χαρακτήρα εισόδου στην έξοδο (οθόνη). void echo() chin= getchar(); chout= chin; putchar(chout); Για εξυπηρέτηση χώρου υπάρχει µόνο ένα αντίγραφο στη µνήµη το οποίο τρέχουν όλες οι διεργασίες. Ποιο το αναµενόµενο αποτέλεσµα του κώδικα; Απλό Παράδειγµα Υποθέστε ότι οι είσοδος της 1 είναι x και την 2 y. Βρέστε ένα πιθανό ίχνος ιεργασία 1 chin= getchar(); //=x chout= chin; //=y putchar(chout); void echo() chin= getchar(); chout= chin; putchar(chout); ιεργασία 2 chin= getchar(); //=y chout= chin; //=y putchar(chout); Πρόβληµα: Το y τυπώθηκε δύο φορές ενώ το x καµιά. 3

Συνεργασία ιεργασιών: Παράδειγµα 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. ιεργασία 1 ιεργασία 2 a= a+1; b= 2*b; b= b+1; a= 2*a; Βρέστε τις τελικές τιµές των µεταβλητών a και b. 1 2 1 a= 1+1=2 a= 1+1=2 b= 1+1=2 b=2*2=4 b= 2+1=3 a=2*2=4 Πρόβληµα: Η σειρά µε την οποία εκτελούνται οι εντολές επηρεάζει το τελικό αποτέλεσµα (race conditions). 2 b=2*1=2 a=2*2=4 4

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

Προστασία µε Αµοιβαίο Αποκλεισµό Υποθέστε ότι οι 1 και 2 έχουν κοινές µεταβλητές a=1 και b=1. ιεργασία 1 ιεργασία 2 entercritical(); entercritical; a= a+1; b= 2*b; b= b+1; a= 2*a; exitcritical(); 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) buf[n] 0 1 j j+1 k k+1 N-1 out in array buf[n]; int in, out; /*global variables*/ 6

Πρόβληµα Παραγωγών και Καταναλωτών array buf[n]; int in, out; void producer() item= produce(); buf[in]= item; in= (in+1)%n; /*global variables*/ void consumer() item= buf[out]; consume(item); out= (out+1)%n; Προβλήµατα: Τι θα συµβεί αν η διαδικασία consumer() τρέξει όταν το buffer είναι άδειο; Τι θα συµβεί αν η διαδικασία producer() τρέξει όταν το buffer είναι γεµάτο; Πρόβληµα Παραγωγών και Καταναλωτών array buf[n]; int nbuf=0; int in, out; void producer() item= produce(); while(nbuf==n); buf[in]= item; in= (in+1)%n; nbuf++; /*number of items in buffer*/ /*global variables*/ Busy Waiting void consumer() while(nbuf==0); item= buf[out]; consume(item); out= (out+1)%n; nbuf--; Προβλήµατα: συγχρονισµός των διεργασιών 7

Πρόβληµα Συγχρονισµού void producer() item= produce(); while(nbuf==n); buf[in]= item; in= (in+1)%n; nbuf++; Υποθέτουµε ότι οι τιµές του in και 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 Αµοιβαίος Αποκλεισµός (Mutual Exclusion) Κρίσιµη Περιοχή (critical region) Σε κάθε δεδοµένη στιγµή, µόνο µια διεργασία µπορεί να βρίσκεται µέσα στην κρίσιµή περιοχή void producer() item= produce(); while(nbuf==n); buf[in]= item; in= (in+1)%n; nbuf++; Κρίσιµη Περιοχή void consumer() while(nbuf==0); item= buf[out]; consume(item); out= (out+1)%n; nbuf--; 8

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

Εφαρµογή Αµοιβαίου Αποκλεισµού Λύση Peterson int turn= 0; boolean interested[2]; void process0() interested[0]= true; turn= 0; while(turn==0 && interested[1]); interested[0]= false; /*global variable*/ void process1() interested[1]= true; turn= 1; while(turn==1 && interested[0]); 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. 10

Αµοιβαίος Αποκλεισµός µε Υποστήριξη Υλικού (Hardware Support) int lock= 0; /*global variable*/ int N; /*Number of processes*/ void process(int i) while(!testset(lock)); lock= 0; Πετυχαίνεται ο αµοιβαίος αποκλεισµός µε την υποστήριξη του υλικού. Μειονεκτήµατα: Χρήση του busy-waiting Είναι πιθανή η παρατεταµένη στέρηση (starvation) µιας διεργασίας Υπάρχει η πιθανότητα αδιεξόδου στην περίπτωση που µια διεργασία υψηλότερης προτεραιότητας διακόψει την εκτέλεση διεργασίας που βρίσκεται στη κρίσιµη περιοχή. Σηµατοφόροι (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) 11

Σηµατοφόροι (Semaphores) Οι Σηµατοφόροι αρχικοποιούνται σε κάποια µη-αρνητική τιµή Η ρουτίνα down() (ή wait()) µειώνει την τιµή κατά 1. Εάν η τιµή δεν είναι αρνητική τότε η διεργασία συνεχίζει κανονικά Εάν η τιµή γίνει αρνητική τότε σταµατά η εκτέλεση της διεργασίας Η ρουτίνα up() (ή signal()) αυξάνει την τιµή κατά 1. Εάν η τιµή γίνει µηδέν ή παραµείνει αρνητική τότε µια διεργασία επανανεργοποιείται και γίνεται έτοιµη για εκτέλεση. Οι υαδικοί Σηµατοφόροι αρχικοποιούνται στη τιµή 0 ή 1 Η ρουτίνα down() (ή wait()) ελέγχει την τιµή. Εάν η τιµή είναι 1, τότε την µετατρέπει σε 0 η διεργασία συνεχίζει κανονικά Εάν η τιµή είναι 0 τότε σταµατά η εκτέλεση της διεργασίας Η ρουτίνα up() (ή signal()) Ελέγχει εάν κάποια διεργασία είναι απενεργοποιηµένη και την επανανεργοποιεί Εάν δεν υπάρχει απενεργοποιηµένη διεργασία µετατρέπει την τιµή σε 1. Αµοιβαίος Αποκλεισµός µε Σηµατοφόρους semaphore lock= 1; int N; void process(int i) down(&lock); up(&lock); /*global variable*/ /*Number of processes*/ Πετυχαίνεται ο αµοιβαίος αποκλεισµός µε την χρήση σηµατοφόρων. 12

Το Πρόβληµα Παραγωγού-Καταναλωτή µε Σηµατοφόρους semaphore lock= 1; semaphore empty= N; semaphore full= 0; void producer() item= produce(); down(&empty); down(&lock); buf[in]= item; in= (in+1)%n; nbuf++; up(&lock); up(&full); /*buffer size*/ Κρίσιµη Περιοχή void consumer() down(&full); down(&lock); item= buf[out]; out= (out+1)%n; nbuf--; up(&lock); up(&empty); consume(item); Αµοιβαίος Αποκλεισµός µε Παρακολουθητές (monitors) Παρακολουθητές (monitors) Πρέπει απαραίτητα να υποστηρίζονται από τη γλώσσα προγραµµατισµού Java, Concurrent Pascal, Modula-2 είναι παραδείγµατα γλωσσών που υποστηρίζουν τους παρακολουθητές. Αποτελούνται από ένα σύνολο από δοµές δεδοµένων, µεταβλητές και ρουτίνες. Οι διάφορες διεργασίες έχουν πρόσβαση µόνο στις ρουτίνες αλλά όχι στις µεταβλητές. Αντίστοιχο της κλάσης (class) σε αντικειµενοστραφή προγραµµατισµό Μια διεργασία δεν µπορεί να εκτελέσει ρουτίνες του παρατηρητή εάν την δεδοµένη στιγµή µια άλλη διεργασία εκτελεί οποιαδήποτε άλλη ρουτίνα Ανά πάσα στιγµή, µόνο µια διεργασία µπορεί να εκτελείται στον παρατηρητή Πετυχαίνεται έτσι αυτόµατα ο αµοιβαίος αποκλεισµός 13

Αµοιβαίος Αποκλεισµός µε Παρακολουθητές (monitors) Παρακολουθητές (monitors) Ο παρακολουθητής διαθέτει ρουτίνες όπως το wait(s) και signal(s) οι οποίες αναστέλλουν και επανενεργοποιούν µια διεργασία βάση της τιµής της µεταβλητής συνθήκης s (condition variable). Σε τελική ανάλυση ο αµοιβαίος αποκλεισµός επιτυγχάνεται µε τις τεχνικές που προαναφέρθηκαν (π.χ., σηµατοφόρους) το πλεονέκτηµα αυτής της µεθόδου είναι ότι την ευθύνη για την υλοποίηση του αµοιβαίου αποκλεισµού την έχει η γλώσσα προγραµµατισµού και όχι ο προγραµµατιστής. Επόµενος η εφαρµογή του αµοιβαίου αποκλεισµού γίνεται πιο εύκολη και η πιθανότητα προγραµµατιστικού λάθους µειώνεται. Το Πρόβληµα Παραγωγού-Καταναλωτή µε Παρακολουθητές 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 producer() item= produce(); PrdCns.insert(item); void consumer() item= PrdCns.remove(); consume(item); 14

Ανταλλαγή Μηνυµάτων Τι θα συµβεί σε περίπτωση που έχουµε ένα κατανεµηµένο σύστηµα µε πολλούς επεξεργαστές οι οποίοι επικοινωνούν µέσω δικτύου; ΛΣ υποστηρίζουν την ανταλλαγή µηνυµάτων µέσω συστηµικών κλήσεων. send(destination, &message); receive(source, &message); Πολλαπλά προβλήµατα Τι θα συµβεί εάν το µήνυµα χαθεί; Τι θα συµβεί εάν χαθεί η επιβεβαίωση λήψης (Acknowledgement ); Πιστοποίηση ταυτότητας (authentication). Τα προβλήµατα αυτά είναι το θέµα του µαθήµατος ΗΜΥ 360 ίκτυα Υπολογιστών Το Πρόβληµα Παραγωγού-Καταναλωτή µε Μηνύµατα void Producer() int item; message m; item= produce(); receive(consumer, &m); buildmessage(&m,item); send(consumer,&m); void consumer() int item; message m; for(int i=0; i<n; i++) send(producer, &m); receive(producer, &m); item= getitem(&m); send(producer,&m); consume(item); 15