Семафор срещу Мутекс
Semaphore е структура от данни, която се използва, за да се гарантира, че множество процеси нямат достъп до общ ресурс или критична секция едновременно, в паралелна среда за програмиране. Семафорите се използват за избягване на мъртви брави и условия на състезание. Mutex (обект на взаимно изключване) също се използва, за да се избегне достъп до общ ресурс едновременно от няколко едновременни процеса.
Какво е семафор?
Semaphore е структура от данни, която се използва за осигуряване на взаимно изключване на критични секции. Семафорите поддържат основно две операции, наречени изчакване (исторически известни като P) и сигнал (исторически известни като V). Операцията за изчакване блокира процес, докато семафорът се отвори и операцията на сигнала позволява да влезе друг процес (нишка). Всеки семафор е свързан с опашка от чакащи процеси. Когато операцията за изчакване се извика от нишка, ако семафорът е отворен, нишката може да продължи. Ако семафорът е затворен, когато операцията за изчакване се извика от нишка, нишката се блокира и тя трябва да изчака на опашката. Операцията на сигнала отваря семафор и ако в опашката вече се чака нишка, този процес е позволен да продължи и ако няма нишки, чакащи в опашката, сигналът се запомня за следващите нишки. Има два типа семафори, наречени мутексни семафори и броищи семафори. Mutex семафорите позволяват един достъп до ресурс, а преброяването на семафор позволява на множество нишки достъп до ресурс (който има няколко единици на разположение).
Какво е Мутекс?
Когато стартира компютърно приложение, то ще създаде мутекс и ще го прикачи към ресурс. Когато ресурсът се използва от нишка, той се заключва и други нишки не могат да го използват. Ако друга тема иска да използва същия ресурс, тя ще трябва да направи заявка. Тогава тази нишка ще бъде поставена на опашка, докато първата нишка не бъде завършена с ресурса. Когато първата нишка приключи с ресурса, заключването ще бъде премахнато и нишката, която чака в опашката, може да получи достъп до ресурса. Ако в опашката чакат няколко нишки, те получават достъп при въртяща се основа. На практика, когато мутексът редува достъпа до ресурс между няколко нишки, той ще бъде видим, тъй като множество нишки консумират ресурс едновременно. Но вътрешно само една нишка има достъп до ресурса в даден момент.
Каква е разликата между Семафор и Мутекс?
Въпреки че и семафорите, и мутексните обекти се използват за постигане на взаимно изключване в паралелна среда за програмиране, те имат някои разлики. Мутексният обект позволява само една нишка да консумира ресурс или критична секция, докато семафорите позволяват ограничен брой едновременни достъпи до ресурс (под максимално разрешен брой). С mutex обекти, други нишки, които искат да получат достъп до ресурса, трябва да изчакат на опашка, докато текущата нишка не е завършена с помощта на ресурса.