Mutex vs Semaphore – Διαφορά μεταξύ τους
Βασική διαφορά μεταξύ Mutex και Semaphore
- Το Mutex είναι ένας μηχανισμός κλειδώματος, ενώ Semaphore είναι ένας μηχανισμός σηματοδότησης
- Το Mutex είναι απλώς ένα αντικείμενο, ενώ Semaphore είναι ένας ακέραιος αριθμός
- Το Mutex δεν έχει υποτύπο, ενώ ο σηματοφόρος έχει δύο τύπους: τον σηματοφόρο μέτρησης και τον δυαδικό σηματοφόρο.
- Semaphore υποστηρίζει την τροποποίηση λειτουργιών αναμονής και σήματος, ενώ το Mutex τροποποιείται μόνο από τη διαδικασία που μπορεί να ζητήσει ή να απελευθερώσει έναν πόρο.
- Semaphore Η τιμή τροποποιείται χρησιμοποιώντας τις λειτουργίες αναμονής () και σήματος (), από την άλλη πλευρά, οι λειτουργίες Mutex κλειδώνονται ή ξεκλειδώνονται.

Εδώ, έχω αναλύσει τη διαφορά μεταξύ Mutex και Semaphore και θα αξιολογήσει διεξοδικά τα πλεονεκτήματα και τα μειονεκτήματά τους.
Κοινά γεγονότα για το Mutex και Semaphore
Αντλώντας από την πρακτική μου, εδώ είναι μερικά κοινά γεγονότα σχετικά με το Mutex vs Semaphore:
- Μόνο μια εργασία μπορεί να αποκτήσει το mutex. Έτσι, ένα mutex έχει ιδιοκτησία και μόνο ο ιδιοκτήτης μπορεί να το απελευθερώσει.
- Οι λόγοι για τη χρήση του mutex και του σηματοφόρου είναι διαφορετικοί, ίσως λόγω της ομοιότητας στην εφαρμογή τους, ένα mutex θα αναφέρεται ως δυαδικός σηματοφόρος.
- Μια πολύ γνωστή παρανόηση είναι ότι οι Mutexes και Semaphores είναι σχεδόν ίδια, με τη μόνη διαφορά ότι ένα Mutex μπορεί να μετρήσει μέχρι το 1, ενώ Semaphoreμπορεί να μετρήσει από το 0 έως το Ν.
- Υπάρχει πάντα αβεβαιότητα μεταξύ δυαδικού σηματοφόρου και mutex. Μπορεί να ακούσετε ότι το mutex είναι ένας δυαδικός σηματοφόρος, κάτι που δεν είναι σωστό.
Τι είναι ένα Semaphore?
Ένας σηματοφόρος είναι απλώς μια μεταβλητή που δεν είναι αρνητική και μοιράζεται μεταξύ των νημάτων. Ένας σηματοφόρος είναι ένας μηχανισμός σηματοδότησης και ένα νήμα που περιμένει σε έναν σηματοφόρο μπορεί να σηματοδοτηθεί από ένα άλλο νήμα. Χρησιμοποιεί δύο ατομικές λειτουργίες, 1) αναμονή και 2) σήμα για το συγχρονισμός διαδικασίας.
A σηματοφόρος είτε επιτρέπει είτε δεν επιτρέπει την πρόσβαση στον πόρο, κάτι που εξαρτάται από τον τρόπο ρύθμισης του.
Χρήση του Semaphore
Στην περίπτωση ενός μεμονωμένου buffer, μπορούμε να διαχωρίσουμε το buffer 4 KB σε τέσσερις buffer του 1 KB. Semaphore μπορεί να συσχετιστεί με αυτά τα τέσσερα buffer. Αυτό επιτρέπει στους χρήστες και τους παραγωγούς να εργάζονται σε διαφορετικά buffer ταυτόχρονα.
Πλεονεκτήματα της Semaphore
Στην πρακτική μου, εδώ είναι τα βασικά θετικά της χρήσης σηματοφόρου:
- Επιτρέπει σε περισσότερα από ένα νήμα την πρόσβαση στο κρίσιμο τμήμα
- Semaphoreείναι ανεξάρτητα από μηχανή.
- Semaphores υλοποιούνται στον ανεξάρτητο από μηχανή κώδικα του μικροπυρήνα.
- Δεν επιτρέπουν την είσοδο πολλαπλών διεργασιών στο κρίσιμο τμήμα.
- Καθώς υπάρχει ένα πολυάσχολο πρόγραμμα αναμονής στο σηματοφόρο, δεν υπάρχει ποτέ σπατάλη χρόνου και πόρων της διαδικασίας.
- Είναι ανεξάρτητα από μηχανή, τα οποία θα πρέπει να εκτελούνται στον ανεξάρτητο από μηχανή κώδικα του μικροπυρήνα.
- Επιτρέπουν την ευέλικτη διαχείριση των πόρων.
Μειονεκτήματα του Semaphores
Εδώ είναι τα μειονεκτήματα του σηματοφόρου που έχω συναντήσει.
- Ένας από τους μεγαλύτερους περιορισμούς ενός σηματοφόρου είναι η αντιστροφή προτεραιότητας.
- Το λειτουργικό σύστημα πρέπει να παρακολουθεί όλες τις κλήσεις για αναμονή και σηματοδότηση σηματοφόρου.
- Η χρήση τους δεν επιβάλλεται ποτέ, αλλά γίνεται μόνο με σύμβαση.
- Προκειμένου να αποφευχθούν αδιέξοδα στο σηματοφόρο, το Wait και Signal οι λειτουργίες πρέπει να εκτελούνται με τη σωστή σειρά.
- Semaphore Ο προγραμματισμός είναι μια πολύπλοκη μέθοδος, επομένως υπάρχουν πιθανότητες να μην επιτευχθεί αμοιβαίος αποκλεισμός.
- Δεν είναι επίσης μια πρακτική μέθοδος για χρήση σε μεγάλη κλίμακα καθώς η χρήση τους οδηγεί σε απώλεια της αρθρωτής ικανότητας.
- Semaphore είναι πιο επιρρεπής σε σφάλματα προγραμματιστή.
- Μπορεί να προκαλέσει αδιέξοδο ή παραβίαση αμοιβαίου αποκλεισμού λόγω σφάλματος προγραμματιστή.
Τι είναι το Mutex;
Η πλήρης μορφή του Mutex είναι Αντικείμενο Αμοιβαίας Εξαίρεσης. Είναι ένας ειδικός τύπος δυαδικού σηματοφόρου που χρησιμοποιείται για τον έλεγχο της πρόσβασης στον κοινόχρηστο πόρο. Περιλαμβάνει έναν μηχανισμό κληρονομικότητας προτεραιότητας για την αποφυγή προβλημάτων αντιστροφής εκτεταμένης προτεραιότητας. Επιτρέπει τις τρέχουσες εργασίες υψηλότερης προτεραιότητας να διατηρούνται σε κατάσταση αποκλεισμού για το συντομότερο δυνατό χρονικό διάστημα. Ωστόσο, η κληρονομικότητα προτεραιότητας δεν διορθώνει την αντιστροφή προτεραιότητας, αλλά ελαχιστοποιεί μόνο την επίδρασή της.
Χρήση Mutex
Ένα mutex παρέχει αμοιβαίο αποκλεισμό, ο οποίος μπορεί να είναι είτε παραγωγός είτε καταναλωτής που μπορεί να έχει το κλειδί (mutex) και να προχωρήσει στην εργασία του. Όσο ο παραγωγός γεμίζει buffer, ο χρήστης πρέπει να περιμένει και το αντίστροφο. Στο κλείδωμα Mutex, όλη την ώρα, μόνο ένα νήμα μπορεί να λειτουργήσει με ολόκληρο το buffer.
Πλεονεκτήματα του Mutex
Από ό,τι έχω παρατηρήσει, εδώ είναι τα βασικά οφέλη του Mutex:
- Τα Mutexes είναι απλώς απλές κλειδαριές που λαμβάνονται πριν εισέλθετε στο κρίσιμο τμήμα του και στη συνέχεια το απελευθερώσετε.
- Δεδομένου ότι μόνο ένα νήμα βρίσκεται στο κρίσιμο τμήμα του ανά πάσα στιγμή, δεν υπάρχουν συνθήκες αγώνα και τα δεδομένα παραμένουν πάντα συνεπή.
Μειονεκτήματα του Mutex
Στην πρακτική μου, έχω εντοπίσει πολλά μειονεκτήματα του Mutex.
- Εάν ένα νήμα αποκτήσει κλειδαριά και πάει για ύπνο ή είναι προκαταρκτικό, τότε το άλλο νήμα μπορεί να μην μπορεί να προχωρήσει προς τα εμπρός. Αυτό μπορεί να οδηγήσει σε πείνα.
- Δεν μπορεί να κλειδωθεί ή να ξεκλειδωθεί από διαφορετικό πλαίσιο από αυτό που το απέκτησε.
- Μόνο ένα νήμα πρέπει να επιτρέπεται στο κρίσιμο τμήμα κάθε φορά.
- Η κανονική υλοποίηση μπορεί να οδηγήσει σε κατάσταση αναμονής απασχολημένης, η οποία σπαταλά χρόνο CPU.
Διαφορά μεταξύ Semaphore και Mutex
Με βάση αυτά που έχω μάθει δουλεύοντας μαζί τους, δείτε πώς τα Mutexes και Semaphoreδιαφέρουν:
παράμετροι | Semaphore | Mutex |
---|---|---|
Μηχανισμός | Είναι ένας τύπος μηχανισμού σηματοδότησης. | Είναι μηχανισμός κλειδώματος. |
Τύπος δεδομένων | Semaphore είναι μια ακέραια μεταβλητή. | Το Mutex είναι απλώς ένα αντικείμενο. |
Τροποποίηση | Οι λειτουργίες αναμονής και σήματος μπορούν να τροποποιήσουν έναν σηματοφόρο. | Τροποποιείται μόνο από τη διαδικασία που μπορεί να ζητήσει ή να αποδεσμεύσει έναν πόρο. |
Διαχείριση πόρων | Εάν κανένας πόρος δεν είναι ελεύθερος, τότε η διαδικασία απαιτεί έναν πόρο που θα πρέπει να εκτελέσει τη λειτουργία αναμονής. Θα πρέπει να περιμένει έως ότου η καταμέτρηση του σηματοφόρου είναι μεγαλύτερη από 0. | Εάν είναι κλειδωμένο, η διαδικασία πρέπει να περιμένει. Η διαδικασία πρέπει να κρατηθεί σε ουρά. Αυτό χρειάζεται πρόσβαση μόνο όταν το mutex είναι ξεκλείδωτο. |
Νήμα | Μπορείτε να έχετε πολλά νήματα προγράμματος. | Μπορείτε να έχετε πολλά νήματα προγράμματος στο mutex αλλά όχι ταυτόχρονα. |
Ιδιοκτησία | Η τιμή μπορεί να αλλάξει με οποιαδήποτε διαδικασία που απελευθερώνει ή αποκτά τον πόρο. | Το κλείδωμα αντικειμένου απελευθερώνεται μόνο από τη διαδικασία, η οποία έχει αποκτήσει το κλείδωμα σε αυτό. |
Τύποι | Τύποι Semaphore μετρούν σηματοφόρο και δυαδικό σηματοφόρο. | Το Mutex δεν έχει υποτύπους. |
Operaσμού | Semaphore Η τιμή τροποποιείται χρησιμοποιώντας τη λειτουργία αναμονής () και σήματος (). | Το αντικείμενο Mutex είναι κλειδωμένο ή ξεκλείδωτο. |
Κατάληψη πόρων | Είναι κατειλημμένο εάν χρησιμοποιούνται όλοι οι πόροι και η διαδικασία που ζητά πόρο εκτελεί τη λειτουργία αναμονής () και μπλοκάρεται έως ότου ο αριθμός σηματοφόρων γίνει >1. | Σε περίπτωση που το αντικείμενο είναι ήδη κλειδωμένο, η διαδικασία που ζητά πόρους περιμένει και βρίσκεται σε ουρά από το σύστημα πριν απελευθερωθεί το κλείδωμα. |
Συμπέρασμα
Από την εμπειρία μου, το κλειδί για την επιλογή μεταξύ mutexes και σηματοφόρων είναι η αναγνώριση των λειτουργικών τους αποχρώσεων. SemaphoreΤα s είναι ιδανικά για πολύπλοκους συγχρονισμούς, ενώ τα mutexes είναι κατάλληλα για απλούς αμοιβαίους αποκλεισμούς, διασφαλίζοντας την ασφάλεια των πόρων σε πιο απλά περιβάλλοντα.