Zgodnie z terminologią systemu operacyjnego mutex i semafory to zasoby jądra zapewniające usługi synchronizacji, zwane także prymitywy synchronizacji . Synchronizacja procesów odgrywa ważną rolę w utrzymaniu spójności udostępnianych danych. Dostępne są zarówno rozwiązania programowe, jak i sprzętowe do rozwiązywania problemów z sekcjami krytycznymi. Jednak rozwiązania sprzętowe problemów z sekcjami krytycznymi są dość trudne do wdrożenia. Zarówno Mutex, jak i semafor zapewniają usługi synchronizacji, ale nie są tym samym.
Co to jest Mutex?
Mutex to obiekt wzajemnego wykluczania, który synchronizuje dostęp do zasobu. Jest tworzony z unikalną nazwą na początku programu. Mechanizm blokujący mutex zapewnia, że tylko jeden wątek może uzyskać mutex i wejść do sekcji krytycznej. Ten wątek zwalnia muteks tylko wtedy, gdy kończy się w sekcji krytycznej.
Jest to specjalny rodzaj semafora binarnego służącego do kontrolowania dostępu do współdzielonego zasobu. Zawiera mechanizm dziedziczenia priorytetów, pozwalający uniknąć długotrwałych problemów z odwracaniem priorytetów. Pozwala na utrzymanie bieżących zadań o wyższym priorytecie w stanie zablokowanym przez możliwie najkrótszy czas. Jednak dziedziczenie priorytetów nie koryguje odwrócenia priorytetów, a jedynie minimalizuje jego efekt.
Przykład
Pokazano to za pomocą następującego przykładu,
wait (mutex); ..... Critical Section ..... signal (mutex);
Zastosowanie Mutexu
Mutex zapewnia wzajemne wykluczenie producenta lub konsumenta, którzy mogą mieć klucz (mutex) i kontynuować swoją pracę. Dopóki producent wypełnia bufor, użytkownik musi czekać i odwrotnie. W Mutex lock cały czas tylko jeden wątek może pracować z całym buforem.
Kiedy program się uruchamia, żąda od systemu utworzenia obiektu mutex dla danego zasobu. System tworzy obiekt mutex z unikalną nazwą lub identyfikatorem. Ilekroć wątek programu chce skorzystać z zasobu, zakłada blokadę obiektu mutex, wykorzystuje zasób i po użyciu zwalnia blokadę obiektu mutex. Następnie następny proces może uzyskać blokadę obiektu mutex.
W międzyczasie proces uzyskał blokadę obiektu mutex i żaden inny wątek ani proces nie może uzyskać dostępu do tego zasobu. Jeśli obiekt mutex jest już zablokowany, proces chcący uzyskać blokadę obiektu mutex musi poczekać i ustawić się w kolejce systemu do czasu odblokowania obiektu mutex.
Zalety Mutexu
Oto następujące zalety mutexu, takie jak:
- Mutex to po prostu proste blokady uzyskiwane przed wejściem do jego sekcji krytycznej i następnie jej zwolnieniem.
- Ponieważ w danym momencie tylko jeden wątek znajduje się w sekcji krytycznej, nie ma sytuacji wyścigowych, a dane zawsze pozostają spójne.
Wady Mutexu
Mutex ma również pewne wady, takie jak:
- Jeśli wątek zostanie zablokowany i przejdzie w stan uśpienia lub zostanie wywłaszczony, wówczas drugi wątek nie może ruszyć do przodu. Może to prowadzić do głodu.
- Nie można go zablokować ani odblokować w innym kontekście niż ten, w którym został nabyty.
- W danej chwili w sekcji krytycznej może znajdować się tylko jeden wątek.
- Normalna implementacja może prowadzić do zajętego stanu oczekiwania, co marnuje czas procesora.
Co to jest semafor?
Semafor to po prostu zmienna, która nie jest ujemna i jest współdzielona między wątkami. Semafor jest mechanizmem sygnalizacyjnym, a inny wątek może sygnalizować wątek oczekujący na semafor.
Semafor wykorzystuje dwie operacje atomowe,
1. Poczekaj: Operacja oczekiwania zmniejsza wartość argumentu S, jeśli jest on dodatni. Jeśli S jest ujemne lub zerowe, wówczas nie jest wykonywana żadna operacja.
wait(S) { while (S<=0); s--; } < pre> <p> <strong>2. Signal for the process synchronization:</strong> The signal operation increments the value of its argument S.</p> <pre> signal(S) { S++; } </pre> <p>A semaphore either allows or reject access to the resource, depending on how it is set up.</p> <h3>Use of Semaphore</h3> <p>In the case of a single buffer, we can separate the 4 KB buffer into four buffers of 1 KB. Semaphore can be associated with these four buffers, allowing users and producers to work on different buffers simultaneously.</p> <h3>Types of Semaphore</h3> <p>Semaphore is distinguished by the operating system in two categories <strong>Counting semaphore</strong> and <strong>Binary semaphore</strong> .</p> <p> <strong>1. Counting Semaphore:</strong> The semaphore S value is initialized to the <strong>number of resources</strong> present in the system. Whenever a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and <strong>decrements</strong> the semaphore value by one. When it releases the resource, it performs <strong>the signal()</strong> operation on the semaphore and <strong>increments</strong> the semaphore value by one.</p> <p>When the semaphore count goes to 0, it means the processes occupy all resources. A process needs to use a resource when the semaphore count is 0. It executes the <strong>wait()</strong> operation and gets <strong>blocked</strong> until the semaphore value becomes greater than 0.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-3.webp" alt="Mutex vs Semaphore"> <p> <strong>2. Binary semaphore:</strong> The value of a semaphore ranges between <strong>0</strong> and <strong>1</strong> . It is similar to mutex lock, but mutex is a locking mechanism, whereas the semaphore is a signaling mechanism. In binary semaphore, if a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and decrements the value of the semaphore from 1 to 0. When it releases the resource, it performs a <strong>signal</strong> <strong>()</strong> operation on the semaphore and increments its value to 1. Suppose the value of the semaphore is 0 and a process wants to access the resource. In that case, it performs <strong>wait()</strong> operation and block itself till the current process utilizing the resources releases the resource.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-4.webp" alt="Mutex vs Semaphore"> <h3>Advantages of Semaphore</h3> <p>Here are the following advantages of semaphore, such as:</p> <ul> <li>It allows more than one thread to access the critical section.</li> <li>Semaphores are machine-independent.</li> <li>Semaphores are implemented in the machine-independent code of the microkernel.</li> <li>They do not allow multiple processes to enter the critical section.</li> <li>As there is busy and waiting in semaphore, there is never wastage of process time and resources.</li> <li>They are machine-independent, which should be run in the machine-independent code of the microkernel.</li> <li>They allow flexible management of resources.</li> </ul> <h3>Disadvantage of Semaphores</h3> <p>Semaphores also have some disadvantages, such as:</p> <ul> <li>One of the biggest limitations of a semaphore is priority inversion.</li> <li>The operating system has to keep track of all calls to wait and signal semaphore.</li> <li>Their use is never enforced, but it is by convention only.</li> <li>The Wait and Signal operations require to be executed in the correct order to avoid deadlocks in semaphore.</li> <li>Semaphore programming is a complex method, so there are chances of not achieving mutual exclusion.</li> <li>It is also not a practical method for large scale use as their use leads to loss of modularity.</li> <li>Semaphore is more prone to programmer error</li> <li>, and it may cause deadlock or violation of mutual exclusion due to programmer error.</li> </ul> <h3>Difference between Mutex and Semaphore</h3> <p>The basic difference between semaphore and mutex is that semaphore is a signalling mechanism, i.e. processes perform wait() and signal() operation to indicate whether they are acquiring or releasing the resource. In contrast, a mutex is a locking mechanism, and the process has to acquire the lock on a mutex object if it wants to acquire the resource. Here are some more differences between semaphore and mutex, such as:</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-5.webp" alt="Mutex vs Semaphore"> <br> <table class="table"> <tr> <th>Terms</th> <th>Mutex</th> <th>Semaphore</th> </tr> <tr> <td>Definition</td> <td>The mutex is a locking mechanism, as to acquire a resource, a process needs to lock the mutex object, and while releasing a resource process has to unlock the mutex object.</td> <td>Semaphore is a signalling mechanism as wait() and signal() operations performed on the semaphore variable indicate whether a process is acquiring or releasing the resource.</td> </tr> <tr> <td>Existence</td> <td>A mutex is an object.</td> <td>Semaphore is an integer variable.</td> </tr> <tr> <td>Function</td> <td>Mutex allows multiple program threads to access a single resource but not simultaneously.</td> <td>Semaphore allows multiple program threads to access a finite instance of resources.</td> </tr> <tr> <td>Ownership</td> <td>Mutex object lock is released only by the process that has acquired the lock on the mutex object.</td> <td>Semaphore value can be changed by any process acquiring or releasing the resource by performing wait() and signal() operation.</td> </tr> <tr> <td>Categorize</td> <td>Mutex is not categorized further.</td> <td>The semaphore can be categorized into counting semaphore and binary semaphore.</td> </tr> <tr> <td>Operation</td> <td>The mutex object is locked or unlocked by the process of requesting or releasing the resource.</td> <td>Semaphore value is modified using wait() and signal() operation apart from initialization.</td> </tr> <tr> <td>Resources Occupied</td> <td>If a mutex object is already locked, then the process desiring to acquire resource waits and get queued by the system till the resource is released and the mutex object gets unlocked.</td> <td>Suppose the process acquires all the resources, and no resource is free. In that case, the process desiring to acquire resource performs wait() operation on semaphore variable and blocks itself till the count of semaphore become greater than 0.</td> </tr> </table> <hr></=0);>
Semafor umożliwia lub odrzuca dostęp do zasobu, w zależności od jego konfiguracji.
Użycie semafora
W przypadku pojedynczego bufora możemy rozdzielić bufor 4 KB na cztery bufory po 1 KB. Semafor można powiązać z tymi czterema buforami, umożliwiając użytkownikom i producentom jednoczesną pracę na różnych buforach.
Rodzaje semaforów
Semafor wyróżnia się systemem operacyjnym w dwóch kategoriach Liczenie semaforów I Semafor binarny .
1. Liczenie semaforów: Wartość semafora S jest inicjowana do liczba zasobów obecny w systemie. Ilekroć proces chce uzyskać dostęp do zasobu, wykonuje to oczekiwanie() operacja na semaforze i ubytki wartość semafora o jeden. Kiedy zwalnia zasób, wykonuje działanie sygnał() operacja na semaforze i przyrosty wartość semafora o jeden.
Gdy liczba semaforów spadnie do 0, oznacza to, że procesy zajmują wszystkie zasoby. Proces musi użyć zasobu, gdy liczba semaforów wynosi 0. Wykonuje Czekać() operację i dostaje zablokowany dopóki wartość semafora nie stanie się większa niż 0.
2. Semafor binarny: Wartość semafora waha się pomiędzy 0 I 1 . Jest podobny do blokady mutex, ale mutex jest mechanizmem blokującym, podczas gdy semafor jest mechanizmem sygnalizacyjnym. W semaforze binarnym, jeśli proces chce uzyskać dostęp do zasobu, wykonuje to oczekiwanie() operację na semaforze i zmniejsza wartość semafora z 1 do 0. Kiedy zwalnia zasób, wykonuje sygnał () operację na semaforze i zwiększa jego wartość do 1. Załóżmy, że wartość semafora wynosi 0, a proces chce uzyskać dostęp do zasobu. W takim razie spełnia swoje zadanie Czekać() operację i blokuje się do czasu, aż bieżący proces wykorzystujący zasoby zwolni zasób.
Zalety semafora
Oto następujące zalety semafora, takie jak:
- Umożliwia więcej niż jednemu wątkowi dostęp do sekcji krytycznej.
- Semafory są niezależne od maszyny.
- Semafory są zaimplementowane w niezależnym od maszyny kodzie mikrojądra.
- Nie pozwalają wielu procesom wejść do sekcji krytycznej.
- Ponieważ semafor jest zajęty i czeka, 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 semaforów
Semafory mają również pewne wady, takie jak:
- Jednym z największych ograniczeń semafora jest inwersja priorytetów.
- System operacyjny musi śledzić wszystkie wywołania oczekiwania i sygnalizować semafor.
- Ich użycie nigdy nie jest egzekwowane, ale jest to wyłącznie konwencja.
- Operacje Wait i Signal muszą być wykonane w odpowiedniej kolejności, aby uniknąć zakleszczeń w semaforze.
- Programowanie semaforów jest metodą złożoną, dlatego istnieje ryzyko, że nie dojdzie do wzajemnego wykluczenia.
- Nie jest to również praktyczna metoda do stosowania na dużą skalę, ponieważ ich użycie prowadzi do utraty modułowości.
- Semafor jest bardziej podatny na błędy programisty
- i może spowodować zakleszczenie lub naruszenie wzajemnego wykluczania na skutek błędu programisty.
Różnica między Mutexem a semaforem
Podstawowa różnica między semaforem a muteksem polega na tym, że semafor jest mechanizmem sygnalizacyjnym, tj. procesy wykonują operacje Wait() i Signal(), aby wskazać, czy pobierają, czy zwalniają zasób. W przeciwieństwie do tego mutex jest mechanizmem blokującym i proces musi uzyskać blokadę obiektu mutex, jeśli chce uzyskać zasób. Oto kilka innych różnic między semaforem a muteksem, takich jak:
Warunki | Muteks | Semafor |
---|---|---|
Definicja | Mutex jest mechanizmem blokującym, ponieważ aby pozyskać zasób, proces musi zablokować obiekt mutex, a podczas zwalniania zasobu musi odblokować obiekt mutex. | Semafor jest mechanizmem sygnalizacyjnym, ponieważ operacje Wait() i Signal() wykonywane na zmiennej semafora wskazują, czy proces pozyskuje, czy zwalnia zasób. |
Istnienie | Muteks jest obiektem. | Semafor jest zmienną całkowitą. |
Funkcjonować | Mutex umożliwia wielu wątkom programu dostęp do jednego zasobu, ale nie jednocześnie. | Semafor umożliwia wielu wątkom programu dostęp do skończonej instancji zasobów. |
Własność | Blokada obiektu Mutex jest zwalniana tylko przez proces, który uzyskał blokadę obiektu mutex. | Wartość semafora może zostać zmieniona przez dowolny proces pozyskujący lub zwalniający zasób, wykonując operacje Wait() i Signal(). |
Kategoryzować | Mutex nie jest dalej klasyfikowany. | Semafor można podzielić na semafor zliczający i semafor binarny. |
Operacja | Obiekt mutex jest blokowany lub odblokowywany w procesie żądania lub zwalniania zasobu. | Wartość semafora jest modyfikowana za pomocą operacji Wait() i Signal(), niezależnie od inicjalizacji. |
Zajęte zasoby | Jeśli obiekt mutex jest już zablokowany, proces chcący pozyskać zasób czeka i ustawia się w kolejce systemu do czasu zwolnienia zasobu i odblokowania obiektu mutex. | Załóżmy, że proces pozyskuje wszystkie zasoby i żaden zasób nie jest wolny. W takim przypadku proces chcący pozyskać zasób wykonuje operację Wait() na zmiennej semafora i blokuje się do momentu, aż liczba semaforów osiągnie wartość większą niż 0. |
=0);>