Semafor kontra monitor
Semafor to struktura danych używana do zapewnienia, że wiele procesów nie ma dostępu do wspólnego zasobu lub sekcji krytycznej w tym samym czasie w równoległych środowiskach programowania. Semafory służą do unikania martwych blokad i warunków wyścigu. Monitor jest konstrukcją języka programowania, która jest również używana do unikania wielu procesów dostępu do wspólnego zasobu w tym samym czasie, dlatego gwarantuje wzajemne wykluczenie. Monitory używają zmiennych warunkowych do wykonania tego zadania.
Co to jest semafor?
Semafor to struktura danych służąca do wzajemnego wykluczania krytycznych sekcji. Semafory obsługują głównie dwie operacje zwane oczekiwaniem (historycznie znane jako P) i sygnałowe (historycznie znane jako V). Operacja oczekiwania blokuje proces, aż semafor jest otwarty, a operacja sygnału umożliwia wejście do innego procesu (wątku). Każdy semafor jest powiązany z kolejką oczekujących procesów. Gdy wątek wywoła operację oczekiwania, jeśli semafor jest otwarty, wątek może być kontynuowany. Jeśli semafor jest zamknięty, gdy wątek wywołuje operację oczekiwania, wątek jest blokowany i musi czekać w kolejce. Operacja na sygnale otwiera semafor, a jeśli w kolejce już czeka wątek, proces ten może być kontynuowany, a jeśli w kolejce nie ma wątków, sygnał jest zapamiętywany dla następnych wątków. Istnieją dwa typy semaforów zwane semaforami mutex i semaforami liczącymi. Semafory Mutex umożliwiają pojedynczy dostęp do zasobu, a zliczanie semaforów umożliwia dostęp do zasobu wielu wątkom (który ma kilka dostępnych jednostek).
Co to jest monitor?
Monitor to konstrukcja języka programowania służąca do kontroli dostępu do udostępnionych danych. Monitory hermetyzują wspólne struktury danych, procedury (które działają na wspólnych strukturach danych) i synchronizują między wywoływaniem procedur współbieżnych. Monitor dba o to, aby jego dane nie były napotykane na nieustrukturyzowany dostęp i gwarantuje, że bieżniki (które uzyskują dostęp do danych monitora poprzez swoje procedury) działają w sposób zgodny z prawem. Monitor gwarantuje wzajemne wykluczenie, pozwalając tylko jednemu wątkowi na wykonanie dowolnej procedury monitorowania w danym momencie. Jeśli inny wątek próbuje wywołać metodę na monitorze, podczas gdy wątek już wykonuje procedurę na monitorze, druga procedura jest blokowana i musi czekać w kolejce. Istnieją dwa typy monitorów o nazwie Monitory Hoare i Monitory Mesa. Różnią się głównie semantyką planowania.
Jaka jest różnica między semaforem a monitorem?
Mimo że zarówno semafory, jak i monitory są używane do wzajemnego wykluczenia w środowiskach programowania równoległego, różnią się technikami stosowanymi do osiągnięcia tego zadania. W monitorach kod używany do osiągnięcia wzajemnego wykluczenia znajduje się w jednym miejscu i ma bardziej uporządkowaną strukturę, podczas gdy kod semaforów jest dystrybuowany jako wywołania funkcji oczekiwania i sygnału. Ponadto bardzo łatwo jest popełniać błędy podczas implementacji semaforów, podczas gdy istnieje bardzo mała szansa na błędy podczas implementacji monitorów. Ponadto monitory używają zmiennych warunkowych, podczas gdy semafory nie.