Чому небезпечний стан не завжди викликає тупик?


10

Я читав Гальвін Операційні системи і натрапив на нижній рядок,

Однак, не всі небезпечні стани є тупиком. Небезпечний стан може призвести до тупикової ситуації

Може хтось, будь ласка, пояснить, як тупик! = Небезпечний стан? Я також зловив ту ж лінію тут

Якщо безпечної послідовності не існує, система перебуває в небезпечному стані, що МОЖЕ призвести до тупикової ситуації. (Усі безпечні стани безкоштовні, але не всі небезпечні стани призводять до тупикових ситуацій.)


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

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

1
З тих самих причин, що будь-яка небезпечна ситуація (в реальному житті) не завжди призводить до того, що насправді відбуваються погані речі.
Девід Річербі

Відповіді:


14

Тупик означає що - то конкретне: є два (або більше) процесів, які в даний час блоковані чекаю один від одного.

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

Розглянемо наступний приклад:

Process A                  Process B
lock X                     lock Y           # state is "unsafe"
                           unlock Y
lock Y                                      # state is back to "safe" (no deadlock this time.  We got lucky.)

Є більш цікавий приклад у розділі 7.5.1 посилання, яке ви надали :

Розглянемо систему з 12 стрічковими накопичувачами з:

Process       Max Need       Current
P0:             10              5
P2:              9              3

Це небезпечний стан. Але ми не в глухому куті. Там тільки 4 безкоштовних дисків, так що , наприклад, якщо P0 робить запит на додаткові 5 і P2 робить запит додатково 1, ми будемо тупикової, але це ще не відбулося. І P0 може не вимагати більше дисків, але може замість цього звільнити вже наявні диски. Перелік Max needвсіх можливих виконань програми, і це може бути не одним із виконань, де нам потрібно всі 10 дисків у P0.


Дуже дякую, пане! і я ненавиджу свій незрозумілий підручник ...
Нін

Але у мене також є деякі питання: (1) Ви сказали ["] Максимальна потреба є над усіма можливими виконанням програми [."] , Але ви також сказали ["], якщо P0 вимагає додаткових 5, а P2 запит додатковий 1, ми будемо тупикової [. "] , де (1) означає , що якщо Макс потреба не досягнута , це можливо , щоб мати тупикову ситуацію, в той час як (2) засоби повинні мати тупикову ситуацію , коли він не досяг?
Нін

Є чи моє міркування правильно?: Якщо P2 робить запит на додатковий 1 і закінчити , то вільні стрічки стали (4 + 3 = 7), а з P1 запросити додаткові 5 , то це може бути досягнуто, тому не тупик. Але якщо P2 не закінчується, то виникає тупикова ситуація, оскільки навіть якщо P1 потрібно лише 5, щоб закінчити, все одно 4 <5.
Нін

Для останнього прикладу: P0 запитуйте додаткові 5, потім 5 + 5 + 3 = 13> 12, тому P0 повинен зачекати P2, щоб генерувати тупик, просто нехай P2 вимагає додаткового.
Bit_hcAlgorithm

7

Просто для пояснення того, що говорила «Мандрівна логіка».

Скажімо, у мене є два потоки, яким обом потрібен доступ до X та Y, і немає синхронізації та немає механізму виправлення тупикової ситуації. Це небезпечно, оскільки один міг зафіксувати X, а інший Y, а потім і продовжити. Але це не гарантується.

Thread 1                    Thread 2
Lock X                      
Lock Y
OS Interrupts Thread 1 and passes control to Thread 2
                            Unable to lock needed resources.
OS Interrupts Thread 2 and passes control to Thread 1
Unlock X                    
Unlock Y                    
                            Lock Y
                            Lock X
 ....

Цей сценарій не зайшов у глухий кут, але він міг мати. Завдяки тому, як працює різьба, немає заданого потоку. ОС керує ниткою, тому може статися щось на зразок наступного:

Thread 1                    Thread 2
Lock X        
OS Interrupts Thread 1 and passes control to Thread 2
                            Lock Y              
DEADLOCK Thread 1 needs Y, Thread 2 needs X. Neither knows to back down and simply waits.

1

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

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

Дозвольте додати легкий приклад порівняння з поділом: Якщо ваша функція ділить c / d і повертає результат, не перевіряючи, чи d дорівнює 0, можливий поділ на нульову помилку, тому код небезпечний (призначене те саме іменування), але поки у вас такий поділ, все нормально, але після теоретичного аналізу код небезпечний і може потрапити в невизначену поведінку, якщо не обробляється належним чином.


0

Ось моє розуміння щодо цього (будь ласка, виправте мене, якщо я помиляюся): (A) Якщо тупик, означає, що існує цикл (одна з необхідних умов) (B) Цикл є обов'язковою умовою для тупикового зв'язку (як для одиночного, так і для кількох екземпляри ресурсів)

Отже, ми можемо довести, що існує цикл, який може не призвести до тупикового небезпечний стан з циклом зв'язку цикл, як тільки процес P3 закінчується і відпускає його (пам’ятайте, що P3 не має ніякої залежності і не чекає будь-якого іншого ресурсу).


2
Ласкаво просимо на сайт! Невеликий момент: найкраще уникати фрази "не можна" у письмовій англійській мові, оскільки незрозуміло, чи означає вона "не повинен" ("Ви тут не можете паркуватись") або "може ні" ("Вам може не сподобатися цей фільм ")
Девід Річербі

0

Тривіальний небезпечний стан: Нитка 1 бере блокування A, потім блокування B, а потім розблокує обидва. Нитка 2 приймає замок B, потім блокування A, потім розблокує обидва.

Це призведе до тупикової ситуації лише в тому випадку, якщо Нитка 2 зафіксує замок B просто між Ниткою 1, яка приймає замок A і намагається зняти замок B, або Нитка 1 зафіксує замок A прямо між Ниткою 2, яка приймає замок B і намагається зняти замок A.

Якщо Нитка 1 і Нитка 2 роблять це випадковим чином один раз на годину, і існує мікросекундний проміжок часу, який би фактично призвів до тупикової ситуації. це може працювати дуже довго в руці клієнтів, поки з часом випадково ви не отримаєте тупик.

Пройдіться по вулиці із закритими очима. Це небезпечно. Але тебе не завжди вбивають.

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