Взаимная блокировка
Материал из Википедии — свободной энциклопедии
Взаи́мная блокиро́вка (англ. deadlock) — ситуация в многозадачной среде, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, захваченных самими этими процессами.
[править] Простейший пример взаимной блокировки
Процесс 1 | Процесс 2 |
---|---|
Хочет захватить A и B, начинает с A | Хочет захватить A и B, начинает с B |
Захватывает ресурс A | |
Захватывает ресурс B | |
Ожидает освобождения ресурса A | |
Ожидает освобождения ресурса B | |
Взаимная блокировка |
Отладка взаимных блокировок, как и других ошибок синхронизации, усложняется тем, что для их возникновения нужны специфические условия одновременного выполнения нескольких процессов (в вышеописанном примере если бы процесс 1 успел захватить ресурс B до процесса 2, то ошибка не произошла бы).
[править] Livelock
Это слово означает такую ситуацию: система не «застревает» (как в обычной взаимной блокировке), а занимается бесполезной работой, её состояние постоянно меняется — но, тем не менее, она «зациклилась», не производит никакой полезной работы.
Жизненный пример такой ситуации: двое встречаются лицом к лицу. Каждый из них пытается посторониться, и они не расходятся, а несколько секунд ходят влево-вправо.
Существуют алгоритмы обнаружения взаимной блокировки и удаления ее. В то же время такие алгоритмы могут привести к livelock — взаимная блокировка образуется, сбрасывается, снова образуется, снова сбрасывается и так далее.