Mutex versus Semaphore – Verschil daartussen
Belangrijkste verschil tussen Mutex en Semaphore
- Mutex is een vergrendelingsmechanisme, terwijl Semaphore is een signaalmechanisme
- Mutex is slechts een object, terwijl Semaphore is een geheel getal
- Mutex heeft geen subtype, terwijl semafoor twee typen heeft: tellende semafoor en binaire semafoor.
- Semaphore ondersteunt het wijzigen van wacht- en signaalbewerkingen, terwijl Mutex alleen wordt gewijzigd door het proces dat een resource kan aanvragen of vrijgeven.
- Semaphore waarde wordt gewijzigd met behulp van wait() en signal() operaties, aan de andere kant worden Mutex operaties vergrendeld of ontgrendeld.
Hier heb ik het verschil tussen Mutex en Semaphore en zal de voor- en nadelen ervan uitvoerig beoordelen.
Algemene feiten over Mutex en Semaphore
Op basis van mijn praktijk volgen hier enkele veelvoorkomende feiten over Mutex versus Semaphore:
- Slechts één taak kan de mutex verwerven. Een mutex heeft dus eigendom en alleen de eigenaar kan deze vrijgeven.
- De redenen voor het gebruik van mutex en semafoor zijn verschillend, misschien vanwege de gelijkenis in hun implementatie. Een mutex zou binaire semafoor worden genoemd.
- Een zeer bekende misvatting is dat Mutexes en Semaphores zijn bijna hetzelfde, met als enige verschil dat een Mutex tot 1 kan tellen SemaphoreJe kunt van 0 tot N tellen.
- Er is altijd onzekerheid tussen binaire semafoor en mutex. Je hoort misschien dat een mutex een binaire semafoor is, wat niet correct is.
Wat is een Semaphore?
Een seinpaal is gewoon een variabele die niet-negatief is en gedeeld wordt tussen threads. Een semafoor is een signaleringsmechanisme, en een thread die wacht op een semafoor kan gesignaleerd worden door een andere thread. Het gebruikt twee atomaire bewerkingen, 1) wait en 2) signal voor de proces synchronisatie.
A seinpaal staat de toegang tot de bron wel of niet toe, afhankelijk van hoe deze is ingesteld.
gebruik van Semaphore
In het geval van een enkele buffer kunnen we de 4 KB-buffer opsplitsen in vier 1 KB-buffers. Semaphore kunnen worden gekoppeld aan deze vier buffers. Hierdoor kunnen gebruikers en producenten tegelijkertijd aan verschillende buffers werken.
Voordelen Semaphore
In mijn praktijk zijn hier de belangrijkste positieve punten van het gebruik van semafoor:
- Hierdoor heeft meer dan één thread toegang tot de kritieke sectie
- Semaphores zijn machine-onafhankelijk.
- Semaphores worden geïmplementeerd in de machine-onafhankelijke code van de microkernel.
- Ze staan niet toe dat meerdere processen de kritieke sectie binnendringen.
- Omdat er bij semafoor een druk wachtschema bestaat, is er nooit sprake van verspilling van procestijd en middelen.
- Ze zijn machine-onafhankelijk, wat moet worden uitgevoerd in de machine-onafhankelijke code van de microkernel.
- Ze maken een flexibel beheer van middelen mogelijk.
Nadelen van Semaphores
Hier zijn de nadelen van semafoor die ik ben tegengekomen.
- Een van de grootste beperkingen van een semafoor is prioriteitsomkering.
- Het besturingssysteem moet alle oproepen voor wacht- en signaalsemafoor bijhouden.
- Het gebruik ervan wordt nooit afgedwongen, maar alleen volgens afspraak.
- Om patstellingen in de semafoor te voorkomen, zijn de wacht- en Signal Bewerkingen moeten in de juiste volgorde worden uitgevoerd.
- Semaphore programmeren is een complexe methode, waardoor er een kans is dat er geen sprake is van wederzijdse uitsluiting.
- Het is ook geen praktische methode voor grootschalig gebruik, aangezien het gebruik ervan leidt tot verlies aan modulariteit.
- Semaphore is gevoeliger voor programmeerfouten.
- Het kan veroorzaken: impasse of schending van wederzijdse uitsluiting als gevolg van een programmeerfout.
Wat is Mutex?
De volledige vorm van Mutex is Mutual Exclusion Object. Het is een speciaal type binaire semafoor dat wordt gebruikt voor het controleren van de toegang tot de gedeelde bron. Het omvat een mechanisme voor prioriteitsovererving om uitgebreide problemen met prioriteitsinversie te voorkomen. Hiermee kunnen huidige taken met een hogere prioriteit zo kort mogelijk in de geblokkeerde status worden gehouden. Prioriteitsovererving corrigeert echter niet de prioriteitsinversie, maar minimaliseert alleen het effect ervan.
Gebruik van Mutex
Een mutex biedt wederzijdse uitsluiting, wat zowel een producer als een consumer kan zijn die de sleutel (mutex) kan hebben en door kan gaan met hun werk. Zolang de producer de buffer vult, moet de gebruiker wachten, en vice versa. In Mutex lock kan altijd maar één thread met de hele buffer werken.
Voordelen van Mutex
Van wat ik heb waargenomen, zijn hier de belangrijkste voordelen van Mutex:
- Mutexes zijn slechts eenvoudige sloten die worden verkregen voordat ze de kritieke sectie binnengaan en deze vervolgens loslaten.
- Omdat zich op elk moment slechts één thread in de kritieke sectie bevindt, zijn er geen racecondities en blijven de gegevens altijd consistent.
Nadelen van Mutex
In mijn praktijk heb ik verschillende nadelen van Mutex geïdentificeerd.
- Als een thread wordt vergrendeld en in de slaapstand gaat, of als deze wordt ondermijnd, kan de andere thread mogelijk niet verder gaan. Dit kan tot hongersnood leiden.
- Het kan niet worden vergrendeld of ontgrendeld vanuit een andere context dan degene waarin het is verkregen.
- Er mag slechts één thread tegelijk in de kritieke sectie worden toegestaan.
- De normale implementatie kan leiden tot een drukke wachtstatus, waardoor CPU-tijd wordt verspild.
Verschil tussen Semaphore en Mutex
Gebaseerd op wat ik heb geleerd door met hen te werken, is hier hoe Mutexes en Semaphores verschillen:
parameters | Semaphore | mutex |
---|---|---|
Mechanisme | Het is een soort signaalmechanisme. | Het is een vergrendelingsmechanisme. |
Data type | Semaphore is een geheeltallige variabele. | Mutex is slechts een object. |
Wijziging | De wacht- en signaalbewerkingen kunnen een semafoor wijzigen. | Het wordt alleen gewijzigd door het proces dat een hulpbron kan aanvragen of vrijgeven. |
resource management | Als er geen resource vrij is, dan vereist het proces een resource die de wait-bewerking moet uitvoeren. Het moet wachten tot de telling van de semafoor groter is dan 0. | Als het vergrendeld is, moet het proces wachten. Het proces moet in een wachtrij worden gehouden. Dit is alleen toegankelijk als de mutex ontgrendeld is. |
Draad | U kunt meerdere programmathreads hebben. | U kunt meerdere programmathreads in mutex hebben, maar niet tegelijkertijd. |
Eigendom | De waarde kan worden gewijzigd door elk proces dat de hulpbron vrijgeeft of verkrijgt. | Objectvergrendeling wordt alleen vrijgegeven door het proces dat de vergrendeling ervan heeft verkregen. |
Types | Types van Semaphore tellen semafoor en binaire semafoor. | Mutex heeft geen subtypen. |
Werking | Semaphore waarde wordt gewijzigd met behulp van de wait() en signal() bewerking. | Mutex-object is vergrendeld of ontgrendeld. |
Bezetting van hulpbronnen | Deze is bezet als alle bronnen worden gebruikt en het proces dat de bron aanvraagt de wait()-bewerking uitvoert en zichzelf blokkeert totdat het aantal semaforen >1 is. | Als het object al is vergrendeld, wacht het proces dat om bronnen vraagt, en wordt het door het systeem in de wachtrij geplaatst voordat de vergrendeling wordt opgeheven. |
Conclusie
In mijn ervaring is de sleutel tot het maken van een keuze tussen mutexen en semaforen het herkennen van hun operationele nuances. SemaphoreMutexes zijn ideaal voor complexe synchronisaties, terwijl mutexen geschikt zijn voor eenvoudige wederzijdse uitsluitingen, waardoor de veiligheid van bronnen in eenvoudigere contexten wordt gewaarborgd.