Mutex versus semaphore: wederzijdse uitsluiting en synchronisatie vergeleken

Een mutex beschermt een kritieke sectie, zodat slechts één thread tegelijk een gedeelde resource gebruikt. De thread die de mutex vergrendelt, moet hem ook weer ontgrendelen. Een semafoor is een teller die bepaalt hoeveel threads tegelijk een beperkte resource gebruiken, en hij kan ook worden gebruikt om een gebeurtenis van de ene thread aan de andere te melden. Een mutex draait om eigendom en uitsluiting, een semafoor om tellen en signaleren.

KenmerkMutexSemafoor
DoelWederzijdse uitsluiting. Slechts één thread tegelijk in de kritieke sectieTellen. Toegang tot een pool van N resources beperken of gebeurtenissen tussen threads signaleren
WaardeVergrendeld of ontgrendeld (binair)Een geheel getal van 0 of meer (een semafoor die alleen 0 of 1 is, heet een binaire semafoor)
EigenaarEigendom van de thread die vergrendelt, en die thread hoort te ontgrendelenGeen eigenaar. Elke thread kan posten of signaleren
BewerkingenLock en unlockWait (P, verlagen) en post (V, verhogen)
Signalering tussen threadsNiet bedoeld daarvoorMogelijk. Bijvoorbeeld een producent die een consument waarschuwt
PrioriteitsinversieVaak te vermijden met prioriteitsoverervingMeestal niet ondersteund
Belangrijkste toepassingenGedeelde datastructuren zoals lijsten en tellers beschermenHet aantal verbindingen in een pool beperken, producent-consumentbuffers met beperkte capaciteit, een taak waarschuwen vanuit een interrupt handler
Veelvoorkomende valkuilenDeadlock door inconsistente lockvolgorde, vergeten te ontgrendelenGemiste signalen en deadlock door een onjuiste teller

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Mutex
Wanneer meerdere threads dezelfde data aanraken en slechts één tegelijk is toegestaan.
Semafoor
Wanneer het aantal threads dat een resource gebruikt moet worden beperkt, of wanneer een thread moet worden gewekt als er iets gebeurt.

Veelgestelde vragen

Is een mutex hetzelfde als een binaire semafoor?

Nee. Beide hebben twee toestanden, maar een mutex heeft een eigenaar die hem moet ontgrendelen en ondersteunt vaak prioriteitsovererving. Een semafoor heeft geen eigenaar en elke thread kan signaleren.

Wanneer is een tellende semafoor nodig?

Wanneer het aantal threads dat een resource gebruikt moet worden beperkt, bijvoorbeeld bij een pool van N verbindingen, of wanneer het aantal beschikbare elementen in een producent-consumentbuffer moet worden bijgehouden.

Wat is een deadlock?

Een toestand waarin threads eeuwig op elkaar wachten. Bijvoorbeeld thread A houdt lock 1 vast en wacht op lock 2, terwijl thread B lock 2 vasthoudt en op lock 1 wacht. Het is te voorkomen door locks altijd in dezelfde volgorde te nemen.

Wat is het verschil tussen een spinlock en een mutex?

Een spinlock wacht met busy waiting en past bij zeer korte wachttijden op multicore-systemen. Een mutex laat de wachtende thread slapen en past bij langere wachttijden.

Test uw begrip

Welke vergelijking van een mutex (slapende lock) en een spinlock is juist?

  1. AEen mutex geeft tijdens het wachten de CPU vrij en is geschikt voor lange wachttijden, maar slapen en wakker worden kost werk van het besturingssysteem
  2. BEen mutex blijft ook tijdens het wachten CPU-tijd gebruiken en is dus alleen voor korte wachttijden bruikbaar
  3. CMutex en spinlock zijn hetzelfde en verschillen alleen in naam
Antwoord en toelichting tonen

Antwoord: A. Een mutex geeft tijdens het wachten de CPU vrij en is geschikt voor lange wachttijden, maar slapen en wakker worden kost werk van het besturingssysteem

Als een mutex niet kan worden genomen, zet hij de thread in een wachttoestand, laat de CPU aan andere threads en wekt het besturingssysteem de thread wanneer de lock wordt vrijgegeven. Omdat er geen CPU-tijd wordt verspild tijdens het wachten, is hij geschikt voor lange wachttijden, maar het slapen, wakker worden en de contextwisseling kosten enkele microseconden. Mutexen in echte bibliotheken combineren de voordelen van beide, bijvoorbeeld door eerst even te spinnen en dan te slapen.

Wat is het meest passende gebruik van een tellende semafoor?

  1. ADe waarde van een variabele altijd verdubbelen
  2. BDe uitvoering van het programma bundelen in één thread
  3. CEen resource met een vast aantal gelijktijdige gebruikers (bijvoorbeeld maximaal 4 verbindingen) door maximaal 4 threads tegelijk laten gebruiken
Antwoord en toelichting tonen

Antwoord: C. Een resource met een vast aantal gelijktijdige gebruikers (bijvoorbeeld maximaal 4 verbindingen) door maximaal 4 threads tegelijk laten gebruiken

Een semafoor heeft een teller voor het resterende aantal, verlaagt die vóór gebruik met 1 (bij 0 wordt gewacht tot hij toeneemt) en verhoogt hem na gebruik met 1. Bij beginwaarde 4 kunnen maximaal 4 threads tegelijk de resource gebruiken. Bij beginwaarde 1 kan hij als lock voor uitsluiting dienen. Wachtende threads worden gewoonlijk door het besturingssysteem in slaap gebracht en gewekt.

Welke uitleg over een spinlock is juist?

  1. AEen lock waarbij de thread slaapt en door het besturingssysteem wordt gewekt tot de lock vrij is
  2. BEen lock waarbij wordt gewacht door in een lus voortdurend de lockvariabele te controleren tot de lock vrij is
  3. CEen mechanisme waarbij een schijf wordt rondgedraaid om gegevens te beschermen
Antwoord en toelichting tonen

Antwoord: B. Een lock waarbij wordt gewacht door in een lus voortdurend de lockvariabele te controleren tot de lock vrij is

Een spinlock probeert met een atomaire instructie de lock te nemen en probeert het, als dat niet lukt, direct opnieuw. Omdat de moeite van het besturingssysteem aanroepen om te slapen en te ontwaken ontbreekt, werkt het snel wanneer de lock zeer kort wordt vastgehouden. Het wordt veel gebruikt in de kernel van het besturingssysteem en voor uitsluiting met interrupthandlers. Het nadeel is dat tijdens het wachten ook CPU-tijd wordt gebruikt.

  1. Welk voorbeeld van een deadlock is juist?
  2. Welke eigenschap van een lees-schrijflock (reader-writer lock) is juist?
  3. Waarom wordt bij een conditievariabele, wanneer wordt gewacht tot de wachtrij niet meer leeg is, na het ontwaken de voorwaarde opnieuw gecontroleerd met een while-lus in plaats van een if-opdracht?

Oefenvragen over Multicore en synchronisatie

Belangrijke termen uitgelegd

Mutex
Lock die slechts door één thread tegelijk kan worden vastgehouden. Gangbare implementatie: een thread die de lock niet kan krijgen gaat slapen en geeft de CPU af, en het besturingssysteem wekt hem wanneer de lock vrijkomt.
Semafoor
Synchronisatiemechanisme met een teller voor het resterende aantal. Vóór gebruik wordt 1 afgetrokken (bij 0 wordt gewacht) en na gebruik 1 opgeteld. Wordt gebruikt voor het beheer van middelen waarvan er een vast aantal tegelijk gebruikt kan worden.
Spinlock
Lock waarbij wordt gewacht door in een lus de lockvariabele te blijven controleren tot de lock vrij is. Snel als de wachttijd kort is, maar de CPU blijft ook tijdens het wachten in gebruik.
Deadlock
Toestand waarin meerdere threads elk een resource vasthouden en wachten op resources van de andere threads, zodat niemand verder kan. Wordt voorkomen door een globale volgorde voor het nemen van locks af te spreken.

Verwante vergelijkingen