ПАРФИЛОВ1 Иван Васильевич СВИРИН2 Илья Сергеевич, кандидат технических наук СИЛИН3 Павел Александрович ШУМИЛОВ4 Юрий Юрьевич, доктор технических наук
ВЕРИФИЦИРУЮЩИЙ АЛГОРИТМ ДЛЯ МАТЕМАТИЧЕСКОЙ МОДЕЛИ ВЗАИМНЫХ БЛОКИРОВОК
Одной из основных проблем многопоточного программного обеспечения являются взаимные блокировки. Проявление взаимных блокировок зависит, от. относительной динамики выполнения потоков, которая, опирается, на слабо прогнозируемые факторы., поэтому данный вид ошибок практически невозможно выявить на этапе тестирования. Взаимная, блокировка приводит, к невозможности дальнейшего выполнения одного или нескольких потоков многопоточного программного обеспечения, что является прямой угрозой безопасности обрабатываемой информации. В данной статье представлена математическая, модель взаимных блокировок. На основе данной модели разработан, алгоритм, выявления взаимных блокировок в многопоточном, программном, обеспечении.
Ключевые слова: многопоточное ПО, взаимные блокировки, верификация.
Deadlocks are one of the main problems of multi-threaded, software. Occurrence of deadlock depends on relative dynamics of thread, execution which relies on factors that are hard, to reproduce.
It makes this type of error almost impossible to detect in the testing stage. Deadlock blocks execution of one or more threads which is direct threat to the security of information, processed, by software. This paper presents a mathematical model of deadlocks and an algorithm for detecting deadlocks based, on this model.
Keywords: multi-threaded, software, deadlocks, verification.
Одной из основных проблем разработки многопоточного ПО является обеспечение доступа различных потоков к разделяемым ресурсам. Для решения данной проблемы современные системы и средства программирования предоставляют средства синхронизации. Однако использование средств синхронизации приводит к проблеме возникновения взаимных блокировок
— ситуаций, когда группа потоков не может продолжать выполнение независимо от действий остальных потоков системы. Ошибки, связанные с взаимной блокировкой потоков, чрезвы-
чайно трудно выявить, поскольку их проявление напрямую связано с относительной динамикой выполнения потоков в ПО, зависящей от множества факторов, которые могут проявиться, например, при переходе на новую платформу или добавлении новой подсистемы. Эта особенность делает принципиально невозможным создание алгоритма выявления взаимных блокировок на этапе тестирования ПО. Существует несколько подходов к решению данной проблемы. Динамический анализ, который основан на мониторинге выполняющейся
программы на предмет обращения к ресурсам и осуществления различных вызовов [2, 8]. Этот подход характеризуется низкими затратами вычислительны ресурсов, однако обладает большим количеством ложных срабатываний и не гарантирует нахождения всех потенциальных ситуаций блокировки.
Статический анализ использует исходные коды или объектные файлы ПО для построения моделей, которые проверяются на наличие блокировок [1, 3 — 5]. Этот подход является достаточно эффективным, хотя порождает
' — инженер-программист Центра специальных технологий ФГУП «ЦНИИ ЭИСУ»;2 — заместитель директора по качеству ОАО «ВНИИНС»;3 — инженер-математик «Topcon Positioning Systems»;4 — профессор НИЯУ «МИФИ».
большое количество ложных срабатываний и плохо применим к ПО со сложной объектной структурой. Верификация моделей по методу Model Checking основана на построении формальной модели ПО [10, 11] с последующей верификацией данной модели с помощью специализированных средств [6, 7]. Этот подход принципиально не дает ложных срабатываний и исключает возможность пропуска блокировок, но чрезвычайно требователен к вычислительным ресурсам. Подход, представленный в данной статье, относится к верификации моделей. Его характерная особенность, являющаяся нетипичной для подходов, связанных с верификацией, заключается в наглядности представления, достаточной для того, чтобы на основе модели могла быть построена система правил корректного использования средств синхронизации. Применение такой системы правил позволит разработчику ПО избегать появления потенциальных ситуаций взаимной блокировки в процессе проектирования и разработки ПО.
Статья организована таким образом, чтобы дать наиболее полное представление о разработанном авторами подходе. С этой целью приводится краткое описание математической модели взаимных блокировок и достаточно полное описание верифицирующего ее алгоритма, которое и является центральной темой статьи.
Математическая модель взаимных блокировок
Модель взаимных блокировок в многопоточном ПО включает четыре класса объектов:
♦ разделяемый ресурс — информационный или функциональный объект, к которому возможен доступ из разных потоков;
♦ субъект доступа — поток, выполняющий доступ к разделяемому ресурсу;
♦ средство синхронизации — средство, ограничивающее доступ субъектов к разделяемым ресурсам посредством перевода субъекта в состояние ожидания доступности разделяемого ресурса;
♦ взаимная блокировка — ситуация, характеризующаяся тем, что группа субъектов находится в состоянии
ожидания и не может быть выведена из него, независимо от действий других субъектов системы.
Субъект доступа
Субъект доступа моделируется на основе системы переходов, т.е. субъект отождествляется с совокупностью своих цепочек выполнения. Данная совокупность описывает всевозможные пути выполнения субъекта с точки зрения взаимодействия со средствами синхронизации от «состояния покоя» до «завершающего состояния», отождествляемого с «состоянием покоя». Отождествление «состояния покоя» и «завершающего состояния» характеризует одно из фундаментальных свойств модели. В ней субъекты доступа «зациклены», т.е. если субъект завершил свое выполнение по некоторому пути выполнения, он не обязательно будет ожидать завершения выполнения остальных субъектов доступа, а может снова начать выполнение по одному из путей.
Для отображения всевозможных путей выполнения субъект может включать в себя точки ветвления и точки зацикливания (согласно структурной теореме Э. Дейкстры [9]). Отметим, что условие, по которому осуществляется выбор той или иной ветви в точке ветвления, и количество итераций цикла в точке зацикливания не являются существенными с точки зрения модели. Средства синхронизации Каждый акт взаимодействия субъекта доступа со средством синхронизации моделируется как выполнение субъектом некоторого оператора, относящегося к средству синхронизации. Средства синхронизации моделируются как совокупность таких операторов. В общем случае в данной модели выделяются четыре примитива синхронизации: нерекурсивный (обычный) исключающий семафор, рекурсивный исключающий семафор (может быть смоделирован на основе нерекурсивного исключающего семафора, поэтому далее не рассматривается), сигнальная переменная с памятью и сигнальная переменная без памяти. Исключающий семафор — это средство синхронизации, которое в конкретный момент времени может быть захвачено только одним субъектом. Если исключающий семафор захвачен каким-то субъектом, то другой
субъект, обращающийся к семафору, переводится в состояние ожидания. Как только семафор освобождается, субъект продолжает свое выполнение. Нерекурсивный (обычный) исключающий семафор описывается двумя операторами взаимодействия — оператором захвата (!,■) и освобождения (Ц), где индекс обозначает номер нерекурсивного семафора.
Сигнальная переменная без памяти
— это средство синхронизации, при взаимодействии с которым субъект попадает в состояние ожидания до тех пор, пока другим субъектом не будет отправлен сигнал об освобождении. Сигнал может быть широковещательным, в таком случае он освобождает все ожидающие субъекты, в противном случае — лишь один. Сигнальная переменная без памяти описывается тремя операторами взаимодействия — оператором ожидания (И,), отправки (Е,) и широковещания (В,).
Сигнальная переменная с памятью
— это средство синхронизации, обладающее целым неотрицательным счетчиком. Взаимодействие субъекта с сигнальной переменной с памятью приводит к уменьшению счетчика, если счетчик в момент взаимодействия уже равен нулю, то субъект переходит в состояние ожидание до тех пор, пока счетчик не будет увеличен другим субъектом. Сигнальная переменная с памятью описывается двумя операторами взаимодействия — оператором ожидания (А,) и установки (Р,).
Время выполнения субъектом оператора взаимодействия полагается равным нулю, поскольку не является существенным параметром с точки зрения модели. На рис. 1 приводится пример графического изображения системы субъектов.
Взаимные блокировки
Взаимные блокировки моделируются как состояния системы субъектов, в которых возникают ситуации, когда группа субъектов не может продолжать выполнение не зависимо от действий остальных субъектов системы. На рис. 1 стрелками показана относительная динамика выполнения субъектов 1 и 2, которая приводит их в состояние взаимной блокировки. Разделяемые ресурсы Разделяемые ресурсы присутствуют в данной модели неявно. Они определя-
Субъект 1
I
Субъект 2
▼і
*4Д
\У1)
® 2 @ © ® Субъект 3
ш.
Рис. 1. Пример графического изображения системы субъектов
ются совокупностью средств синхронизации, обеспечивающих синхронный доступ субъектов к разделяемым ресурсам.
Теперь перейдем непосредственно к модели. Формализуем естественное отношение порядка («до» — «после»), возникающее между двумя операторами в рамках одного пути выполнения субъекта. Будем говорить, что і-й и у-й исключающие семафоры сравнимы по к-му субъекту, причем і-й исключающий семафор локально меньше у-го, и писать: т(Бк, і) ◄і т(Бк, Ьу), если на пути выполнения к-го субъекту у-й семафор захватывается до того, как -- й семафор отпущен после захвата.
Расширим введенную операцию. Будем сравнивать исключающие семафоры, принадлежащие различным субъектам. Будем говорить, что -- й исключающий семафор к-го субъекта локально меньше у-го семафора т-го субъекта, и писать т(Бк, т(Бт, Ьу),
если существует такое натуральное п > 1, такие субъекты Бх/1),..., Бх/п-1) и исключающие семафоры у(1),..., у(п-1) такие, что
т(Бк, Ьі) ◄! т(Бк, Ьу(1)); т(Бх(1), Ьу(1)) ◄! т(Бх(1), Ьу(2))/ т(Бх(п -1)1 Ьу(п-1)) ◄ь т(Бх(п-1)г Ьу(п)); т(Бт, Ьу(п)) ◄і т(Бт, Ьу),
где для каждого из субъектов операция ◄ Ь была введена выше.
Будем говорить, что г-й исключающий семафор т-го субъекта локально меньше у-й сигнальной переменной с памятью (без памяти) т-го субъекта, и писать т(Бт, Ьг) ◄ т(Бт, Ау (И)), если взаимодействие с оператором ожидания у-й сигнальной переменной происходит после захвата г-го исключа-
ющего семафора и до его отпускания. В дальнейшем отсутствие уточнения по поводу принадлежности некоторой сигнальной переменной к переменным без памяти или с памятью означает, что данная переменная может быть произвольного типа.
Будем говорить, что в системе субъектов Б = (Бі,..., Бп} і-я сигнальная переменная находится под локальным влиянием у-й переменной, если существует субъект Бк из Б, путь выполнения которого содержит оператор установки і-й сигнальной переменной с памятью (оператор отправки или широковещания для переменной без памяти) и оператор ожидания у-й переменной, либо существует субъект Бк из Б, путь выполнения которого содержит оператор установки і-й сигнальной переменной с памятью (оператор отправки или широковещания для переменной без памяти) и оператор захвата р-го исключающего семафора, причем выполнены следующие условия:
т(Бк, Ьр) ◄ь т(Бт, Ьг) и Т(Бт, Ьг) ◄ь Т(Бт, Ау (Щ)).
В этом случае будем писать т(Бк, Р1 (Е, Ві)) Т т(Бт, А (Иу)),
где, возможно, т. = к.
Предположим, что есть система субъектов Б = (Б,..., Бп}, взаимодействующих с сигнальными переменными (1,... , к}. Система субъектов Б называется локально слабо упорядоченной по сигнальным переменным, если для любого подмножества (і1,..., іу} из (1,..., к} сигнальных переменных не суще-
ствует такого состояния системы, при которой каждый оператор отправки, широковещания и установки Еи (Ви, Ри), где и из {г1у}, находился бы под локальным влиянием:
т(Бр, Еи (Ви)) ▼ %(БЧ, (А)),
где V из {¡¡,..., 1у}, т.е. все операторы широковещания, отправки и установки из данного множества одновременно находятся под локальным влиянием операторов ожидания из данного множества. Кроме того, в системе не существует сигнальных переменных, для которых присутствуют только операторы ожидания, но нет операторов отправки, широковещания или установки.
Под декомпозицией будем понимать замену цикла точкой ветвления, где одна ветвь содержит цикл точки ветвления, а другая не содержит операторов взаимодействия. Под линеаризацией будем понимать замену системы исходных субъектов на множество систем, полученных всевозможными заменами субъектов исходной системы на субъекты, реализующие произвольные пути их выполнения.
Сформулируем основной результат математической модели взаимных блокировок, который является логическим основанием всех правил корректного использования средств синхронизации на основе данной модели. Теорема. Пусть дана система субъектов Б = {Б,..., Бп} с точками ветвления и точками зацикливания, а система Б0 получена линеаризацией субъектов системы Б по точкам зацикливания. Если для каждой системы Б00 из множества всех различных систем субъектов, в которых на г-ом месте находится субъект из декомпозиции Б0 выполняются условия:
1) для любого исключающего семафора (например, у-го) не выполняются соотношения вида %(Бк00, у ◄ %(БШ00, у
2) система Б00 слабо локально упорядочена относительно сигнальных переменных, то в системе Б нет потенциальных ситуаций взаимной блокировки.
Верифицирующий алгоритм
Теорема о достаточном условии отсутствия потенциальных ситуаций взаим-
Компонента 1
Рис. 2.
ной блокировки в общем случае сводит анализ системы субъектов к анализу некоторого множества систем линейных субъектов, полученных в результате декомпозиции и линеаризации из субъектов исходной системы. Достаточные условия являются совокупностью условий, накладываемых на каждую систему из данного множества. Алгоритм поиска направлен на анализ каждой из систем данного множества. Идея, лежащая в основе алгоритма поиска, заключается в сведении систем линейных субъектов к ориентированным и графам. Вершинами этих графов будут являться операторы взаимодействия со средствами синхронизации, принадлежащие субъектам данной системы, ребра будут соответствовать соотношениям, возникающим между данными операторами в рамках системы субъектов. Рассмотрим правила, по которым будет строиться это соответствие:
♦ если два оператора захвата исключающего семафора Ьі и Ьу принадлежат одному субъекту системы Бк, причем выполнено соотношение т(Бк, Ь) ◄ т(Бк, Ь) (т.е. і-й исключающий семафор локально меньше у-го), то между вершинами, соответствующими операторам Ьі и Ьу, существует ребро, причем направлено оно от вершины, соответствующей оператору Ьі, к вершине, соответствующей оператору Ьу;
♦ если два оператора захвата исключающего семафора і и і принадлежат субъектам системы Бк и Бт, то между вершинами, соответствующими этим операторам, существует как ребро, направленное от одной вершины к другой, так и ребро, направленное в обратном направлении, возможно, к = т;
♦ если оператор захвата исключающего семафора Ьі и оператор ожидания сигнальной переменной Щ (Ау) принадлежат одному субъекту системы Бк, причем выполнено соотношение т(Бк, Ь) ◄ т(Бк, Щ (Ау)) (т.е. і-й исключающий семафор локально меньше у'-й сигнальной переменной), то между вершинами, соответствующими операторам Ьі и Щу (Ау), существует ребро, причем направлено оно от вершины, соответствующей оператору Ьі, к вершине, соответствующей оператору Щу (Ау);
♦ если субъект системы Бк содержит оператор отправки, широковещания или установки Еі (В,, Р), то для каждого оператора захвата исключающего семафора Ьу или оператора ожидания сигнальной переменной без памяти (с памятью) Щт (Ат), который так же содержит субъект системы Бк, существует ребро, направленное от вершины, соответствующей оператору Еі (В,, Р), к вершине, соответствующей данному оператору (в общем случае возможно і = т);
♦ если один из субъектов системы Бк содержит оператор ожидания сигнальной переменной без памяти Щі, то для любого оператора Еі (В), содержащегося в одном из субъектов системы, существует ребро, направленное от вершины, соответствующей оператору Щі, к вершине соответствующей оператору Еі (В) (то же верно для сигнальных переменных с памятью с точностью до замены оператора Щі на Аі и оператора Е, (В) на Р,).
Естественность такого соответствия основана на том, что на неформальном уровне направленное от первой вершины ко второй ребро олицетворяет собой зависимость успешного выполнения оператора, соответствующего первой вершине, от успешного выполнения оператора, соответствующего второй. Отсюда следует естественность определения состояния, при попадании в которое гарантированно возникает взаимная блокировка как замкнутой цепочки зависимостей (т.е. сильно связной компоненты). Введем
понятие подозрительных сильно связных компонент, которые будут являться аналогами состояний, при попадании в которые гарантированно возникает взаимная блокировка. Определение. Ориентированный граф, построенный по системе линейных субъектов Б с использованием только первых двух правил построения ребер, будем называть частным ориентированным графом системы линейных субъектов Б. Ориентированный граф, построенный по системе линейных субъектов Б с использованием всех пяти правил построения ребер, будем называть общим ориентированным графом системы линейных субъектов Б.
Граф, изображенный на рис. 2, построен по системе субъектов Б, представленной на рис. 1. Отдельно взятая компонента 1 является частным графом системы субъектов Б, совокупность компонент 1 и 2 — общим графом системы.
Определение. Будем называть сильно связную компоненту графа, построенного по системе линейных субъектов Б, подозрительной сильно связной компонентой 1-го рода, если она содержит операторы захвата хотя бы двух различных исключающих семафоров (например, Ь1 и Ьу).
Определение. Будем называть сильно связную компоненту графа, построенного по системе линейных субъектов Б, подозрительной сильно связной компонентой 2-го рода, если она содержит более одной вершины и для некоторого непустого множества сигнальных переменных {и,..., г} в нее входят все их операторы отправки, широковещания
и установки. Множество (іі,..., і„} будем называть множеством сигнальных переменных подозрительной сильно связной компоненты 2-го рода. Будем называть связную компоненту графа, построенного по системе линейных субъектов Б, подозрительной связной компонентой 2-го рода, если она содержит более одной вершины и хотя бы один оператор отправки (широковещания или установки).
Отметим, что моделирование на основе графов не учитывает существования соотношений, которые могут не реализовываться в общем состоянии, так как все ребра графа существуют одновременно. В этом отношении предложенный подход теряет свою естественность, поскольку наличие подозрительной сильно связной компоненты может не влечь наличие замкнутой цепочки зависимостей в том случае, если не все ребра этой компоненты (и, как следствие, не все зависимости в замкнутой цепочке) могут реализовываться в некотором общем состоянии. Данное рассуждение приводит к понятию целостности компоненты. Определение. Сильно связная компонента графа, построенного по системе линейных субъектов Б, называется целостной, если существует такое состояние исходной системы Б, в котором одновременно реализуются все соотношения, соответствующие ребрам этой компоненты.
Рассмотрим систему субъектов Б, изображенную на рис. 1, и ее общий ориентированный граф, изображенный на рис. 2. Компонента 1 является целостной, а компонента 2 не обладает этим свойством, поскольку ребра 1 и 2 соответствуют соотношениям, которые не могут быть реализованы в общем состоянии.
Отсюда получается, что если подозрительная компонента является целостной, то замкнутая цепочка зависимостей существует, т.е. обнаружение данной компоненты не будет ложным срабатыванием алгоритма поиска. Вышеописанные рассуждения приводят к следующей теореме, на которой основан алгоритм.
Теорема. Пусть имеется система линейных субъектов Б=(Б1,..., Б„}. Пусть в данной системе не выполняются соотношения вида т(Бк, Ьі) т(Бк, Ь), и
нет сигнальных переменных, обладаю-
щих только операторами ожидания и без операторов ожидания. Тогда поиск в системе соотношений вида т(Бк, Ь) ◄ь т(Бш, Ь) может быть сведен к поиску в частном ориентированном графе системы подозрительных сильно связных компонент 1-го рода. Поиск нарушений слабой локальной упорядоченности системы относительно сигнальных переменных может быть сведен к поиску в общем ориентированном графе системы подозрительных сильно связных компонент 2-го рода. В обоих случаях поиск не будет иметь ложных срабатываний, если все подозрительные сильно связные компоненты будут целостными. Доказательство теоремы вытекает из вышеописанных соображений.
Далее приводится описание алгоритма поиска в виде последовательности шагов.
Л Система субъектов Б0 подвергается линеаризации по точкам зацикливания и декомпозиции по точкам ветвления. Затем для каждой системы линейных субъектов Б из этого множества применяются остальные шаги алгоритма. 12 По системе линейных субъектов Б строится ее частный ориентированный граф. В процессе построения графа выявляется, есть ли в системе отношения вида т(Бк, Ь) ◄ т(Бк, Ь) и сигнальных переменных без операторов ожидания или только с операторами ожидания. Наличие соотношений вида т(Бк, Ь) ◄ь т(Бк, Ьг) проверяется при проходе графа путем анализа концов каждого из построенных ребер внутри одного субъекта. Наличие сигнальных переменных проверяется с помощью хранения в памяти переменных, которым не достает соответствующих операторов, и удаления из памяти, когда при проходе графа встречаются соответствующие операторы.
Е С помощью алгоритма Тарьяна [12] граф разбивается на множество сильно связных компонент. Каждая сильно связная компонента анализируется на предмет того, является ли она подозрительной сильно связной компонентой 1-го рода.
14 Все подозрительные компоненты проверяются на предмет ложных срабатываний (проверка целостности). Проверка осуществляется с помощью алгоритма избавления от ложных срабатываний, описанного далее.
Е По системе линейных субъектов Б строится ее общий ориентированный граф.
Е С помощью алгоритма Тарьяна ориентированный граф разбивается на связные компоненты. Каждая сильно связная компонента анализируется на предмет того, содержит ли она более одной вершины и хотя бы один оператор отправки (широковещания или установки).
^7 С помощью алгоритма Тарьяна каждая подозрительная связная компонента К разбивается на сильно связные компоненты. Каждая сильно связная компонента К0 подвергается дальнейшему анализу. Отбираются компоненты, которые содержат операторы отправки (широковещания или установки) сигнальных переменных и состоят более чем из одной вершины. ^8 Каждая такая сильно связная компонента К0 связной компоненты К подвергается анализу. Если все операторы отправки (широковещания и установки) сигнальных переменных, которые присутствуют в К0, лежат в К0 (в общем случае они могут лежать в К), то процесс завершается. В противном случае компонента К1 получается из К0 отбрасыванием из нее всех операторов, относящихся к переменным, операторы отправки которых (широковещания или установки) лежат в К, но не в К0. Далее к компоненте К1 алгоритм применяется рекурсивно начиная с шага 6. Процесс завершится, когда будут исключены все сигнальные переменные, либо когда останется сильно связная компонента, которая содержит все операторы отправки (широковещания и установки) сигнальных переменных, которые в ней присутствуют. Такие компоненты назовем подозрительными.
^9 Подозрительные сильно связные компоненты 2-го рода проверяются на предмет ложных срабатываний (проверка целостности). Проверка осуществляется с помощью алгоритма избавления от ложных срабатываний, описанного далее.
Теперь опишем процесс избавления от ложных срабатываний. Алгоритм избавления от ложных срабатываний направлен на анализ подозрительных сильно связных компонент 1-го и 2-го родов, которые не обладают свойством целостности. Идея алгоритма заклю-
чается в отбрасывании из исходной компоненты ребер до тех пор, пока оставшаяся компонента не станет целостной. Опишем алгоритм в виде последовательности шагов.
Л Из подозрительной сильно связной компоненты К0 удаляются все ребра, относящиеся к субъекту Б1. Затем из множества ребер, относящихся к субъекту Б1, выделяются всевозможные максимальные подмножества ребер, которые соответствуют реализующимся в общем состоянии соотношениям. Под максимальностью понимается то, что к каждому из этих подмножеств уже нельзя добавить еще одно ребро, чтобы соответствующие им соотношения сохраняли свойства реализуемости в общем состоянии. Затем для каждого такого подмножества его ребра добавляются в граф вместо отброшенных ребер субъекта Б1 (то есть все множество ребер заменили в каждом случае на максимальное подмножество, реализующееся в общем состоянии). Каждая из полученных на этом шаге компонент {К11,..., КЛ1)(а они могут перестать быть даже связными) анализируется на наличие подозрительных сильно связных компонент. Анализ производится методами основного алгоритма, где в роли исходного графа выступают полученные компоненты К/.
Л Анализируются все компоненты К1, полученные на шаге 1, которые содержат подозрительные сильно связные компоненты. На шаге 2 для каждой такой компоненты Кг1 действия производятся над компонентами субъекта Б2. Таким образом, в основе алгоритма лежит дерево решений, ветвления которого происходят при переходе к новому субъекту. Ветвь решений заканчивается, когда на некотором шаге полученная компонента К{ больше не имеет подозрительных сильно связных компонент. Те ветви, которые содержат подозрительные сильно связные компоненты после последнего №го шага (в системе субъектов {Б1,..., Бм}), соответствуют действительным срабатываниям. Непосредственной проверкой можно показать, что сложность алгоритма без проверки на ложность срабатываний есть 0(п5), где п — число операторов взаимодействия со средствами синхронизации субъектов исходной системы. При добавлении проверки на ложные срабатывания сложность алгоритма
возрастает до 0(п||Б||+7), где ||Б|| — число субъектов в исходной системе.
Заключение
В данной статье описана математическая модель взаимных блокировок и алгоритм проверки ее корректности (отсутствия в ней взаимных блокировок). Представленный алгоритм поиска подозрительных сильно связных компонент не является алгоритмом поиска потенциальных ситуаций взаимной блокировки субъектов исходной системы субъектов Б. Поскольку, согласно модели взаимных блокировок, отсутствие срабатываний алгоритма гарантирует выполнение условий, необходимых для отсутствия потенциальных ситуаций блокировки в исходной системе субъектов Б. Следовательно, представленный алгоритм является алгоритмом проверки выполнения достаточных условий отсутствия потенциальных ситуаций блокировки в системе субъектов Б.
Заметим, что хотя алгоритм имеет полиномиальную сложность (относительно числа операторов взаимодействия со средствами синхронизации) для каждой из полученных в результате декомпозиции и линеаризации систем линейных субъектов, в общем случае сложность анализа исходной системы Б может оказаться экспоненциальной, поскольку в процессе декомпозиции и линеаризации исходной системы Б может получится экспоненциальное (относительно числа операторов взаимодействия со средствами синхронизации) число систем линейных субъектов, каждую из которых необходимо подать на вход алгоритма. Однако возникновение таких сложных систем Б маловероятно, поскольку на практике число ветвлений и зацикливаний (на основе которых реализуется логика системы), а главное, их вложенность, на несколько порядков меньше числа операторов взаимодействия со средствами синхронизации ■
Литература
1. C. Artho and A. Biere. Applying Static Analysis to Large-Scale, Multi-threaded Java Programs. In D. Grant, editor, 13th Australien Software Engineering Conference./ IEEE Computer Society, August 2001. — РР. 68 — 75.
2. S. Bensalem and K. Havelund. Dynamic Deadlock Analysis of Multi-threaded. Programs./ In Shmuel Ur, Eyal Bin, and. Yaron Wolfsthal, editors. /Haifa Verification. Conference, Springer, 2005. — V. 3875 of LNCS. — PP. 208 — 223.
3. D.L. Detlefs, K. Rustan M. Leino, G. Nelson, and J. B. Saxe. Extended Static Checking. Technical Report 159./ Compaq Systems Research. Center, Palo Alto, California, USA, 1998.
4. D. Engler and. K. Ashcraft. RacerX: Effective, Static Detection of Race Conditions and. Deadlocks./ In Proceedings of the 19th ACM Symposium, on Operating Systems Principles, Oct. 2003. — PP. 237 — 252.
5. K. Havelund. and. T. Pressburger. Model Checking Java Programs using Java./ PathFinder. International Journal on Software Tools for Technology Transfer, 2(4):366—381, April 2000. Special issue of STTT containing selected submissions to the 4th SPIN workshop, Paris, France, 1998.
6. G. Holzmann. Design and. Validation of Computer Protocols. Prentice Hall, 1991.
7. L. Lamport. Specifying Systems: The TLA+ Language and. Tools for Hardware and. Software Engineers. Addison-Wesley, 2002.
8. S. Savage, M. Burrows, G. Nelson, P. Sobalvarro, and T. Anderson. Eraser: A Dynamic Data Race Detector for Multi-threaded. Programs. In Proceedings of the 16th ACM Symposium, on Operating Systems Principles, Oct. 1997. — PP. 27 — 37.
9. Дал У., Дейкстра Э., Хоор К. Структурное программирование = Structured. Programming. — 1-е изд. — М.: Мир, 1975.
10. Э. Кларк, О. Грамберг, Д. Пелед. Верификация, моделей программ: Model Checking. — М.: МНЦМО, 2002.
11. Ю. Карпов. Model Checking: верификация, параллельных и распределенных программных систем.. — СПб.: БХВ-Петербург, 2010.
12. Р. Седжвик. Фундаментальные алгоритмы, на C++. Алгоритмы, на графах./ Пер. с англ. — СПб: ООО «ДиаСофтЮП», 2002.