#operating-system #synchronization #semaphore #binary-semaphore
Вопрос:
Я только что прочитал, что двоичные семафоры гарантируют взаимное исключение и что семафоры могут быть вытеснены.
Код для ожидания/выключения двоичного семафора(взят из https://www.javatpoint.com/os-binary-semaphore-or-mutex)
Down (semaphore S)
{
if (s.value == 1) // if a slot is available in the
//critical section then let the process enter in the queue.
{
S.value = 0; // initialize the value to 0 so that no other process can read it as 1.
}
else
{
put the process (PCB) in S.L; //if no slot is available
//then let the process wait in the blocked queue.
sleep();
}
}
итак,что делать, если процесс P1 запущен, и он проверяет условие в функции down и собирается изменить значение s.значение на 0, но перед этим он вытесняется, его печатная плата сохраняется, и запускается новый процесс P2, он проверяет условие и изменяет значение s.на 0, и начинается его критический раздел.с другой стороны, P1 может начать выполнение, если P2 перейдет в состояние ожидания ввода-вывода, и поэтому оба могут войти в свои критические разделы.Так как же сохраняется взаимное исключение??
Комментарии:
1. Это не может произойти с объектом семафора. Если это может произойти, объект не является семафором.
Ответ №1:
Двоичные семафоры обеспечивают взаимное исключение, убедившись, что процесс, изменивший значение семафора на 0 (чтобы показать, что он находится в критическом разделе), является единственным процессом, который может снова изменить значение семафора (на 1).И поэтому в моем вопросе ,даже если P1 начнет выполняться, он не будет вытеснен. и поэтому он гарантирует, что P1 завершится перед запуском P2, если они используют общий ресурс.. Можно исключить только подсчет семафоров, и они не гарантируют взаимного исключения.