
Условия, необходимые для существования данного отношения между n последовательными процессами p1, p2, ... , Pn
Отношение |
Проверки |
Одновременность |
lk Ç Ol=Æ* Pk Ç (Pk+1 Ç . . . Ç Pn)= Æ + |
Упорядоченность |
Ok Ç(Ik+1 È . . . È In)= Æ + Ok Ç(Ok+1 È . . . È On)= Æ + |
Консервативность |
Ok Ç(Ik+1 È . . . È In)= Æ + |
Последовательность |
Необходимые условия отсутствуют, так как процессы выполняются в своем естественном порядке. |
Æ – обозначение пустого множества,
* – для всех k , таких, что 1£ k< n, и для всех l таких, что 1£ l< n, и k¹ l,
+ – для всех k, таких, что 1£ k< n.
Параллельное программирование
Описанная в предыдущем разделе проверка является одним из методов преобразования последовательных программ для использования на многопроцессорной основе. Однако, если задача еще не запрограммирована, то имеет смысл рассмотреть сразу ее параллельную реализацию .Здесь представлены различные способы проверок, которые дают возможность пользователю писать параллельные программы.
Первые предложения по элементам параллельного программирования (например , Алгол 68) допускали связь путем контроля и обновления общей памяти. Однако, как уже отмечалось, такой подход приводит к серьезным проблемам при создании корректных программ и трудностям в практической реализации.
В результате в последнее время стали рассматривать прямые связи между указанными процессами (например, Хоар). Предлагаемый ниже метод основан на организации памяти, упомянутой в начале этой статьи, которая похожа на концепцию общей памяти, но более проста в реализации. Этот метод особенно подходит для представления типа параллелизма, который встречается в больших задачах моделирования и задачах численного анализа. Покажем, что доказательство корректности таких программ не будет слишком трудно.
Рассмотрим систему, в которой некоторый процесс начинается с чтения значений всех нелокальных входов, которые потребуются, и образования собственных копий. Затем процесс выполняет свои операции, используя только локальные копии переменных. В конце процесса любые нелокальные переменные, значения которых изменились, доступны для обратного копирования в свои нелокальные ячейки.
Считывание из ячеек происходит без разрушения и нет способа определить, что что-то считывается. Запись является разрушающей операцией, и, если считывание из ячейки происходит во время записи в эту ячейку, считанное значение будет неопределенным. Аналогично, если два или более процессов произведут одновременно запись в одну и туже ячейку, то значение в ячейке будет неопределенным.
Порядок выполнения этих процессов управляется последовательностью вызовов, указывающих процессы, которые могут получить свои входы и передать свои выходы. Вызов группы процессов, в свою очередь может рассматриваться как процесс, имеющий входы и выходы, которые передаются его подпроцессам. Формат этих вызовов зависит от языковой среды.
Для определения параллелизма пользователем пригодны все шесть рассмотренных отношений.
Подходящий формат для вызовов будет именовать отношение и перечислять список связанных с ним процессов; с каждым именем процесса связывается список его нелокальных входов и выходов. Определения процесса могут появляться в произвольном месте с одновременным использованием локальных имен для входов, которые будут приниматься, и выходов, которые будут передаваться