Czym jest Semaphore? Liczenie, typy binarne z przykładem
⚡ Inteligentne podsumowanie
Semaphore w systemie operacyjnym jest nieujemną zmienną całkowitą współdzieloną przez wątki, która koordynuje dostęp do współdzielonych zasobów poprzez dwie operacje atomowe, wait i signal, zapobiegając w ten sposób wyścigom podczas synchronizacji procesów.

Czym jest Semaphore?
Semaphore jest po prostu zmienną, która jest nieujemna i współdzielona między wątkami. Semafor jest mechanizmem sygnalizacyjnym, a wątek, który czeka na semafor, może być sygnalizowany przez inny wątek. Używa dwóch operacji atomowych: 1) Wait i 2) Signal do synchronizacji procesów.
Semafor umożliwia lub uniemożliwia dostęp do zasobu, w zależności od jego konfiguracji.
Charakterystyka Semaphore
Oto cechy semafora:
- Jest to mechanizm, który można wykorzystać w celu zapewnienia synchronizacji zadań.
- Jest to mechanizm synchronizacji niskiego poziomu.
- Semaphore zawsze będzie zawierać nieujemną wartość całkowitą.
- Semaphore można zaimplementować za pomocą operacji testowych i przerwań, które należy wykonać za pomocą deskryptorów plików.
Rodzaje Semaphores
Dwa najpopularniejsze rodzaje semaforów to:
- Liczenie semaforów
- Semafory binarne
Liczenie Semaphores
Ten typ Semaphore Wykorzystuje licznik, który pomaga w wielokrotnym wykonywaniu lub zwalnianiu zadania. Jeśli początkowa liczba wynosi 0, semafor zliczający powinien zostać utworzony w stanie niedostępnym.
Jeśli jednak liczba wynosi > 0, semafor jest tworzony w stanie dostępnym, a liczba posiadanych przez niego tokenów jest równa jego liczbie.
Binarna Semaphores
Semafory binarne są bardzo podobne do semaforów zliczających, ale ich wartość jest ograniczona do 0 i 1. W tym typie semafora operacja oczekiwania działa tylko wtedy, gdy semafor jest równy 1, a operacja sygnału kończy się powodzeniem, gdy semafor jest równy 0. Jest to łatwiejsze w implementacji niż semafory zliczające.
Przykład Semaphore
Poniższy program to implementacja krok po kroku, która obejmuje użycie i zadeklarowanie semafora.
Shared var mutex: semaphore = 1;
Process i
begin
.
.
P(mutex);
execute CS;
V(mutex);
.
.
End;
Poczekaj i Signal Operaw Semaphores
Obie te operacje służą do realizacji synchronizacja procesówCelem tej operacji semaforowej jest uzyskanie wzajemnego wykluczenia.
Poczekaj na Operacja
Ten typ operacji semaforowej pomaga kontrolować wprowadzanie zadania do sekcji krytycznej. Jednakże, jeśli wartość wait jest dodatnia, wówczas wartość argumentu wait X jest zmniejszana. W przypadku wartości ujemnej lub zerowej, żadna operacja nie jest wykonywana. Jest to również nazywane operacją P(S).
Po zmniejszeniu wartości semafora, która staje się ujemna, polecenie jest wstrzymywane do czasu spełnienia wymaganych warunków.
P(S)
{
while (S<=0);
S--;
}
Signal działanie
Ten typ Semaphore operacja służy do kontrolowania wyjścia zadania z sekcji krytycznej. Pomaga zwiększyć wartość argumentu o 1, co jest oznaczane jako V(S).
P(S)
{
while (S>=0);
S++;
}
Liczenie Semaphore kontra Binarny Semaphore
Oto kilka głównych różnic między zliczaniem a semaforem binarnym:
| Liczenie Semaphore | Binarna Semaphore |
| Żadnego wzajemnego wykluczania | Wzajemne wykluczenie |
| Dowolna wartość całkowita | Wartość tylko 0 i 1 |
| Więcej niż jedno gniazdo | Tylko jedno gniazdo |
| Podaj zestaw procesów | Posiada mechanizm wzajemnego wykluczania. |
Różnica pomiędzy Semaphore kontra Mutex
Poniższa tabela porównuje semafor z mutexem w oparciu o kilka parametrów:
| Parametry | Semaphore | Mutex |
| Mechanizm | Jest to rodzaj mechanizmu sygnalizacyjnego. | Jest to mechanizm blokujący. |
| DataType | Semaphore jest zmienną całkowitą. | Mutex to tylko obiekt. |
| Modyfikacja | Operacje oczekiwania i sygnału mogą modyfikować semafor. | Jest modyfikowany tylko przez proces, który może zażądać lub zwolnić zasób. |
| Zarządzanie zasobami | Jeśli żaden zasób nie jest wolny, proces wymaga zasobu, który powinien wykonać operację wait. Powinien czekać, aż liczba semaforów będzie większa niż 0. | Jeśli jest zablokowany, proces musi poczekać. Proces powinien być umieszczony w kolejce. Dostęp do tego należy uzyskać tylko wtedy, gdy muteks jest odblokowany. |
| Wątek | Możesz mieć wiele wątków programu. | W mutexie można mieć wiele wątków programu, ale nie jednocześnie. |
| Własność | Wartość można zmienić w dowolnym procesie zwalniającym lub uzyskującym zasób. | Blokadę obiektu zwalnia tylko proces, który uzyskał na nim blokadę. |
| rodzaje | Rodzaje Semaphore zliczają semafory i semafory binarne. | Mutex nie ma podtypów. |
| Operacja | Semaphore wartość jest modyfikowana za pomocą operacji wait() i signal(). | Obiekt Mutex jest zablokowany lub odblokowany. |
| Zajętość zasobów | Jest zajęty, jeżeli wszystkie zasoby są wykorzystywane, a proces żądający zasobu wykonuje operację wait() i blokuje się do momentu, aż liczba semaforów stanie się >1. | W przypadku, gdy obiekt jest już zablokowany, proces żądający zasobów czeka i zostaje umieszczony w kolejce systemu przed zwolnieniem blokady. |
Zalety Semaphores
Oto zalety/korzyści korzystania Semaphore:
- Umożliwia dostęp do sekcji krytycznej więcej niż jednemu wątkowi.
- Semaphoresą niezależne od maszyny.
- Semaphores są zaimplementowane w niezależnym od maszyny kodzie mikrojądra.
- Nie pozwalają wielu procesom wejść do sekcji krytycznej.
- Ponieważ w semaforze jest zajęte oczekiwanie, nigdy nie dochodzi do marnowania czasu i zasobów procesu.
- Są niezależne od maszyny i powinny być uruchamiane w niezależnym od maszyny kodzie mikrojądra.
- Umożliwiają elastyczne zarządzanie zasobami.
Wady Semaphores
Oto wady/wady semafora:
- Jednym z największych ograniczeń semafora jest inwersja priorytetów.
- System operacyjny musi zachować track wszystkich połączeń oczekujących i sygnalizujących semafor.
- Ich użycie nigdy nie jest egzekwowane, ale jest to wyłącznie konwencja.
- Aby uniknąć blokad w semaforze, polecenia Wait i Signal operacje muszą być wykonywane w odpowiedniej kolejności.
- Semaphore programowanie jest skomplikowane, więc istnieje ryzyko, że nie uda się osiągnąć wzajemnego wykluczenia.
- Nie jest to również praktyczna metoda do stosowania na dużą skalę, ponieważ ich użycie prowadzi do utraty modułowości.
- Semaphore jest bardziej podatny na błędy programisty.
- Może to spowodować impas lub naruszenie wzajemnego wykluczenia z powodu błędu programisty.


