тупик и взаимное исключение

Два процесса X и Y должны получить доступ к критическому разделу. Рассмотрим следующую конструкцию синхронизации, используемую обоими процессами.

http://d18khu5s3lkxd9.cloudfront.net//wp-content/uploads/2015/02/Q20.png

В приведенной выше ссылке varP и varQ являются общими переменными, и обе они инициализированы значением false. Какое из следующих утверждений верно?

1.Предлагаемое решение предотвращает взаимоблокировку, но не гарантирует взаимного исключения

2. Предлагаемое решение гарантирует взаимное исключение, но не предотвращает тупиковые ситуации.

3. Предлагаемое решение гарантирует взаимное исключение и предотвращает тупиковые ситуации.

4. Предлагаемое решение не предотвращает взаимоблокировку и не гарантирует взаимное исключение

Согласно вопроснику, 4-й ответ является правильным ответом.

Я понял, что он не может гарантировать взаимное исключение, но как он не может предотвратить взаимоблокировку?


person Sumeet    schedule 01.03.2015    source источник
comment
Это вопрос домашнего задания? А у вас есть мысли? Просить кого-то дать полный ответ без вашего собственного участия вряд ли принесет плоды.   -  person davmac    schedule 01.03.2015
comment
у меня есть свои мысли о взаимном исключении. Мне просто нужно немного уточнить, как не предоставляется свобода тупика. И еще один момент, это не вопрос домашнего задания.   -  person Sumeet    schedule 01.03.2015
comment
В общем, запись переменных одним потоком может никогда не быть замечена другим потоком без какого-либо барьера памяти. Поэтому тупик.   -  person davmac    schedule 01.03.2015
comment
Каковы начальные значения varP и varQ?   -  person davmac    schedule 01.03.2015
comment
читайте внимательно, указаны начальные значения. Предполагается, что такого барьера нет.   -  person Sumeet    schedule 01.03.2015
comment
Предполагается, что такого барьера нет — я вижу, что такого барьера нет. Вы имеете в виду, что предполагается, что такой барьер не требуется для того, чтобы записи переменных были видны другим потокам? Является ли тот факт, что существует оператор «пока (истина)» без разрыва, относящийся к проблеме взаимоблокировки? (Ни один из процессов никогда не выполнит другой код для процесса, как указано в комментарии в конце).   -  person davmac    schedule 01.03.2015
comment
Это действительно помогло бы мне и зрителям, если бы вы перестали ходить вокруг да около.   -  person Sumeet    schedule 01.03.2015
comment
Я не вижу, как я хожу вокруг да около. Вы не ответили на мои вопросы.   -  person davmac    schedule 01.03.2015


Ответы (1)


Я придумал это после тщательного изучения алгоритма.

Скажем, процесс Y использовал критическую секцию. Следовательно, он должен установить переменную VarQ как ложную.

Теперь, если процесс X попытается войти в критическую секцию. Он никогда не сможет войти, если процесс Y также не попытается войти. Причина в том, что условие while(varQ == true) останется ложным, если процесс Y не попытается войти в критическую секцию и при этом установит VarQ значение true, которое перед выходом из Критической секции (CS) было установлено на значение false.

Итак, как мы видим, если процесс Y не пытается войти в CS, процесс X блокируется на неопределенный срок, а также критическая секция остается неиспользованной.

Но все еще остается вопрос, как отсутствие свободы голодания приводит к отсутствию свободы тупиковой ситуации. В тупиковой ситуации блокируется каждый процесс, но если процесс Y действительно попытался снова войти в CS, процесс X мог бы добиться успеха в своей попытке войти в CS.

person Sumeet    schedule 03.03.2015