Mutex vs Semaphore - Forskellen mellem dem
Nøgleforskel mellem Mutex og Semaphore
- Mutex er en låsemekanisme, hvorimod Semaphore er en signaleringsmekanisme
- Mutex er kun et objekt, mens Semaphore er et heltal
- Mutex har ingen undertype, hvorimod semafor har to typer: tælle semafor og binær semafor.
- Semaphore understøtter modifikation af vente- og signaloperationer, hvorimod Mutex kun modificeres af den proces, der kan anmode om eller frigive en ressource.
- Semaphore værdien ændres ved hjælp af vente () og signal () operationer, på den anden side er Mutex operationer låst eller ulåst.
Her har jeg analyseret forskellen mellem Mutex og Semaphore og vil grundigt evaluere deres fordele og ulemper.
Fælles fakta om Mutex og Semaphore
Med udgangspunkt i min praksis er her et par almindelige fakta om Mutex vs Semaphore:
- Kun én opgave kan erhverve mutex'en. En mutex har således ejerskab, og kun ejeren kan frigive den.
- Årsagerne til at bruge mutex og semafor er forskellige, måske på grund af lighed i deres implementering, en mutex ville blive omtalt som binær semafor.
- En meget kendt misforståelse er, at Mutexes og Semaphores er næsten ens, med den eneste forskel er, at en Mutex er i stand til at tælle til 1, mens Semaphoreer i stand til at tælle fra 0 til N.
- Der er altid usikkerhed mellem binær semafor og mutex. Du hører måske, at en mutex er en binær semafor, hvilket ikke er korrekt.
Hvad er en Semaphore?
En semafor er simpelthen en variabel, der er ikke-negativ og deles mellem tråde. En semafor er en signaleringsmekanisme, og en tråd, der venter på en semafor, kan signaleres af en anden tråd. Den bruger to atomoperationer, 1) vent og 2) signal for processynkronisering.
A semafor enten tillader eller nægter adgang til ressourcen, hvilket afhænger af, hvordan den er sat op.
Anvendelse af Semaphore
I tilfælde af en enkelt buffer kan vi adskille 4 KB bufferen i fire 1 KB buffere. Semaphore kan forbindes med disse fire buffere. Dette giver brugere og producenter mulighed for at arbejde på forskellige buffere på samme tid.
Fordele ved Semaphore
I min praksis er her de vigtigste positive sider ved at bruge semafor:
- Det giver mere end én tråd adgang til den kritiske sektion
- Semaphores er maskinuafhængige.
- Semaphores er implementeret i mikrokernens maskinuafhængige kode.
- De tillader ikke, at flere processer kommer ind i den kritiske sektion.
- Da der er en travl ventetid i semaforen, er der aldrig spild af procestid og ressourcer.
- De er maskinuafhængige, som skal køres i mikrokernens maskinuafhængige kode.
- De giver mulighed for fleksibel styring af ressourcer.
Ulemper ved Semaphores
Her er ulemperne ved semafor, som jeg er stødt på.
- En af de største begrænsninger ved en semafor er prioritetsinversion.
- Operativsystemet skal holde styr på alle opkald for at vente og signalere semafor.
- Deres brug håndhæves aldrig, men det er kun ved konvention.
- For at undgå dødvande i semaforen, vente og Signal operationer skal udføres i den rigtige rækkefølge.
- Semaphore programmering er en kompleks metode, så der er chancer for ikke at opnå gensidig udelukkelse.
- Det er heller ikke en praktisk metode til brug i stor skala, da deres anvendelse fører til tab af modularitet.
- Semaphore er mere tilbøjelig til programmørfejl.
- Det kan forårsage dødvande eller overtrædelse af gensidig udelukkelse på grund af programmørfejl.
Hvad er Mutex?
Den fulde form for Mutex er gensidig udelukkelsesobjekt. Det er en speciel type binær semafor, som bruges til at kontrollere adgangen til den delte ressource. Det inkluderer en prioritetsarvsmekanisme for at undgå problemer med udvidet prioritetsinversion. Det gør det muligt at holde aktuelle opgaver med højere prioritet i blokeret tilstand i kortest mulig tid. Prioritetsarv korrigerer dog ikke prioritetsinversion, men minimerer kun dens effekt.
Brug af Mutex
En mutex giver gensidig udelukkelse, som enten kan være producent eller forbruger, der kan have nøglen (mutex) og fortsætte med deres arbejde. Så længe producenten fylder buffer, skal brugeren vente, og omvendt. I Mutex-lås kan kun en enkelt tråd hele tiden fungere med hele bufferen.
Fordele ved Mutex
Fra hvad jeg har observeret, er her de vigtigste fordele ved Mutex:
- Mutexes er blot simple låse, der opnås, før de går ind i dens kritiske sektion og derefter frigiver den.
- Da kun én tråd er i sin kritiske sektion på et givet tidspunkt, er der ingen løbsbetingelser, og data forbliver altid konsistente.
Ulemper ved Mutex
I min praksis har jeg identificeret flere ulemper ved Mutex.
- Hvis en tråd opnår en lås og går i dvale, eller den er foregrebet, kan den anden tråd muligvis ikke bevæge sig fremad. Dette kan føre til sult.
- Den kan ikke låses eller låses op fra en anden kontekst end den, der erhvervede den.
- Kun én tråd bør tillades i den kritiske sektion ad gangen.
- Den normale implementering kan føre til travl ventetilstand, hvilket spilder CPU-tid.
Forskel mellem Semaphore og Mutex
Baseret på, hvad jeg har lært at arbejde med dem, er her hvordan Mutexes og Semaphores afviger:
parametre | Semaphore | mutex |
---|---|---|
Mechanism | Det er en form for signaleringsmekanisme. | Det er en låsemekanisme. |
Datatype | Semaphore er en heltalsvariabel. | Mutex er bare et objekt. |
Ændring | Vente- og signaloperationerne kan ændre en semafor. | Det ændres kun af den proces, der kan anmode om eller frigive en ressource. |
Ressourcestyring | Hvis ingen ressource er ledig, kræver processen en ressource, der skal udføre venteoperation. Det bør vente, indtil antallet af semaforen er større end 0. | Hvis den er låst, må processen vente. Processen skal holdes i kø. Dette skal kun tilgås, når mutex'en er låst op. |
Tråd | Du kan have flere programtråde. | Du kan have flere programtråde i mutex, men ikke samtidigt. |
Ejerskab | Værdien kan ændres ved enhver proces, der frigiver eller henter ressourcen. | Objektlås frigives kun af processen, som har opnået låsen på den. |
Typer | Typer af Semaphore er tælle semafor og binær semafor. | Mutex har ingen undertyper. |
Produktion | Semaphore værdien ændres ved hjælp af vente () og signal () operation. | Mutex-objekt er låst eller ulåst. |
Ressourcer Belægning | Den er optaget, hvis alle ressourcer bliver brugt, og processen, der anmoder om ressource, udfører wait ()-operation og blokerer sig selv, indtil semafor-antallet bliver >1. | Hvis objektet allerede er låst, venter processen, der anmoder om ressourcer, og sættes i kø af systemet, før låsen frigives. |
Konklusion
Efter min erfaring er nøglen til at vælge mellem mutexes og semaforer at genkende deres operationelle nuancer. Semaphores er ideelle til komplekse synkroniseringer, hvorimod mutexes er velegnede til ligetil gensidige udelukkelser, hvilket sikrer ressourcesikkerhed i enklere sammenhænge.