Взаимная блокировка
Взаимная блокировка (Deadlock или Deadly
Embrace) — это ситуация в многозадачной си-
стеме, когда несколько задач находятся в со-
стоянии бесконечного ожидания доступа к ре-
сурсам, занятым самими этими задачами [8].
Простейший пример взаимной блокиров-
ки включает две задачи — задачу А и задачу Б
и два мьютекса — мьютекс 1 и мьютекс 2.
Взаимная блокировка может произойти при
такой последовательности событий:
Выполняется задача А, которая успешно
•
захватывает мьютекс 1.
Задача Б вытесняет задачу А.
•
Задача Б успешно захватывает мьютекс 2,
•
после чего пытается захватить и мьютекс 1.
Это ей не удается, и она блокируется в ожи-
дании освобождения мьютекса 1.
Управление снова получает задача А. Она
•
пытается захватить мьютекс 2, однако он
уже захвачен задачей Б. Поэтому задача
А блокируется в ожидании освобождения
мьютекса 2.
В итоге получаем ситуацию, когда задача А
заблокирована в ожидании освобождения мью-
текса 2, захваченного задачей Б. Задача Б забло-
кирована в ожидании освобождения мьютек-
са 1, захваченного задачей А. Графически эта
ситуация представлена на рис. 8.
Впрочем, в состояние взаимной блокиров-
ки может попасть любое количество задач,
находящихся в круговой зависимости друг
от друга. Если ситуация взаимной блокиров-
ки единожды наступила, то выход из этой си-
туации невозможен.
Как и в случае с инверсией приоритетов,
лучший способ избежать взаимной блоки-
ровки задач — это исключить такую возмож-
ность на этапе проектирования программы,
то есть не создавать круговой зависимости
задач друг от друга.
Следует отметить, что помимо рассмо-
тренных выше проблем совместного доступа
к ресурсам существуют еще такие, как голо-
дание (Starvation) и разновидность взаимной
блокировки, при которой задачи не блокиру-
ются, но и не выполняют полезной работы
(Livelock). Подробнее с ними можно ознако-
миться в [9].
Достарыңызбен бөлісу: |