Mutex vs Semaphore – Skillnaden mellan dem
Nyckelskillnaden mellan Mutex och Semaphore
- Mutex är en låsmekanism, medan Semaphore är en signalmekanism
- Mutex är bara ett objekt, medan Semaphore är ett heltal
- Mutex har ingen undertyp, medan semafor har två typer: räknande semafor och binär semafor.
- Semaphore stöder modifiering av vänta och signaloperationer, medan Mutex endast modifieras av den process som kan begära eller släppa en resurs.
- Semaphore värdet ändras med hjälp av wait () och signal () operationer, å andra sidan är Mutex operationer låsta eller olåsta.

Här har jag analyserat skillnaden mellan Mutex och Semaphore och kommer att grundligt utvärdera deras för- och nackdelar.
Vanliga fakta om Mutex och Semaphore
Med utgångspunkt från min praktik, här är några vanliga fakta om Mutex vs Semaphore:
- Endast en uppgift kan förvärva mutex. Således har en mutex äganderätt, och endast ägaren kan släppa den.
- Skälen till att använda mutex och semafor är olika, kanske på grund av likheten i deras implementering, en mutex skulle kallas binär semafor.
- En mycket känd missuppfattning är att Mutexes och Semaphores är nästan samma, med den enda skillnaden är att en Mutex kan räkna till 1, medan Semaphorekan räkna från 0 till N.
- Det finns alltid osäkerhet mellan binär semafor och mutex. Du kanske hör att en mutex är en binär semafor, vilket inte är korrekt.
Vad är en Semaphore?
En semafor är helt enkelt en variabel som är icke-negativ och delad mellan trådar. En semafor är en signalmekanism, och en tråd som väntar på en semafor kan signaleras av en annan tråd. Den använder två atomoperationer, 1) vänta och 2) signal för processsynkronisering.
A semafor antingen tillåter eller förbjuder åtkomst till resursen, vilket beror på hur den är inställd.
Användning av Semaphore
I fallet med en enda buffert kan vi separera 4 KB bufferten i fyra 1 KB buffertar. Semaphore kan associeras med dessa fyra buffertar. Detta gör att användare och producenter kan arbeta på olika buffertar samtidigt.
Fördelar med Semaphore
I min praktik, här är de viktigaste positiva med att använda semafor:
- Det tillåter mer än en tråd att komma åt den kritiska delen
- Semaphores är maskinoberoende.
- Semaphores implementeras i den maskinoberoende koden för mikrokärnan.
- De tillåter inte att flera processer kommer in i den kritiska delen.
- Eftersom det finns ett fullspäckat vänteschema i semaforen är det aldrig slöseri med processtid och resurser.
- De är maskinoberoende, vilket bör köras i den maskinoberoende koden för mikrokärnan.
- De tillåter flexibel hantering av resurser.
Nackdelar med Semaphores
Här är nackdelarna med semafor som jag har stött på.
- En av de största begränsningarna för en semafor är prioritetsinversion.
- Operativsystemet måste hålla reda på alla samtal för att vänta och signalera semafor.
- Deras användning upprätthålls aldrig, utan endast enligt konvention.
- För att undvika dödlägen i semaforen, väntar och Signal operationer måste utföras i rätt ordning.
- Semaphore programmering är en komplex metod, så det finns chanser att inte uppnå ömsesidig uteslutning.
- Det är inte heller en praktisk metod för storskalig användning eftersom deras användning leder till förlust av modularitet.
- Semaphore är mer benägen för programmeringsfel.
- Det kan orsaka dödläge eller brott mot ömsesidig uteslutning på grund av programmeringsfel.
Vad är Mutex?
Den fullständiga formen av Mutex är Mutual Exclusion Object. Det är en speciell typ av binär semafor som används för att kontrollera åtkomsten till den delade resursen. Den inkluderar en prioritetsärvningsmekanism för att undvika problem med utökad prioritetsinversion. Det gör att nuvarande högre prioriterade uppgifter kan hållas i blockerat tillstånd under kortast möjliga tid. Prioritetsarv korrigerar dock inte prioritetsinversion utan minimerar bara dess effekt.
Användning av Mutex
En mutex ger ömsesidig uteslutning, vilket kan vara antingen producent eller konsument som kan ha nyckeln (mutex) och fortsätta med sitt arbete. Så länge producenten fyller buffert måste användaren vänta och vice versa. I Mutex lock, hela tiden, kan bara en enda tråd fungera med hela bufferten.
Fördelar med Mutex
Från vad jag har observerat, här är de viktigaste fördelarna med Mutex:
- Mutexes är bara enkla lås som erhålls innan du går in i dess kritiska sektion och sedan släpper den.
- Eftersom endast en tråd är i sin kritiska sektion vid varje given tidpunkt, finns det inga tävlingsförhållanden och data förblir alltid konsekventa.
Nackdelar med Mutex
I min praktik har jag identifierat flera nackdelar med Mutex.
- Om en tråd får ett lås och går i viloläge eller om den är förebyggd, kanske den andra tråden inte kan gå framåt. Detta kan leda till svält.
- Det kan inte låsas eller låsas upp från ett annat sammanhang än det som fick det.
- Endast en tråd bör tillåtas i det kritiska avsnittet åt gången.
- Den normala implementeringen kan leda till upptaget vänteläge, vilket slösar bort CPU-tid.
Skillnad mellan Semaphore och Mutex
Baserat på vad jag har lärt mig att arbeta med dem, här är hur Mutexes och Semaphores skiljer sig:
parametrar | Semaphore | mutex |
---|---|---|
Mekanism | Det är en typ av signalmekanism. | Det är en låsmekanism. |
Data typ | Semaphore är en heltalsvariabel. | Mutex är bara ett objekt. |
Ändring | Väntan och signaloperationerna kan modifiera en semafor. | Den ändras endast av den process som kan begära eller släppa en resurs. |
Resurshantering | Om ingen resurs är ledig, kräver processen en resurs som bör utföra en väntaoperation. Den bör vänta tills räkningen av semaforen är större än 0. | Om den är låst måste processen vänta. Processen bör hållas i kö. Detta behöver endast nås när mutex är upplåst. |
Tråd | Du kan ha flera programtrådar. | Du kan ha flera programtrådar i mutex men inte samtidigt. |
Ägande | Värdet kan ändras genom vilken process som helst som släpper eller erhåller resursen. | Objektlåset frigörs endast av processen som har erhållit låset på det. |
Typer | Typer av Semaphore är räknande semafor och binär semafor. | Mutex har inga undertyper. |
Operation | Semaphore värdet ändras med hjälp av vänta () och signal () operation. | Mutex-objektet är låst eller olåst. |
Resurser Beläggning | Den är upptagen om alla resurser används och processen som begär resurs utför wait () operation och blockerar sig själv tills semaforantalet blir >1. | Om objektet redan är låst, väntar processen som begär resurser och köas av systemet innan låset släpps. |
Slutsats
Enligt min erfarenhet är nyckeln till att välja mellan mutexer och semaforer att känna igen deras operativa nyanser. Semaphores är idealiska för komplexa synkroniseringar, medan mutexes är lämpade för enkla ömsesidiga uteslutningar, vilket säkerställer resurssäkerhet i enklare sammanhang.