Semafor kontra monitory - jaka jest różnica?


233

Jakie są główne różnice między monitorem a semaforem ?


8
Możesz myśleć o monitorze jako o semaforze binarnym.
Maxim Egorushkin,


1
Proszę przejrzeć ten albahari.com/threading/part2.aspx . Przeczytałem ten artykuł, najlepszy, jaki kiedykolwiek czytałem na temat Wątków
Shantanu Gupta,

5
Nie sądzę, że masz rację, Maxim. Semafor jest strukturą „niższego poziomu”, jeśli się nie mylę, podczas gdy Monitor jest obiektem w pełni rozwiniętym. Pamiętam, że krótko omawialiśmy monitory w mojej klasie systemów operacyjnych na studiach, ale nie pamiętam, w jaki sposób Monitor różni się od Mutexa, poza tym, że jest zorientowany obiektowo. Pamiętam, że jeden problem można rozwiązać za pomocą monitorów, ale nie mogliśmy użyć tej samej metody w klasie, ze względu na ograniczenia języka C.
user919860,

1
Semafor i monitor są bardzo zróżnicowane, ale równoważne pod względem mocy, w tym sensie, że można je wdrażać jeden od drugiego. Możesz przeczytać oryginalny artykuł Hoare, który dowodzi ich równoważności stąd
Thanh DK

Odpowiedzi:


529

Monitora to obiekt zaprojektowany, aby uzyskać dostęp z wielu wątków. Funkcje lub metody elementu monitorowanego obiektu wymuszą wzajemne wykluczenie, więc tylko jeden wątek może wykonywać dowolną akcję na obiekcie w danym momencie. Jeśli jeden wątek aktualnie wykonuje funkcję elementu tego obiektu, każdy inny wątek, który próbuje wywołać funkcję elementu tego obiektu, będzie musiał poczekać, aż pierwszy element się zakończy.

Semafora jest obiektem niższego poziomu. Możesz za pomocą semafora zaimplementować monitor. Semafor zasadniczo jest tylko licznikiem. Gdy licznik jest dodatni, jeśli wątek próbuje uzyskać semafor, jest to dozwolone, a licznik jest zmniejszany. Po zakończeniu wątku zwalnia semafor i zwiększa licznik.

Jeśli licznik ma już zero, gdy wątek próbuje uzyskać semafor, musi poczekać, aż inny wątek zwolni semafor. Jeśli wiele wątków czeka, gdy wątek zwolni semafor, jeden z nich go otrzyma. Wątek, który zwalnia semafor, nie musi być tym samym, który go pozyskał.

Monitor jest jak toaleta publiczna. Jednocześnie może wejść tylko jedna osoba. Zamykają drzwi, aby nikt nie wszedł do środka, robią swoje, a następnie otwierają je, kiedy wychodzą.

Semafor jest jak wypożyczalnia rowerów. Mają pewną liczbę motocykli. Jeśli spróbujesz wypożyczyć rower, który ma go za darmo, możesz go zabrać, w przeciwnym razie musisz poczekać. Gdy ktoś zwróci rower, ktoś inny może go zabrać. Jeśli masz rower, możesz go oddać komuś innemu - wypożyczalnia rowerów nie dba o to, kto go zwróci, pod warunkiem, że odzyska rower.


162
+1 Świetna analogia do publicznych łazienek i wypożyczalni rowerów. Nigdy nie zapomnę teraz różnicy między nimi dwoma.
Drupad Panchal

4
Twoja odpowiedź wydaje się być sprzeczna z stackoverflow.com/a/7336799/632951 .. więc kto ma rację?
Pacerier,

6
@Pacerier: Jestem :-) Jedyną sprzecznością jest sprawa wysokiego / niskiego poziomu. Państwo może budować monitor z semaforów, to po prostu nie bardzo schludny, właśnie dlatego, że monitor jest strukturą wyższego poziomu niż semafora. Semafor to tylko licznik czekania. Proponuję przeczytać „The Little Book of Semaphores” greenteapress.com/semaphores
Anthony Williams,

3
@AnthonyWilliams: Być może wątpię w to, że monitory można budować tylko z semaforów. Drugi sposób jest również możliwy i dlatego nie możemy obficie powiedzieć, że monitor jest jednostką wyższego poziomu niż semafory.
Kavish Dwivedi

5
Tak, możesz zbudować semafor z monitora. Zawsze możesz budować obiekty niskiego poziomu z obiektów wysokiego poziomu. Rzeczy na wysokim / niskim poziomie dotyczą możliwości i zakresu działania, a nie tego, które można wykorzystać do zbudowania drugiego.
Anthony Williams

11

Poniższe wyjaśnienie faktycznie wyjaśnia, w jaki sposób wait () i signal () monitora różnią się od P i V semafora.

Wait () i sygnał () operacje na zmiennych warunkowych w monitorze są podobne do P i V operacji na liczenie semaforów .

Instrukcja wait może blokować wykonanie procesu, natomiast instrukcja signal może spowodować odblokowanie innego procesu. Istnieją jednak pewne różnicemiędzy nimi. Kiedy proces wykonuje operację P, niekoniecznie blokuje ten proces, ponieważ semafor zliczający może być większy niż zero. W przeciwieństwie do tego, gdy wykonywana jest instrukcja wait, zawsze blokuje ona proces. Kiedy zadanie wykonuje operację V na semaforze, albo odblokowuje zadanie oczekujące na tym semaforze, albo zwiększa licznik semaforów, jeśli nie ma zadania do odblokowania. Z drugiej strony, jeśli proces wykonuje instrukcję sygnału, gdy nie ma innego procesu do odblokowania, nie ma to wpływu na zmienną warunkową. Inną różnicą między semaforami i monitorami jest to, że użytkownicy obudzeni przez operację V mogą natychmiast wznowić wykonywanie. Przeciwnie, użytkownicy budzeni przez operację sygnału są restartowani dopiero po odblokowaniu monitora. Dodatkowo,

Link: tutaj do dalszego czytania. Mam nadzieję, że to pomoże.


6

Odpowiedź w jednym wierszu:

Monitor: kontroluje tylko JEDEN wątek na raz, który można wykonać na monitorze. (trzeba uzyskać blokadę, aby wykonać pojedynczy wątek)

Semafor: blokada, która chroni udostępniony zasób. (trzeba uzyskać blokadę, aby uzyskać dostęp do zasobu)


5

Semafor umożliwia dostęp do wspólnego obiektu wielu wątkom (do określonej liczby). Monitory umożliwiają wzajemnie wykluczający się dostęp do współdzielonego obiektu.

Monitor

Semafor


10
Ale czym zatem różni się Monitor od MutEx? Blokada wzajemnego wykluczania działa dokładnie tak samo jak semafor, ale umożliwia dostęp tylko do jednego wątku naraz.
user919860,

2
Tak, jaka jest różnica między mnitor i mutex?
Pacerier,

2
Warto zauważyć, że semafory nie kontrolują dostępu do udostępnionego obiektu, ale raczej do udostępnionego zasobu (który będzie zawierał wiele obiektów).
xbonez

@xbonez: Jeśli spojrzymy na java.util.ArrayList: czy jest to obiekt czy kontener wielu obiektów? Cóż, oba są jednocześnie. Czy semafor jest odpowiedni do kontrolowania dostępu do niego? Powiedziałbym: nie.
dma_k

W samej zaakceptowanej odpowiedzi wspomniano, że Monitor wdraża wzajemne wykluczenie. Zobacz „Funkcje lub metody
składowe obiektu monitorowania wymuszą

2

Gdy semafor jest używany do ochrony obszaru krytycznego, nie ma bezpośredniego związku między semaforem a chronionymi danymi. Jest to jeden z powodów, dla których semafory mogą być rozproszone wokół kodu, i dlatego łatwo jest zapomnieć o wywołaniu oczekiwania lub powiadomienia , w którym to przypadku odpowiednio, będzie to naruszać wzajemne wykluczenie lub trwale zablokować zasób.

W przeciwieństwie do tych złych rzeczy może się zdarzyć na monitorze. Monitor jest zmęczony bezpośrednio danymi (hermetyzuje dane), a ponieważ operacje monitora są akcjami atomowymi, nie można napisać kodu, który może uzyskać dostęp do danych bez wywołania protokołu wejścia. Protokół wyjścia jest wywoływany automatycznie po zakończeniu operacji monitorowania.

Monitor ma wbudowany mechanizm synchronizacji warunków w postaci zmiennej warunkowej przed kontynuowaniem. Jeśli warunek nie jest spełniony, proces musi poczekać, aż zostanie powiadomiony o zmianie warunku. Gdy proces oczekuje na synchronizację warunków, implementacja monitora zajmuje się kwestią wzajemnego wykluczenia i umożliwia inny proces uzyskania dostępu do monitora.

Zaczerpnięty z The Open University M362 Unit 3 „Interacting process” materiał kursu.


Tyle, że chociaż semafory są dość powszechnie dostępne w języku i prezentowane w podręcznikach jako rodzaj zmiennej z ograniczonymi operatorami atomowymi, semafor jest szczególnym przypadkiem monitora - ponieważ jest rodzajem zmiennej z ograniczonymi operatorami atomowymi, bo taki jest monitor. Argumenty powyżej, że semafory są „niższym poziomem”, są podstępne.
philipxy

2

Semafor:

Użycie licznika lub flagi do kontroli dostępu do niektórych zasobów współdzielonych w systemie współbieżnym oznacza użycie semafora .

Przykład:

  1. Licznik pozwalający tylko 50 pasażerom uzyskać 50 miejsc (wspólne zasoby) dowolnego teatru / autobusu / pociągu / zabawy / klasy. I pozwolić nowemu Pasażerowi tylko wtedy, gdy ktoś zwolni miejsce.
  2. Binarna flaga wskazująca wolny / zajęty status każdej łazienki.
  3. Sygnalizacja świetlna jest dobrym przykładem flag. Kontrolują przepływ poprzez regulację przejazdu pojazdów na drogach (wspólne zasoby)

Flagi ujawniają tylko bieżący stan zasobu, brak liczby lub inne informacje o obiektach oczekujących lub działających w zasobie.

Monitor:

monitora synchronizuje dostęp do obiektu poprzez komunikowanie się z wątków zainteresowany tym obiektem, z prośbą o dostęp do nabywania lub czekać na jakiś warunek, by stać się prawdą.

Przykład:

  1. Ojciec może działać jako monitor dla córki, pozwalając jej umawiać się z jednym facetem na raz.
  2. Nauczyciel w szkole używa pałeczki, aby pozwolić tylko jednemu dziecku mówić w klasie.
  3. Wreszcie techniczna, transakcje (poprzez wątki) na obiekcie Konta zsynchronizowane dla zachowania integralności.

Myślę, że sygnalizacja świetlna na krzyżu drogowym jest również binarną flagą: albo samochody na jednej drodze, albo na drodze ortogonalnej mogą jechać (wykluczając się wzajemnie), stąd przykład (3) jest taki sam jak (2). Myślę też, że te przykłady są przypadkami narożnymi dla semaforów (przypadek trywialny), które można zaimplementować za pomocą monitora. W wikipedii są bardziej typowe przykłady .
dma_k
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.