6.Σεμαφόροι

            Ο προσομοιωτής αυτός περιγράφει πως οι σεμαφόροι μπορούν να λύσουν το πρόβλημα του αμοιβαίου αποκλεισμού.

                Η λειτουργία του προσομοιωτή είναι χωρισμένη σε λογικά βήματα.

                Ο προσομοιωτής χωρίζεται στα εξής βήματα τα οποία ο χρήστης προκαλεί σειριακά επιλέγοντας  το πλήκτρο  .

·         Η διεργασία Α ξεκινά να εκτελείται

·         Η διεργασία Α εκτελεί την εντολή wait(mutex)

·         Η τιμή του mutex μειώνεται κατά 1

·         Γίνεται σύγκριση ώστε να αποφασιστεί αν κάποια διεργασία είναι ήδη στην κρίσιμη περιοχή της

·         Η δοκιμή αποτυγχάνει, και η wait(mutex) τερματίζει

·         Η διεργασία Α επιτρέπεται να εισέλθει στην κρίσιμη περιοχή της

·         Αλλαγή περιεχομένου από το δρομολογητή της CPU, αρχίζει η εκτέλεση της διεργασίας Β

·         Η διεργασία Β εκτελεί την εντολή wait(mutex)

·         Η τιμή του mutex μειώνεται κατά 1

·         Γίνεται σύγκριση ώστε να αποφασιστεί αν κάποια διεργασία είναι ήδη στην κρίσιμη περιοχή της

·         Ο έλεγχος επιτυγχάνει, η διεργασία Β προστίθεται στην λίστα Mutex

·         Η διεργασία Β μπλοκάρεται

·         Αλλαγή περιεχομένου από το δρομολογητή της CPU, αρχίζει η εκτέλεση της διεργασίας C

·         Η διεργασία C εκτελεί την εντολή wait(mutex)

·         Η τιμή του mutex μειώνεται κατά 1

·         Γίνεται σύγκριση ώστε να αποφασιστεί αν κάποια διεργασία είναι ήδη στην κρίσιμη περιοχή της

·         Ο έλεγχος επιτυγχάνει, η διεργασία C προστίθεται στην λίστα Mutex

·         Η διεργασία C μπλοκάρεται

·         Αλλαγή περιεχομένου από το δρομολογητή της CPU, συνεχίζει η εκτέλεση της διεργασίας Α

·         Η διεργασία Α αποχωρεί από την κρίσιμη περιοχή της, και εκτελεί την εντολή signal(mutex)

·         Η τιμή του mutex αυξάνεται κατά 1

·         Γίνεται έλεγχος για το αν υπάρχει διεργασία που να περιμένει στη λίστα Mutex

·         Ο έλεγχος επιστρέφει ναι, και η πρώτη διεργασία στην λίστα Mutex αφαιρείται και ξυπνά

·         Αλλαγή περιεχομένου από το δρομολογητή της CPU, συνεχίζεται η εκτέλεση της διεργασίας Β η οποία εισέρχεται στην κρίσιμη περιοχή της

·         Η διεργασία Β αποχωρεί από την κρίσιμη περιοχή της, και εκτελεί την εντολή signal(mutex)

·         Η τιμή του mutex αυξάνεται κατά 1

·         Γίνεται έλεγχος για το αν υπάρχει διεργασία που να περιμένει στη λίστα Mutex

·         Ο έλεγχος επιστρέφει ναι, και η πρώτη διεργασία στην λίστα Mutex αφαιρείται και ξυπνά

·         Αλλαγή περιεχομένου από το δρομολογητή της CPU, συνεχίζει η εκτέλεση της διεργασίας C

·         Η διεργασία C αποχωρεί από την κρίσιμη περιοχή της, και εκτελεί την εντολή signal(mutex)

·         Η τιμή του mutex αυξάνεται κατά 1

·         Γίνεται έλεγχος για το αν υπάρχει διεργασία που να περιμένει στη λίστα Mutex

·         O έλεγχος επιστρέφει αρνητικό, συνεπώς δεν υπάρχουν άλλες διεργασίες που περιμένουν στη λίστα Mutex

·         Η διεργασία C συνεχίζει με το υπόλοιπο του κώδικά της.

 

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