Параллельные операции

Предположим, нам необходимо написать программу для создания анимации в компьютерной игре, где атакуются вражеские космические корабли. Прежде всего можно создать одну программу, которая будет контролировать весь экран. Такая программа должна будет рисовать все корабли. И для того чтобы анимация была реалистичной, ей придется обрабатывать характеристики огромного числа космических кораблей. Другой подход к решению этой задачи — создать программу, контролирующую отображение на экране одного космического корабля. Его характеристики определяются параметрами, которые задаются в начале выполнения программы. Затем изображение на экране можно создать с помощью нескольких активизаций этой программы, каждая из которых имеет свой собственный набор параметров. Одновременное выполнение всех активизаций создаст иллюзию того, что по экрану перемещается множество космических кораблей.

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

Языки программирования, предусматривающие параллельную обработку, первоначально разрабатывались для создания операционных систем. Однако, как показывает наш пример, многие современные прикладные задачи легче решить, используя параллельную обработку, а не традиционную последовательность команд. В свою очередь, новейшие языки программирования предоставляют синтаксис для семантических структур, включающих в себя параллельные вычисления. Разработка таких языков требует выявления семантических структур и создания синтаксических структур для их представления.

Создатели языков программирования по-разному подходят к процессу параллельной обработки, что приводит к появлению разной терминологии. Например, то, что мы назвали активизацией, в языке Ada называется задачей (task), а в Java — потоком (thread). To есть в программе на Ada одновременные действия выполняются с помощью создания нескольких задач, а в программе на Java создается несколько потоков. В обоих случаях создаются и выполняются несколько процессов, почти как в многозадачной операционной системе. Поэтому в дальнейшем мы будем называть активизацию задачей, потоком или процессом.

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

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

Взаимодействие между процессами является предметом изучения специалистов в вычислительной технике уже долгое время. Различные подходы к решению этой задачи отражаются в новейших языках программирования. Рассмотрим в качестве примера трудности, которые могут возникнуть, когда два процесса манипулируют одними данными. (Этот пример описан более подробно в разделе 3.4.) В частности, если два процесса, выполняемые одновременно, должны прибавить число 3 к одному элементу данных, то необходимо убедиться в том, что когда один из процессов приступает к выполнению этой операции, другой процесс приостанавливает свою работу. В противном случае они оба будут производить вычисления над одним и тем же числом, и в результате к исходному элементу данных будет прибавлено число 3, а не 6. Данные, к которым в настоящий момент может иметь доступ только один процесс, называются данными с взаимоисключающим доступом (mutually exclusive access).

Один из способов разрешения этой трудности — написать программу, которая блокирует доступ оставшихся процессов к совместно используемым данным, когда какой-либо процесс обрабатывает их. (Этот подход описан в разделе 3.4, там же мы назвали часть процесса, которая получает доступ к общим данным, критической областью.) Опыт показал, что такой подход имеет один недостаток: задача обеспечения взаимоисключающего доступа к данным распределяется между разными частями программы. Для этого все программные единицы, получающие доступ к данным, должны быть правильно построены, иначе ошибка в одном сегменте может разрушить всю систему. По этой причине многие специалисты полагают, что лучше дать возможность данным самим контролировать доступ. В результате чего управление доступом будет сосредоточено в одной части программы, а не распределено между разными программными единицами1. Элемент данных, который управляет доступом, называется монитором (data monitor).

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

В заключение следует заметить, что анимация является интересной, но не единственной областью исследования вопросов, связанных с параллельной обработкой. Методы параллельной обработки также используются при прогнозировании погоды, управлении воздушным движением, имитации сложных систем (от ядерных реакций до пешеходного движения), создании компьютерных сетей и баз данных.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: