Hvad er Semaphore? Optælling, binære typer med eksempel
⚡ Smart opsummering
Semaphore I et operativsystem er en ikke-negativ heltalsvariabel, der deles mellem tråde, og som koordinerer adgang til delte ressourcer gennem to atomare operationer, wait og signal, hvilket forhindrer kapløbsbetingelser under processynkronisering.

Hvad er Semaphore?
Semaphore 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 til processynkronisering.
En semafor enten tillader eller nægter adgang til ressourcen, hvilket afhænger af, hvordan den er sat op.
Karakteristik af Semaphore
Her er karakteristikaene for en semafor:
- Det er en mekanisme, der kan bruges til at give synkronisering af opgaver.
- Det er en synkroniseringsmekanisme på lavt niveau.
- Semaphore vil altid have en ikke-negativ heltalværdi.
- Semaphore kan implementeres ved hjælp af testoperationer og interrupts, som skal udføres ved hjælp af filbeskrivelser.
Typer af Semaphores
De to almindelige typer semaforer er:
- Tælle semaforer
- Binære semaforer
Tælle Semaphores
Denne type Semaphore bruger en optælling, der hjælper en opgave med at blive erhvervet eller frigivet adskillige gange. Hvis den oprindelige optælling = 0, skal optællingssemaforen oprettes i den utilgængelige tilstand.
Men hvis antallet er > 0, oprettes semaforen i den tilgængelige tilstand, og antallet af tokens, den har, er lig med dets antal.
Binary Semaphores
De binære semaforer minder meget om at tælle semaforer, men deres værdi er begrænset til 0 og 1. I denne type semafor fungerer venteoperationen kun, hvis semaforen = 1, og signaloperationen lykkes, når semaforen = 0. Den er lettere at implementere end at tælle semaforer.
Eksempel Semaphore
Nedenstående program er en trin-for-trin implementering, som involverer brugen og deklarationen af en semafor.
Shared var mutex: semaphore = 1;
Process i
begin
.
.
P(mutex);
execute CS;
V(mutex);
.
.
End;
Vent og Signal Operationer i Semaphores
Begge disse operationer bruges til at implementere processynkronisering. Målet med denne semaforoperation er at få gensidig udelukkelse.
Vent på Operation
Denne type semaforoperation hjælper dig med at kontrollere indtastningen af en opgave i den kritiske sektion. Men hvis værdien af wait er positiv, nedsættes værdien af wait-argumentet X. I tilfælde af negativ eller nul værdi udføres ingen handling. Det kaldes også P(S) operation.
Efter at semaforværdien er reduceret, som bliver negativ, holdes kommandoen oppe, indtil de nødvendige betingelser er opfyldt.
P(S)
{
while (S<=0);
S--;
}
Signal drift
Denne type Semaphore operation bruges til at styre udgangen af en opgave fra en kritisk sektion. Det hjælper med at øge værdien af argumentet med 1, som betegnes som V(S).
P(S)
{
while (S>=0);
S++;
}
Tælle Semaphore vs. binær Semaphore
Her er nogle store forskelle mellem tælling og binær semafor:
| Tælle Semaphore | Binary Semaphore |
| Ingen gensidig udelukkelse | Gensidig udelukkelse |
| Enhver heltalsværdi | Værdi kun 0 og 1 |
| Mere end én plads | Kun én plads |
| Angiv et sæt processer | Den har en gensidig udelukkelsesmekanisme. |
Forskel mellem Semaphore vs. Mutex
Tabellen nedenfor sammenligner en semafor med en mutex på tværs af flere parametre:
| Driftsparametre | 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. |
Fordele ved Semaphores
Her er fordele/fordele ved at bruge Semaphore:
- 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 travlt med at vente 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 ulemper/ulemper ved semafor:
- En af de største begrænsninger ved en semafor er prioritetsinversion.
- Operativsystemet skal holde track af alle kald til vente- og signalsemafor.
- 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 kompliceret, 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.


