Чи враховує 2-процесний алгоритм взаємного виключення Петерсона для вмираючих процесів?


9

Я думаю, що в алгоритмі Петерсона для взаємного виключення , якби процес, який першим увійшов до критичного розділу, загинув або був би скасований, інший процес навіяться циклом назавжди, чекаючи входу в критичний розділ.

На малюнку, якщо процес 1 зупинений, решта процесів, що стоять за процесом 1, виконуватимуться там, де знаходиться процес 1, але потім цикл.

введіть тут опис зображення

Що станеться, якщо процес, що дійшов до критичного перерізу, спочатку гине, перш ніж покинути його?


Я відповідно відредагував ваше запитання. Оскільки ви не коментували, як поширити алгоритм на більш ніж два процеси, я змінив цю частину питання; Я думаю, проблема вже присутня у двопроцесорній версії. Я все ще не розумію картину, хоча.
Рафаель

Відповіді:


1

Це залежить від того, як реалізуються блокування. Якщо ви зробите це так, як у статті Вікіпедії, тобто захищаєте критичний розділ одним булевим процесом¹, ви, звичайно, у біді. Якщо один процес гине, він ніколи не скидає свій прапор, тому інший процес зациклюється назавжди.

На практиці ви можете захистити свій код від багатьох способів вмирання. Наприклад, візьміть цю реалізацію в стилі Java:

flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
  // critical section
}
finally {
  flag[1] = false;
}

Це дозволить переконатися, що прапор скидається, що б не трапилось у критичному розділі, якщо система обробляє помилку. У Java це справедливо навіть для переповнення стека та купи. Тому, якщо процес буквально не зникає ( kill², збій процесора, відключення мережі, ...), ви в безпеці. Зауважте, що більшість некритичних програм в цих випадках виходить з ладу - як можна обробити помилку, яку вона не працює? - так що це має бути прийнято у багатьох випадках. Ви можете усунути невідповідності при перезапуску, якщо це необхідно.

Якщо ви використовуєте правильні блокування на рівні мови, система виконання може обробляти зниклих власників замків, тобто звільняти блоки з мертвими власниками. Ви можете змоделювати це самостійно, надаючи кожному процесу перемикач мертвого чоловіка, який можуть прочитати інші, або перевірити безпосередньо, чи залишається процес володіння замком (якщо система його підтримує).


  1. Це все одно не добре.
  2. На Java, я думаю, це finalizeмає виконуватися навіть увімкнено kill, але це не гарантується специфікацією. kill -9це, мабуть, смертний вирок для будь-якого рішення, яке вимагає, щоб процес вмирання щось робив.

1

Подивіться на припущення, зокрема, що жоден процес не залишається в критичному розділі нескінченно (що, безумовно, включає просто відхід). Я не думаю, що існує спосіб вирішити цю загальну проблему з будь-яким механізмом синхронізації.

Це рішення також лише для двох процесів, навколо них є рішення для процесів.н

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.