Semafor kontra monitor
Semafor to struktura danych używana do zapewnienia, że wiele procesów nie będzie jednocześnie uzyskiwać dostępu do wspólnego zasobu lub sekcji krytycznej w środowiskach programowania równoległego. Semafory są używane, aby uniknąć martwych zamków i warunków wyścigu. Monitor jest konstrukcją języka programowania, która służy również do unikania jednoczesnego dostępu wielu procesów do wspólnego zasobu, co gwarantuje wzajemne wykluczenie. Monitory używają zmiennych warunkowych, aby wykonać to zadanie.
Co to jest semafor?
Semafor to struktura danych służąca do wzajemnego wykluczania krytycznych sekcji. Semafory obsługują głównie dwie operacje zwane wait (historycznie znane jako P) i signal (historycznie znane jako V). Operacja oczekiwania blokuje proces do momentu otwarcia semafora, a operacja sygnału zezwala na wejście innego procesu (wątku). Każdy semafor jest powiązany z kolejką oczekujących procesów. Gdy operacja oczekiwania jest wywoływana przez wątek, jeśli semafor jest otwarty, wątek może kontynuować. Jeśli semafor jest zamknięty, gdy operacja oczekiwania jest wywoływana przez wątek, wątek jest blokowany i musi czekać w kolejce. Operacja sygnału otwiera semafor i jeśli w kolejce znajduje się już wątek, proces ten może kontynuować, a jeśli w kolejce nie ma wątków oczekujących, sygnał jest zapamiętywany dla następnych wątków. Istnieją dwa rodzaje semaforów zwane semaforami muteksowymi i semaforami liczącymi. Semafory Mutex umożliwiają pojedynczy dostęp do zasobu, a semafory liczące umożliwiają wielu wątkom dostęp do zasobu (który ma dostępnych kilka jednostek).
Co to jest monitor?
Monitor to konstrukcja języka programowania używana do kontrolowania dostępu do współdzielonych danych. Monitory hermetyzują współużytkowane struktury danych, procedury (działające na współużytkowanych strukturach danych) oraz synchronizację między współbieżnymi wywołaniami procedur. Monitor upewnia się, że jego dane nie są narażone na nieustrukturyzowane dostępy i gwarantuje, że bieżniki (które uzyskują dostęp do danych monitora za pośrednictwem jego procedur) współdziałają w sposób zgodny z prawem. Monitor gwarantuje wzajemne wykluczanie, pozwalając tylko jednemu wątkowi na wykonanie dowolnej procedury monitora w danym czasie. Jeśli inny wątek próbuje wywołać metodę na monitorze, podczas gdy wątek już wykonuje procedurę na monitorze, to druga procedura jest blokowana i musi czekać w kolejce. Istnieją dwa rodzaje monitorów o nazwie monitory Hoare i monitory Mesa. Różnią się głównie pod względem semantyki planowania.
Jaka jest różnica między semaforem a monitorem?
Mimo że zarówno semafory, jak i monitory są używane do osiągnięcia wzajemnego wykluczania w środowiskach programowania równoległego, różnią się one technikami używanymi do osiągnięcia tego zadania. W monitorach kod używany do osiągnięcia wzajemnego wykluczania znajduje się w jednym miejscu i jest bardziej ustrukturyzowany, podczas gdy kod semaforów jest dystrybuowany jako wywołania funkcji oczekiwania i sygnału. Ponadto bardzo łatwo jest popełnić błędy przy implementacji semaforów, podczas gdy prawdopodobieństwo popełnienia błędów przy implementacji monitorów jest bardzo małe. Co więcej, monitory używają zmiennych warunkowych, podczas gdy semafory nie.