Mutex vs Semaphore – Różnica między nimi
Kluczowa różnica między Mutex a Semaphore
- Mutex jest mechanizmem blokującym, natomiast Semaphore jest mechanizmem sygnalizacyjnym
- Mutex jest tylko obiektem Semaphore jest liczbą całkowitą
- Mutex nie ma podtypu, natomiast semafor ma dwa typy: semafor zliczający i semafor binarny.
- Semaphore obsługuje modyfikacje operacji oczekiwania i sygnału, natomiast Mutex jest modyfikowany tylko przez proces, który może zażądać lub zwolnić zasób.
- Semaphore wartość jest modyfikowana za pomocą operacji wait() i signal(), z drugiej strony operacje Mutex są blokowane lub odblokowywane.
Tutaj przeanalizowałem różnicę między Mutex a Semaphore i kompleksowo oceni ich zalety i wady.
Wspólne fakty na temat Mutex i Semaphore
Korzystając z mojej praktyki, przedstawiam kilka powszechnych faktów na temat Mutex vs. Semaphore:
- Tylko jedno zadanie może uzyskać muteks. Zatem muteks jest właścicielem i tylko właściciel może go zwolnić.
- Powody używania muteksu i semafora są różne, być może ze względu na podobieństwo w ich implementacji, muteks byłby określany jako semafor binarny.
- Jednym z bardzo znanych nieporozumień jest to, że Mutexy i Semaphores są prawie takie same, z tą tylko różnicą, że Mutex potrafi liczyć do 1, podczas gdy Semaphorepotrafi liczyć od 0 do N.
- Zawsze istnieje niepewność pomiędzy semaforem binarnym a muteksem. Możesz usłyszeć, że mutex jest semaforem binarnym, co nie jest poprawne.
Czym są sterowniki Semaphore?
Semafor 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 otrzymać sygnał od innego wątku. Używa dwóch operacji atomowych: 1) czekaj i 2) sygnalizuj dla synchronizacja procesów.
A semafor umożliwia lub uniemożliwia dostęp do zasobu, w zależności od jego konfiguracji.
w korzystaniu Semaphore
W przypadku pojedynczego bufora możemy rozdzielić bufor 4 KB na cztery bufory po 1 KB. Semaphore można powiązać z tymi czterema buforami. Pozwala to użytkownikom i producentom pracować na różnych buforach w tym samym czasie.
Zalety Semaphore
W mojej praktyce oto najważniejsze zalety używania semafora:
- Umożliwia więcej niż jednemu wątkowi dostęp do sekcji krytycznej
- 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ż harmonogram oczekiwania w semaforze jest napięty, nigdy nie ma straty czasu i zasobów procesowych.
- 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 semafora, z którymi się spotkałem.
- Jednym z największych ograniczeń semafora jest inwersja priorytetów.
- System operacyjny musi śledzić wszystkie wywołania semafora oczekującego i sygnalizującego.
- 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 złożoną metodą, więc istnieje ryzyko, że nie uda się osiągnąć wzajemnego wykluczania.
- 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.
Co to jest Mutex?
Pełna forma Mutexu to obiekt wzajemnego wykluczania. Jest to specjalny rodzaj semafora binarnego, który służy 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że dziedziczenie priorytetów nie koryguje odwrócenia priorytetów, a jedynie minimalizuje jego efekt.
Zastosowanie Mutexu
Mutex zapewnia wzajemne wykluczanie, którym może być producent lub konsument, który może mieć klucz (mutex) i kontynuować swoją pracę. Dopóki producent wypełnia bufor, użytkownik musi czekać i odwrotnie. W blokadzie Mutex cały czas tylko jeden wątek może pracować z całym buforem.
Zalety Mutexu
Z tego co zaobserwowałem, oto najważniejsze zalety Mutexu:
- Muteksy to po prostu proste blokady uzyskiwane przed wejściem do 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
W swojej praktyce zidentyfikowałem kilka wad Mutexu.
- Jeśli wątek uzyska blokadę i przejdzie w tryb uśpienia lub zostanie wywłaszczony, wówczas drugi wątek może nie być w stanie 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.
Różnica pomiędzy Semaphore i Mutex
W oparciu o to, czego nauczyłem się pracując z nimi, oto jak Mutexy i Semaphoreróżnią się:
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. |
Podsumowanie
Z mojego doświadczenia wynika, że kluczem do wyboru między muteksami i semaforami jest zrozumienie niuansów ich działania. SemaphoreSą idealne do złożonych synchronizacji, natomiast mutexy sprawdzają się w przypadku prostych wzajemnych wykluczeń, zapewniając bezpieczeństwo zasobów w prostszych kontekstach.