Как двоичный семафор гарантирует взаимное исключение?

#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, если они используют общий ресурс.. Можно исключить только подсчет семафоров, и они не гарантируют взаимного исключения.