Я думаю , что в алгоритме Петерсона для взаимного исключения , если процесс первого , чтобы войти в критическую секцию должны были умереть или быть аннулирована, другой процесс будет петля навсегда, ожидая , чтобы войти в критическую секцию.
На рисунке, если процесс 1 остановлен, остальные процессы, стоящие за процессом 1, будут выполняться до того места, где находится процесс 1, но затем будут зациклены.
Что произойдет, если процесс, который достигает критического раздела, сначала умирает, прежде чем покинуть его?
Ответы:
Это зависит от того, как реализованы блокировки. Если вы сделаете это, как в статье в Википедии, т.е. защитите критическую секцию с одним логическим значением на процесс¹, у вас наверняка возникнут проблемы. Если один процесс умирает, он никогда не сбрасывает свой флаг, поэтому другой процесс зацикливается навсегда.
На практике вы можете защитить свой код от многих способов смерти. Например, возьмем эту реализацию в стиле Java:
Это гарантирует, что флаг сбрасывается, что бы ни происходило в критической секции, пока система обрабатывает ошибку. В Java это верно даже для переполнения стека и кучи. Поэтому, если процесс буквально не исчезнет (
kill
², сбой процессора, отключение сети, ...), вы в безопасности. Обратите внимание, что в большинстве случаев происходит сбой большинства некритического программного обеспечения - как оно может обработать ошибку, если оно не запущено? - так что это должно быть принято во многих случаях. При необходимости вы можете устранить несоответствия при перезагрузке.Если вы используете правильные языковые блокировки, система времени выполнения может обрабатывать исчезающие владельцы блокировок, то есть снимать блокировки с мертвыми владельцами. Вы можете смоделировать это самостоятельно, предоставив каждому процессу переключатель мертвого человека, который могут прочесть другие, или непосредственно проверьте, активен ли процесс владения блокировкой (если система поддерживает его).
finalize
должен выполняться даже наkill
, но это не гарантируется спецификацией.kill -9
Вероятно, это смертный приговор для любого решения, которое требует, чтобы процесс умирания что-то сделал.источник
Посмотрите на предположения, в частности, что ни один процесс не остается в критической секции бесконечно (это, конечно, включает просто уход). Я не думаю, что есть способ решить эту общую проблему с любым механизмом синхронизации.
источник