Что такое тупик? - PullRequest
       107

Что такое тупик?

131 голосов
/ 29 августа 2008

При написании многопоточных приложений одной из наиболее распространенных проблем являются взаимоблокировки.

Мои вопросы к сообществу:

  1. Что такое тупик?

  2. Как вы их обнаруживаете?

  3. Вы справляетесь с ними?

  4. И, наконец, как вы предотвращаете их появление?

Ответы [ 16 ]

176 голосов
/ 29 августа 2008

A lock происходит, когда несколько процессов пытаются получить доступ к одному и тому же ресурсу одновременно.

Один процесс проигрывает и должен ждать завершения другого.

A deadlock возникает, когда процесс ожидания все еще удерживает другой ресурс, который необходим первому, прежде чем он может завершиться.

Итак, пример:

Ресурс A и ресурс B используются процессом X и процессом Y

  • X начинает использовать A.
  • X и Y пытаются начать использовать B
  • Y 'выигрывает' и получает B первым
  • теперь Y нужно использовать A
  • A заблокирован X, который ждет Y

Лучший способ избежать взаимоблокировок - избегать перекрестного перехода процессов таким образом. Уменьшите необходимость блокировать что-либо как можно больше.

В базах данных избегайте внесения большого количества изменений в разные таблицы в одной транзакции, избегайте триггеров и максимально переключайтесь на оптимистическое / грязное / nolock чтение.

113 голосов
/ 26 февраля 2016

Позвольте мне объяснить реальный (а не реальный) пример тупиковой ситуации из криминальных фильмов. Представьте, что преступник держит в заложниках, и против этого, полицейский также держит заложника, который является другом преступника. В этом случае преступник не собирается отпускать заложника, если полицейский не отпустит своего друга. Также полицейский не собирается отпускать друга преступника, если только преступник не освободит заложника. Это бесконечная ненадежная ситуация, потому что обе стороны настаивают на первом шаге друг от друга.

Криминальная и полицейская сцена

enter image description here

Итак, если двум потокам нужны два разных ресурса и каждый из них имеет блокировку ресурса, который нужен другому, это тупик.

Еще одно объяснение высокого уровня тупика: разбитые сердца

Вы встречаетесь с девушкой, и через день после ссоры обе стороны разбиты друг другу и ждут звонка Мне жаль и я скучал В этой ситуации обе стороны хотят общаться друг с другом тогда и только тогда, когда одна из них получает извините от другой. Поскольку ни один из них не собирается устанавливать связь и ожидает в пассивном состоянии, оба будут ждать, пока другой установит связь, что приводит к тупиковой ситуации.

31 голосов
/ 29 августа 2008

Взаимные блокировки возникают только тогда, когда у вас есть два или более замков, которые могут быть получены одновременно, и они захвачены в другом порядке.

Способы избежать тупиков:

  • избегать блокировок (если возможно),
  • избегайте использования более одного замка
  • всегда берите замки в одном и том же порядке.
18 голосов
/ 07 мая 2015

Чтобы определить тупик, сначала я бы определил процесс.

Процесс : Как мы знаем, процесс - это не что иное, как program в исполнении.

Ресурс : Для выполнения процесса программы требуются некоторые ресурсы. Категории ресурсов могут включать память, принтеры, процессоры, открытые файлы, ленточные накопители, компакт-диски и т. Д.

Deadlock : Deadlock - это ситуация или условие, когда два или более процессов удерживают некоторые ресурсы и пытаются получить дополнительные ресурсы, и они не могут освободить ресурсы до тех пор, пока не завершат работу. там исполнение.

Состояние или ситуация тупика

enter image description here

На приведенной выше схеме есть два процесса P1 и p2 , и есть два ресурса R1 и R2 .

Ресурс R1 выделяется процессу P1 , а ресурс R2 выделяется процессу p2 . Для завершения процесса P1 необходим ресурс R2 , поэтому P1 запрос на R2 , но R2 уже выделено на P2 .

Таким же образом Процесс P2 для завершения своего выполнения требует R1 , но R1 уже выделен для P1 .

оба процесса не могут освободить свой ресурс до тех пор, пока не завершат свое выполнение. Так что оба ждут других ресурсов и будут ждать вечно. Так что это DEADLOCK Условие.

Для возникновения тупика должны быть выполнены четыре условия.

  1. Взаимное исключение - Каждый ресурс в настоящее время либо выделен ровно одному процессу, либо он доступен. (Два процесса не могут одновременно контролировать один и тот же ресурс или быть в их критическом раздел).
  2. Hold and Wait - процессы, в настоящее время хранящие ресурсы, могут запрашивать новые ресурсы.
  3. Без выгрузки - Если процесс удерживает ресурс, он не может быть удален другим процессом или ядром.
  4. Циклическое ожидание - Каждый процесс ожидает получения ресурса, который удерживается другим процессом.

и все эти условия выполняются на диаграмме выше.

7 голосов
/ 29 августа 2008

Тупик возникает, когда поток ожидает чего-то, что никогда не происходит.

Как правило, это происходит, когда поток ожидает мьютекс или семафор, который никогда не был освобожден предыдущим владельцем.

Это также часто случается, когда вы сталкиваетесь с двумя потоками и двумя блокировками, как это:

Thread 1               Thread 2

Lock1->Lock();         Lock2->Lock();
WaitForLock2();        WaitForLock1();   <-- Oops!

Как правило, вы обнаруживаете их, потому что то, что вы ожидаете, никогда не произойдет, или приложение полностью зависает.

4 голосов
/ 04 февраля 2016

Deadlock является распространенной проблемой в многопроцессорных / многопрограммных задачах в ОС. Скажем, есть два процесса P1, P2 и два глобально разделяемых ресурса R1, R2, и в критическом разделе оба ресурса должны быть доступны

Первоначально ОС назначает R1 для обработки P1 и R2 для обработки P2. Поскольку оба процесса работают одновременно, они могут начать выполнять свой код, но ПРОБЛЕМА возникает, когда процесс попадает в критическую секцию. Так что процесс R1 будет ждать, пока процесс P2 выпустит R2, и наоборот ... Так что они будут ждать вечно (СОСТОЯНИЕ ЗАГЛУШКИ).

Небольшая АНАЛОГИЯ ...

Твоя мама (ОС),
Вы (P1),
Твой брат (P2),
Яблоко (R1),
Нож (R2)
критическая секция (резка яблока ножом).

Твоя мать вначале дает тебе яблоко и нож твоему брату.
Оба счастливы и играют (выполняя свои коды).
Любой из вас хочет в какой-то момент разрезать яблоко (критический участок).
Вы не хотите давать яблоко своему брату.
Твой брат не хочет давать тебе нож.
Так что вы оба будете ждать очень долго:)

4 голосов
/ 25 сентября 2013

Вы можете взглянуть на эти замечательные статьи , в разделе Deadlock . Это в C #, но идея остается той же для другой платформы. Я цитирую здесь для легкого чтения

тупик возникает, когда два потока каждый ждут ресурс, удерживаемый другой, так что ни один не может продолжить. Самый простой способ проиллюстрировать это с двумя замками:

object locker1 = new object();
object locker2 = new object();

new Thread (() => {
                    lock (locker1)
                    {
                      Thread.Sleep (1000);
                      lock (locker2);      // Deadlock
                    }
                  }).Start();
lock (locker2)
{
  Thread.Sleep (1000);
  lock (locker1);                          // Deadlock
}
2 голосов
/ 03 февраля 2014

Взаимная блокировка возникает, когда существует круговая цепочка потоков или процессов, каждый из которых удерживает заблокированный ресурс и пытается заблокировать ресурс, удерживаемый следующим элементом в цепочке. Например, два потока, которые содержат соответственно блокировку A и блокировку B, и оба пытаются получить другую блокировку.

1 голос
/ 29 августа 2008

Взаимная блокировка возникает, когда две нити приобретают блокировки, препятствующие прогрессу любой из них. Лучший способ избежать их - это осторожное развитие. Многие встроенные системы защищают от них, используя сторожевой таймер (таймер, который сбрасывает систему всякий раз, когда она зависает в течение определенного периода времени).

0 голосов
/ 02 июня 2019

Проблема тупика

  • Самые ранние компьютерные операционные системы запускали только одну программу за один раз
  • Все ресурсы системы были доступны для этого Программа
  • Позже операционные системы запускали несколько программ одновременно, чередование их
  • В программах требовалось заранее указать, что ресурсы, которые им нужны, чтобы они могли избежать конфликтов с другими одновременно запущенными программами
  • В конце концов некоторые операционные системы предложили динамическое распределение ресурсов
  • Программы могут запрашивать дальнейшее распределение ресурсов после того, как они начали бежать
  • Это привело к проблеме тупика

Набор заблокированных процессов, каждый из которых содержит ресурс и в ожидании получения ресурса, удерживаемого другим процессом в набор

Ситуация, в которой 02 или более конкурирующих действия каждый ждет другого, чтобы закончить, и, следовательно, никогда делает

Характеристика тупика

  • Взаимное исключение
  • Hold & Wait
  • Нет выкупа
  • Круговое ожидание

Методы обработки тупиковых ситуаций

  • Убедитесь, что система никогда не перейдет в тупиковое состояние
  • Разрешить системе перейти в состояние тупика, а затем восстановить
  • Не обращайте внимания на проблему и делайте вид, что тупиков не бывает в системе; используется большинством операционных систем, в том числе UNIX

Предотвращение тупиковых ситуаций

  • Взаимное исключение - не требуется для разделяемых ресурсов; должен храниться для нераздельных ресурсов

  • Hold and Wait - должны гарантировать, что всякий раз, когда процесс запрашивает ресурс, он не содержит никаких других ресурсов

  • Нет выкупа - Если процесс, который удерживает некоторые ресурсы запрашивают другое ресурс, который не может быть сразу же выделяется на него, тогда все ресурсы в настоящее время находятся состоялось освобождение

  • Циркулярное ожидание - Установить общий порядок всех ресурсов типы и требуют, чтобы каждый процесс запрашивал ресурсы в увеличение порядка перечисления

...