Научная статья на тему 'Верификация параллельных программ'

Верификация параллельных программ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
239
54
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ВЕРИФИКАЦИЯ / ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ / СПЕЦИФИКАЦИЯ / МЕТОД ДЕЙКСТРЫ / СЕТИ ПЕТРИ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Езова Наталья Сергеевна, Кузнецов Денис Борисович

Классическим способом доказательства правильности программ является использование системы Дейкстры. Эта система изначально предназначана для однопоточной последовательной программы. Рассматривается возможность применения системы Дейкстры к верификации параллельных программ.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Езова Наталья Сергеевна, Кузнецов Денис Борисович

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Верификация параллельных программ»

УДК 519.681

Н.С. Езова, Д.Б. Кузнецов

Пермский национальный исследовательский политехнический университет

ВЕРИФИКАЦИЯ ПАРАЛЛЕЛЬНЫХ ПРОГРАММ

Классическим способом доказательства правильности программ является использование системы Дейкстры. Эта система изначально предназначана для однопоточной последовательной программы. Рассматривается возможность применения системы Дейкстры к верификации параллельных программ.

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

Параллельное программирование, суть которого заключается в использовании преимуществ многоядерных пли многопроцессорных компьютеров - разделении процесса на несколько выполняющихся «параллельно» потоков, сложнее реализовывать, чем последовательное, поэтому его необходимо подвергать строгому анализу и проверке с помощью различных методов верификации.

Классические методы верификации Р. Флойда [4], Ч. Хоара [5] и Э. Дейкстры [3] рассчитаны на императивные однопоточные программы.

Тем не менее, эти проверенные временем методы можно использовать в параллельном программировании, подвергнув некоторым модификациям.

Книга Ю.Г. Карпова [2] в данном случае подходит не в полной мере, потому что там рассматривается метод формальной верификации тойЫ сИеск/^, для применения которого система представляется

в виде переходов с конечным числом состояний. Здесь же не рассматривается множество состояний, переходы и разметка в качестве основы верификации [2].

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

Спецификация по Дейкстре [1, 3] задается с помощью двух предикатов: предусловие (О) и постусловие {Я}. Таким образом, сама спецификация также является предикатом (О) £ {Я}, который истинен: если выполнение программы £ началось в состоянии, удовлетворяющем Q, то оно завершится через конечное время в состоянии, удовлетворяющем Я.

Слабейшим предусловием является условие, характеризующее множество всех начальных состояний, при которых выполнение обязательно приведёт к правильному завершению, причём система останется в конечном состоянии, удовлетворяющем заданному постусловию. Оно обозначается [3].

При доказательстве правильности цикла, кроме пред- и постусловия, используются инвариант и ограничивающая функция.

Инвариант Р - логическое выражение, описывающее зависимости переменных цикла. Оно должно быть истинно после каждого прохода тела цикла и перед началом выполнения цикла.

Аннотированный цикл должен выглядеть следующим образом:

□ В2 ^ 5*2 ПВп^8п

od

где В - служит охраной входа (^) - условие; £ - выполняется только при истинности В; В^Б - охраняемая команда; □ - равнозначно е/^ег/- команде выбора, разделитель вариантов; do...od- оператор из набора охраняемых команд. Если нет ни одной охраны с истинным значением, происходит правильное завершение программы, но при этом работе нельзя завершиться, пока хотя бы одна охрана является истинной.

По теореме о цикле [1,3] для проверки существует ряд условий:

1. Р истинно перед выполнением цикла (О) - начальная инициализация переменной {Р}.

2. Р является инвариантом цикла (1)

3. Выполнение Р и невыполнение ВВ должны дать Я: Р&^ВВ ^ Я.

4. Если цикл еще не закончен, то ограничивающая функция положительна: Р & ВВ ^ / > 0.

5. Каждый шаг цикла ведет к концу цикла {Р & Вг} и :=/;5,1 }.

Для применения метода Дейкстры происходит выделение в параллельной программе слоев за счёт разбиения на последовательность операторов каждого её процесса. При этом первым слоем будут считаться все те операторы, которым требуются только входные параметры и константы. После того как эти операторы окажутся вычисленными, на следующем шаге для вычисления выбираются все те операторы, которые имеют на своем входе вычисленные данные; таким образом формируется следующий слой [6]. Порядок выполнения данных слоёв не важен, поскольку взаимодействие процессов происходит только внутри них, то есть слои являются коммуникационнозамкнутыми. Программа называется безопасной, если все её слои коммуникационно-замкнутые. В этом случае вместо верификации всей параллельной программы можно проводить её послойную верификацию - последовательное доказательство вход-выходных соотношений для каждого слоя. Иными словами, каждый слой представляет собой последовательную программу [7], к которой применим метод Дейкстры, что было неоднократно доказано.

Рассмотрим применение метода Дейкстры для верификации параллельной программы, вычисляющей значение Ап + Вп через сложение и умножение. Следует учесть, что данный пример можно реализовать и при помощи последовательного алгоритма.

Первый этап построения программы - составление спецификации. Ю: п > 0& А > 0& В > 0},

(2)

{Я : х - Ап + Вп).

Сначала построим последовательную программу.

По постановке задачи, очевидно, что в программе будет цикл. Для этого спецификация должна быть дополнена инвариантом Р и ограничивающей функцией

{Р: х = а + Ь & а = А1 & Ь = В1 &0 < / < п},

^: п - /}.

Построенная, исходя из спецификации, программа приведена на листинге 1:

х, г, а, Ь := А + В, 1, А, В;

а, Ь := а * А, Ь * В\

1ф п->

х, г := а + 6, г +1;

od

Листинг 1

Выполним один из элементов верификации - проверку цикла по формуле (1) Дейкстры - проверка инварианта.

{Р & В}8{Р} (4)

Р & В => м>р (5, Р)

х = а + Ь & а = А1 & Ь = & 0 < г < я & i Ф я =>

=> 'пр("а,Ь := а * Л,Ь * 5;х, г := а + Ь, г +1",х = а + Ь & а =

= & Ь = В1 & 0 < г < и)

х = а + Ь & а = & Ь - В1 & 0 < г < я & г Ф п => а * ^ =

- +1 & Ь * В = В‘+1 & 0 < г +1 < и

Импликация истинна, поскольку: а = => а * А - А,+1

Ь = В1 => 6 * 5 - £,+1

г < п & г Ф п => г +1 < п О < г => 0 < г +1

Преобразуем последовательную программу в параллельную таким образом, чтобы она порождала три процесса:

1. Процесс вычисления А1.

2. Процесс вычисления В1.

3. Процесс вычисления А1 + В1.

а, /в := А,1; !а;

i := 1;

? а;1 Ь; х := а + Ь;

г ^ п-> ?а;?Ь; х, г := а + Ь, г +1; od

Ь, 1Ь := 5,1; \Ь;

do

ц Ф п-> Ь, 1Ъ := Ь * В, ц +1; od

/в * я-> а, /в := а * Л, /в +1;

\а; od

Листинг 2 Здесь:

- \а передача в канал а значения переменной а,

— \Ь передача в канал Ь значения переменной 6,

- 1а получение из канала а значения переменной а,

— 1Ь получение из канала Ь значения переменной Ь.

Для анализа параллельной программы построим сеть Петри для порождаемых ее процессов (рисунок).

Процесс

вычисления

а"

Процесс

вычисления

а"+Ь"

Процесс

вычисления

Ьп

На рисунке:

- места маркируются операторами присваивания,

- переходы названиями каналов,

- немаркированные места/переходы использованы для соответствия правилам построения сетей Перти,

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

Заданный для последовательной программы (листинг 1) инвариант Р должен выполняться в параллельной программе (листинг 2) после места на рисунке, маркированного как « х, г := а + Ь, г +1».

Тело цикла последовательной программы в параллельной программе состоит из двух коммуникационно-замкнутых слоев: первому слою цикла соответствуют места (см. рисунок), маркированные как « а, 1а := а * А, 1а + 1» и « Ь, 1Ь := Ь * В, 1Ь +1», второму слою -« х, г := а + Ь, г +1».

Таким образом, спецификацию для выполнения команд, входящих в коммуникационно-замкнутые слои цикла, по аналогии со второй проверкой цикла Дейкстры можно записать в следующем виде:

{га Ф п & Ф п & I Ф п & Р} <команды 1 -го слоя>;<команды 2-го слоя>{Р}.

В инвариант, по сравнению с использованным в последовательной версии, необходимо добавить соотношение между счетчиками циклов I - 1а - ц.

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

После этих преобразований можно воспользоваться обычной формулой Дейкстры для доказательства правильности спецификации: 1а Ф п & 1Ь Ф п & I Ф п & х = а + Ъ & а = А1 & Ъ = 5' & I = 1а = ц & 0 < I < п => ^ 'пр("а, 1а := а * А, 1а +1;Ь,ц := Ь * В, 1Ь +1;х,г := а + Ь,г +1",

/ = 1а = 1ъ & 0 < / < п & х = а + Ь & а = А1 & Ь = В1).

Доказывается истинность импликации аналогично варианту с последовательной программой (4).

В примере рассмотрена самая важная и сложная проверка цикла

- на сохранение инварианта. Остальные проверки строятся аналогично.

Библиографический список

1. Грис Д. Наука программирования. - М.: Мир, 1984. - 416 с.

2. Карпов Ю.Г. MODEL CHECKING. Верификация параллельных и распределенных программных систем. - СПб.: БХВ-Петербург, 2010.-560 с.

3. Дейкстра Э. Дисциплина программирования. - М.: Мир, 1978.-276 с.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

4. Floyd R.W. Assigning Meaning to Programs // Proceedings of Symposium on Applied Mathematics. - 1967. - Vol. 19. (J.T. Schwartz (Ed.), A.M.S.).-P. 19-32.

5. Hoare C.A.R. An axiomatic basis for computer programming // Communs ACM. - 1969. - Vol. 12, N 1. - P. 576-580.

6. Удалова Ю.В., Легалов А.И., Сиротинина Н.Ю. Методы отладки и верификации функционально-потоковых параллельных программ. - Красноярск: Изд-во Сибир. федерал, ун-та, 2011. - 224 с.

7. Малышкин В.Э., Корнеев В.Д. Параллельное программирование мультикомпьютеров. - Новосибирск: Изд-во Новосиб. гос. техн. ун-та, 2006. - 439 с.

Получено 05.09.2012

i Надоели баннеры? Вы всегда можете отключить рекламу.