«Скажем, у меня есть два процесса A и B. Предположим, процесс А, имеющий семафор с ним и выполнения некоторых критическая задача. Теперь, скажем, процесс B отправляет сигнал для освобождения семафора. В этом случае будет обрабатываться A освободить семафор, даже если он выполняет какую-то критическую задачу?"
Ключевым моментом здесь отметить роль ОС ядра. Процесс B не может послать сигнал к процессу A„ чтобы освободить семафор“. То, что он может сделать, это обратиться к ядру, чтобы дать это доступ к ресурсу. Процесс A запросил ядро, и ядро предоставило ему доступ к ресурсу. Теперь процесс A после завершения его работы позволит ядру знать, что это делается с ресурсом, а затем доступ к ядру предоставляет доступ к ресурсу к В.
«возникает Мои сомнения, когда процесс, который не имеет семафор с он может освободить семафор. Что толк иметь семафор?»
Основное различие между мьютексом и семафором, семафор упорядочивает доступ к нескольким экземплярам ресурса. Мьютекс делает то же самое, когда есть один экземпляр ресурс.
отсчет поддерживается ядром в случае семафора и мьютекс это особый случай, когда счетчик равен 1.
Рассмотрим процессы, как клиенты ждут в очереди в банке. использование семафора аналогично случаю, когда имеются несколько счетчиков, обслуживающих клиентов. Использование мьютекса аналогично случаю, когда есть только один кассир.
Скажем, существуют процессы A, B и C, которым необходим параллельный доступ к ресурсу (блокировка, файл или структура данных в памяти и т. Д.). Предположим, что есть 2 экземпляра ресурса. Таким образом, максимум два процесса могут быть предоставлены одновременно.
Процесс А запрашивает доступ к экземпляру ресурса, следуя необходимой семантике. Этот запрос к ядру включает структуры данных для идентификации ресурса и максимального количества экземпляров, поскольку 2. ядро создает семафор со счетом 2, предоставляет доступ к ресурсу и уменьшает счет до 1, потому что теперь только один другой процесс может получить доступ.
Теперь процесс B запрашивает доступ к ресурсу, следуя той же семантике. Ядро предоставляет ему доступ и уменьшает значение счета до 0.
Теперь процесс обработки запросов C запрашивает, но ядро сохраняет его в состоянии ожидания, поскольку счетчик равен 0, и не более двух процессов могут получать одновременный доступ.
Процесс А выполняется с ресурсом и позволяет ядру знать. Ядро замечает это и предоставляет доступ к процессу C, который ждал.
В случае мьютекса ядро предоставляет доступ к ресурсу только по одному процессу за раз.
Пожалуйста, смотрите эту ссылку http://koti.mbnet.fi/niclasw/MutexSemaphore.html, он имеет хорошее объяснение на семафоре против мьютекса –