Читайте также:
|
|
Лекция 5. Асинхронные процессы.
Определение
Процессы называются параллельными, если они существуют одновременно. Параллельные процессы могут работать совершенно независимо друг от друга или они могут быть асинхронными — это значит, что им необходимо периодически синхронизироваться и взаимодействовать.
Решение этих проблем иллюстрируется на примерах параллельных программ, написанных с применением нотации, аналогичной, хотя и не идентичной, нотации параллельного Паскаля, языка программирования, который разработал Бринк Хансен.
Еще один популярный язык параллельного программирования, созданный на базе Паскаля,— это язык Модула, разработанный Никлаусом Виртом и средства параллельного программирования, реализованные в новом языке Ада.
Параллельная обработка
Поскольку габариты и стоимость аппаратуры компьютеров продолжают уменьшаться, следует ожидать дальнейшего развития мультипроцессорных систем и в конечном итоге реализации максимального параллелизма на всех уровнях.
Если определенные операции логически можно выполнять параллельно, то компьютеры новых поколений будут физически выполнять их параллельно, даже если требуемая степень параллелизма будет при этом выражаться в тысячах или, быть может, даже миллионах параллельных процессов.
Параллельная обработка вызывает активный интерес по ряду причин. Люди, как правило, скорее способны концентрировать свое внимание на выполнении в каждый момент времени лишь одной операции, чем думать о параллельных вещах.
Обычно весьма трудно определить, какие операции можно и какие нельзя выполнять параллельно. Отлаживать параллельные программы гораздо сложнее, чем последовательные; после того как выявленная ошибка предположительно исправлена, может оказаться, что восстановить последовательность событий, на которой эта ошибка проявилась впервые, не удастся, поэтому, вообще говоря, просто нельзя утверждать с уверенностью, что данная ошибка устранена.
Асинхронные процессы должны периодически взаимодействовать друг с другом, причем эти взаимодействий могут быть достаточно сложными. В настоящей главе и в нескольких последующих мы рассмотрим много примеров взаимодействий между процессами.
Доказывать корректность для параллельных программ гораздо труднее, чем для последовательных.
Сейчас широко распространено мнение о том, что со временем должны появиться эффективные методы доказательства корректности программ, заменяющие исчерпывающее тестирование; только это позволит добиться заметных реальных успехов в разработке исключительно надежных программных систем.
5.3 Управляющая конструкция для указания параллелизма: Parbegin/Parend
В последнее время в литературе появляются сообщения о том, что во многих языках программирования предусматриваются специальные конструкции для указания параллелизма. Эти конструкции, как правило, представляют следующие парные операторы:
Ø Один оператор, указывающий, что последовательное течение программы должно быть разделено на несколько параллельно выполняемых последовательностей (цепочек управления).
Ø Один оператор, указывающий, что определенные параллельно выполняемые последовательности должны слиться воедино и должно возобновиться последовательное выполнение программы.
Эти операторы всегда встречаются парами и обычно носят такие названия, как
parbegin/parend
(«начало/конец параллельного выполнения») или cobegin/coend («начало/конец совмещенного выполнения»). Будем использовать два оператора parbegin/parend, как рекомендует Дейкстра (рис. 5.1).
parbegin оператор 1;
оператор 2;
•
•
•
оператор n
parend
Рис. 5.1 Конструкция parbegin/parend для указания параллелизма.
Предположим, что в программе, где в данный момент выполняется единая последовательность команд, встречается первый оператор управляющей конструкции parbegin. Это приводит к тому, что единая цепочка управления разделяется на п отдельных самостоятельных цепочек — по одной для каждого внутреннего оператора данной конструкции.
Это могут быть простые операторы, вызовы процедур, блоки последовательных операторов с ограничителями begin/end или какие-либо комбинации этих элементов. Каждая из отдельных цепочек управления со временем завершается и приходит к конечному оператору parend» Когда, наконец, завершается последняя из всех этих параллельных цепочек, они снова сливаются в единую цепочку управления и программа проходит» точку parend.
В качестве примера рассмотрим следующее вычисление одного корня квадратного уравнения:
х: = (—b+(b**2—4*а*с)**0.5)/(2*а)
Этот оператор присваивания можно вычислить при помощи последовательного процессора (имеющего команду возведения в степень) следующим образом;
1 - b**2
2 - 4*а
3 - (4*а)*с
4 - (b**2)—(4*a*c)
5 - (b**2—4*a*c)**0.5
6 - —b
7 - (—b)+((b**2—4*a*c)**.5)
8 - 2*a
9 - (—b+(b**2—4*a*c)**0.5)/(2*a)
Здесь каждая из девяти указанных операций выполняется в последовательности, определяемой принятыми в системе правилами предшествования операторов.
А в системе, предусматривающей параллельную обработку, данное выражение может быть вычислено следующим образом:
parbegin
1 temp1: = —b;
temp2: = b**2;
temp3: = 4*a;
temp4: = 2*a
parend;
2 temp5: = temp3*c;
3 temp5: = temp2—temp5;
4 temp5: = temp5**0.5;
5 temp5: = templ+temp5;
6 x: = temp5/temp4
Здесь четыре операции, входящие в конструкцию parbegin/ parend, выполняются параллельно, а остальные пять операций по-прежнему приходится выполнять последовательно. Параллельное выполнение вычислений дает возможность значительно уменьшить реальное время решения задачи.
Дата добавления: 2015-02-16; просмотров: 98 | Поможем написать вашу работу | Нарушение авторских прав |