<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0</id>
	<title>Взаимная блокировка - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0&amp;action=history"/>
	<updated>2026-07-18T06:00:15Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0&amp;diff=34006&amp;oldid=prev</id>
		<title>imported&gt;Sldst-bot: В ш:Список примеров добавлена дата установки: 2015-01-18</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0&amp;diff=34006&amp;oldid=prev"/>
		<updated>2025-03-02T00:49:01Z</updated>

		<summary type="html">&lt;p&gt;В &lt;a href=&quot;/mediawiki/index.php?title=%D0%A8:%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%BE%D0%B2&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Ш:Список примеров (страница не существует)&quot;&gt;ш:Список примеров&lt;/a&gt; добавлена дата установки: &lt;a href=&quot;/mediawiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F/68025161&quot; title=&quot;Служебная:Изменения/68025161&quot;&gt;2015-01-18&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Файл:Process deadlock.svg|thumb|right|200px|Взаимная блокировка двух процессов P1 и P2 нуждающихся в двух ресурсах.]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Взаи́мная блокиро́вка&amp;#039;&amp;#039;&amp;#039; (сокращённо &amp;#039;&amp;#039;&amp;#039;взаимоблокировка&amp;#039;&amp;#039;&amp;#039;, {{lang-en|deadlock}}) — ситуация в многозадачной среде или [[СУБД]], при которой несколько [[Процесс (информатика)|процессов]] находятся в состоянии ожидания [[Вычислительные ресурсы|ресурсов]], занятых друг другом, и ни один из них не может продолжать свое выполнение{{sfn|Квиттнер|с=334—337|1980}}.&lt;br /&gt;
&lt;br /&gt;
== Простейший пример взаимной блокировки ==&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
!Шаг!!Процесс 1 !! Процесс 2&lt;br /&gt;
|-&lt;br /&gt;
|0||Хочет захватить A и B, начинает с A || Хочет захватить A и B, начинает с B&lt;br /&gt;
|-&lt;br /&gt;
|1||Захватывает ресурс A || Захватывает ресурс B&lt;br /&gt;
|-&lt;br /&gt;
|2||Ожидает освобождения ресурса B || Ожидает освобождения ресурса A&lt;br /&gt;
|-&lt;br /&gt;
|3|| colspan=2|&amp;lt;center&amp;gt; Взаимная блокировка&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Отладка взаимных блокировок, как и других ошибок синхронизации, усложняется тем, что для их возникновения нужны специфические условия одновременного выполнения нескольких [[Процесс (информатика)|процессов]] (в вышеописанном примере если бы процесс 1 успел захватить ресурс B до процесса 2, то ошибка не произошла бы).&lt;br /&gt;
&lt;br /&gt;
== Динамическая взаимоблокировка ==&lt;br /&gt;
Динамическая взаимоблокировка ({{lang-en|livelock}}) означает такую ситуацию: система не «застревает» (как в обычной взаимной блокировке), а занимается бесполезной работой, её состояние постоянно меняется — но, тем не менее, она «[[зацикливание|зациклилась]]», не производит никакой полезной работы.&lt;br /&gt;
&lt;br /&gt;
Жизненный пример такой ситуации: двое встречаются лицом к лицу. Каждый из них пытается посторониться, но они не расходятся, а несколько секунд сдвигаются в одну и ту же сторону.&lt;br /&gt;
&lt;br /&gt;
== Обнаружение взаимных блокировок ==&lt;br /&gt;
Поиск &amp;#039;&amp;#039;взаимных блокировок&amp;#039;&amp;#039; осуществляется путём построения и анализа [[граф ожидания|графа ожидания]]. В графе ожидания узлами отмечаются процессы и объекты. &amp;#039;&amp;#039;Блокировки&amp;#039;&amp;#039; отмечаются рёбрами, направленными от узла, соответствующего захваченному объекту, к узлу, соответствующему захватившему его процессу. &amp;#039;&amp;#039;Ожидания&amp;#039;&amp;#039; отмечаются рёбрами, направленными от узла, соответствующего ожидающему процессу, к узлу, соответствующему ожидаемому объекту.&lt;br /&gt;
&lt;br /&gt;
Цикл в графе ожидания соответствует &amp;#039;&amp;#039;взаимной блокировке&amp;#039;&amp;#039;. Существует специальный алгоритм поиска [[Цикл (теория графов)|циклов в графе]].&lt;br /&gt;
&lt;br /&gt;
Существуют алгоритмы удаления &amp;#039;&amp;#039;взаимной блокировки&amp;#039;&amp;#039;. В то же время, выполнение алгоритмов поиска удаления взаимных блокировок может привести к &amp;#039;&amp;#039;динамической взаимоблокировке&amp;#039;&amp;#039; — &amp;#039;&amp;#039;взаимная блокировка&amp;#039;&amp;#039; образуется, сбрасывается, снова образуется, снова сбрасывается и так далее.&lt;br /&gt;
&lt;br /&gt;
Кроме того, эти алгоритмы реализуются диспетчером ресурсов — программой, отвечающей за [[Блокировка (программирование)|блокировку]] и разблокировку. Если же часть занятых в блокировке ресурсов распределяется кем-то другим, обнаружение &amp;#039;&amp;#039;взаимной блокировки&amp;#039;&amp;#039; невозможно. К примеру, [[СУБД Oracle]] обнаруживает взаимную [[Блокировка (СУБД)|блокировку]] запросов к её базам данных, но если в приведенном примере объекты — это поле базы и, к примеру, файл на жестком диске, взаимная блокировка обнаружена не будет — СУБД этот файл не обрабатывает и для неё взаимной блокировки нет.&lt;br /&gt;
&lt;br /&gt;
Практически об устранении взаимных блокировок надо заботиться ещё на этапе проектирования системы — это единственный более-менее надежный способ борьбы с ними. В крайнем случае, когда основная концепция не допускает возможности избежать взаимных блокировок, следует хотя бы строить все запросы ресурсов так, чтобы такие блокировки безболезненно снимались.&lt;br /&gt;
&lt;br /&gt;
== Предотвращение взаимной блокировки ==&lt;br /&gt;
Классический способ борьбы с проблемой — разработка иерархии блокировок: между блокировками устанавливается отношение сравнения и вводится правило о запрете захвата «большей» блокировки в состоянии, когда уже захвачена «меньшая». Таким образом, если процессу нужно несколько блокировок, ему нужно всегда начинать с самой «большой» — предварительно освободив все захваченные «меньшие», если такие есть — и затем в нисходящем порядке. Это может привести к лишним действиям (если «меньшая» блокировка нужна и уже захвачена, она освобождается только чтобы тут же быть захваченной снова), зато гарантированно решает проблему.&lt;br /&gt;
&lt;br /&gt;
В некоторых случаях, особенно в поделенных на модули системах, это также усложняет архитектуру. Так, например, в межмодульном интерфейсе приходится вводить вызовы, которые не делают ничего, кроме захвата и освобождения неких блокировок в модуле. Такой подход используется в файловых системах [[Windows]] в их интерфейсе взаимодействия с подсистемами кэша и виртуальной памяти.&lt;br /&gt;
&lt;br /&gt;
Прочие алгоритмы:&lt;br /&gt;
&lt;br /&gt;
{{список примеров|дата=2015-01-18}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Алгоритмы и методы предотвращения взаимной блокировки&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Название&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Условия Коффмана&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Описание&lt;br /&gt;
|-&lt;br /&gt;
| {{iw|Banker%27s_algorithm|Алгоритм Банкира}} || [[взаимное исключение]] || &amp;#039;&amp;#039;&amp;#039;Алгоритм Банкира&amp;#039;&amp;#039;&amp;#039; — это алгоритм {{iw|Resource allocation|распределения ресурсов}} и обхода взаимоблокировок, разработанный [[Дейкстра, Эдсгер Вибе|Э. Дейкстра]].&lt;br /&gt;
|-&lt;br /&gt;
| Алгоритм предотвращения рекурсивных блокировок || [[взаимное исключение]] || Предотвращает захват потоком одной и той же блокировки несколько раз.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Задача об обедающих философах]]&lt;br /&gt;
* [[Состояние гонки]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{Примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга | автор = Квиттнер П. | заглавие = Задачи, программы, вычисления, результаты | место = М. | издательство  = Мир&lt;br /&gt;
 | год = 1980 | страниц = 422 | isbn = | ref = Квиттнер}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [https://web.archive.org/web/20050504052535/http://www-db.in.tum.de/research/projects/dda.html Deadlock Detection Agents]&lt;br /&gt;
* Paper «[http://www.cs.ucl.ac.uk/staff/w.emmerich/publications/ESEC01/ModelChecking/ Deadlock Detection in Distributed Object Systems]» by Nima Kaveh and Wolfgang Emmerich&lt;br /&gt;
* Article «[https://web.archive.org/web/20151102065120/http://www.cse.scu.edu/~jholliday/dd_9_16.htm Distributed Deadlock Detection]» by JoAnne L. Holliday and Amr El Abbadi&lt;br /&gt;
* Article «[http://doi.acm.org/10.1145/45075.46163 Deadlock detection in distributed databases]» by Edgar Knapp&lt;br /&gt;
* Article «[http://www.onjava.com/pub/a/onjava/2004/10/20/threads2.html Advanced Synchronization in Java Threads]» by Scott Oaks and Henry Wong&lt;br /&gt;
* Paper «[http://www.havelund.com/Publications/padtad06.pdf Confirmation of Deadlock Potentials Detected by Runtime Analysis]» by Saddek Bensalem, Jean-Claude Fernandez, Klaus Havelund and Laurent Mounier&lt;br /&gt;
* [http://www.cs.umass.edu/~mcorner/courses/691J/papers/TS/coffman_deadlocks/coffman_deadlocks.pdf Coffman, E.G., M.J. Elphick, and A. Shoshani, System Deadlocks, ACM Computing Surveys, 3, 2, 67-78 (1971)].&lt;br /&gt;
* Paper [http://citeseer.ist.psu.edu/326777.html Eliminating Receive Livelock in an Interrupt-driven Kernel] by Jeffrey C. Mogul, K. K. Ramakrishnan&lt;br /&gt;
* [[c2:DeadLock|DeadLock]] at the Portland Pattern Repository&lt;br /&gt;
* [http://www.etymonline.com/index.php?term=deadlock Etymology of «Deadlock»]&lt;br /&gt;
* [https://web.archive.org/web/20170918211548/http://arcs.us/ ARCS — A Web Service approach to alleviating deadlock]&lt;br /&gt;
* [http://zhidba.ru/index.php/stati/oracle/138-vsaimblok-oracle-1 Взаимные блокировки Oracle]&lt;br /&gt;
{{Нет сносок в данной статье|дата=2021-01-31}}{{Внешние ссылки}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Ошибки программирования]]&lt;br /&gt;
[[Категория:Управление конкурентными потоками]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Sldst-bot</name></author>
	</entry>
</feed>