что происходит, если процесс прерывает выполнение операций ожидания и сигнала - PullRequest
0 голосов
/ 07 июля 2019

Основной причиной использования семафоров является предотвращение проблемы производителя-потребителя. Но мне интересно, что произойдет, если процесс будет прерван во время выполнения операции ожидания, а другой процесс также выполнит операцию ожидания.

Давайте возьмем Значение S как 1. Что если при выполнении Wait () значение S загружается в регистр reg как 1. теперь значение S уменьшается. Теперь рег 0. И теперь, если другой процесс хочет выполнить ожидание доступа к критическому разделу он считает значение S как 1. загружает рег как 1. и снова уменьшается. рег = 0.

Теперь оба процесса входят в критическую секцию.

Код для функции ожидания:

Down(Semaphore S){
S.value=S.value-1;
if(S.value<0)
{
put PCB in suspended list;
sleep;
}
else
return;
}

Код для функции сигнала

Signal(Semaphore S){
S.value=S.value+1;
if(S.value<=0)
{
Select a process from suspendend list;
wakeup();
}
}

не является ли переменная семафора также критической переменной раздела, так как она является общей для двух или многих процессов? Как мы можем предотвратить такие условия гонки?

1 Ответ

1 голос
/ 07 июля 2019

Вы правы в том, что если код для операций с семафорами такой же, как приведенный выше, то существует риск того, что может произойти что-то плохое, если поток будет прерван в середине реализации операции.Причина того, что на практике это не является проблемой, состоит в том, что фактические реализации семафорных операций немного более сложны, чем то, что вы дали.

Некоторые реализации семафоров, например, начнутся с физического отключения прерывания.механизм на машине, чтобы гарантировать, что текущий поток не может быть прерван во время выполнения операции.Другие расположены поверх других примитивов синхронизации, которые используют аналогичные методы для предотвращения вытеснения.Другие могут использовать другие механизмы, кроме отключения прерываний, которые имеют тот же эффект, что обеспечение того, что процесс не может быть остановлен на полпути в процессе выполнения необходимой синхронизации, или, по крайней мере, обеспечение того, чтобы любые места, где может происходить вытеснение, были хорошо отмечены иправильно продумано.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...