Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 138
Текст из файла (страница 138)
— Примеч. науч. ред. 11,2. Параллельное программирование 501 рование с языком (преподаватели университетов не чувствовали себя связанными такими протоколами, как АСЪ'8) привели к тому, что стали появляться предложения о пересмотре языка или создании расширений к нему. В 1988 г. комитет А1 РО вместе с 180 сформировали комитет Аг1а 9Х для пересмотра стандарта. В названии комитета символы ч9Х» появились в связи с тем, что дата окончания работ не могла быть даже приблизительно оценена, так как подобная работа всегда требует больше времени, чем ожидается.
В результате 9Х превратились в 95. Помимо решения проблем, связанных со стандартом 1983 г., основные изменения в новом стандарте были связаны с улучшением объектно-ориентированного подхода, иерархических библиотек и модели обработки задач. В этой главе описан язык стандарта 1983 г, н показано, как новый стандарт модифицирует эти возможности. Краткий обзор языка. Язык Ада предназначен для поддержки создания больших программ большими командами программистов.
Программа на языке Аг1а обычно разрабатывается как набор крупных программных компонентов, называемых пакетами, каждый их которых представляет абстрактный тип данных или множество объектов данных, совместно используемых подпрограммами. Программа на Ада состоит из одной процедуры, играющей роль главной программы.
Зта главная программа объявляет переменные и выполняет операторы, в том числе вызовы других подпрограмм. Однако эти типы данных и подпрограммы часто являются частями отдельно определенных пакетов, которые просто импортируются из библиотеки программ по мере надобности. Программа на Ада может вызывать множество отдельных задач, которые должны выполняться параллельно. Если в программе действительно выполняются задачи, то они часто инициируются непосредственно главной программой и образуют верхний уровень структуры программы.
В Ада предусмотрен широкий спектр встроенных типов данных, включая целые и вещественные числа, перечисления, булевы величины, массивы, записи, сим вольные строки и указатели. Абстракция и инкапсуляции определяемых программистом типов и операций обеспечиваются с помощью свойств пакетов. Механизм инкапсуляции позволяет сделать невидимым внутреннюю структуру объектов данных и подпрограмм, что дает возможность реализовать истинную абстракцию как данных, так и операций. Управление последовательностью действий внутри подпрограммы использует выражения и структуры управления на уровне операторов, подобные тем, что используются в языке Рааса!, Имеется огромный выбор средств для обработки исключительных ситуаций.
Управление последовательностью действий на уровне подпрограмм включает обычный вызов подпрограмм и возврат с рекурсией. Кроме того, исключительные ситуации могут приводить к завершению подпрограмм. Но наиболее замечательным аспектом возможностей управления последовательностью действий в Ада является обеспечение выполнения параллельных задач и управление ими с использованием системных часов и других механизмов планирования. Структуры управления данными в Ада используют статическую блочно-структурированную организацию, как в языке Рааса!.
Однако в языке также предусмотрены средства для нелокальных ссылок на имена типов, имена подпрограмм и другие идентификаторы в явной общей среде, определяемой пакетом, в которой часто 502 Глава 11. Распределенная обработка данных один и тот же идентификатор может быть использован во многих различных пакетах. Каждый формальный параметр в подпрограмме помечается ключевым словом 1п, оцт или зп оц1. Виртуальный компьютер Ада использует центральный стек для каждой отдельной задачи. Каждый стек используется для создания и уничтожения записей активации подпрограмм во время выполнения этой задачи.
Поскольку задачи могут выполняться параллельно, они могут выполнять подпрограммы независимо друг от друга. Для объектов данных, создаваемых программистом, также требуется область памяти, отводимая под кучу. Так как отдельные задачи в Ада-программе могут потенциально выполняться на отдельных компьютерах, то и области памяти, используемые каждой задачей, могут быть распределены в памяти разных компьютеров.
Такая распределенная природа хранения данных и выполнения задач порождает специфические проблемы в реализации Ада, которых не найти ни в одном из остальных описанных в этой книге языков. 11.2.4. Задачи Идея, лежащая в основе задач, достаточно проста, Рассмотрим подпрограмму А, которая выполняется обычным образом. Если А вызывает подпрограмму В, то обычно выполнение А приостанавливается на то время, пока выполняется В. Но если В инициирована как зидичи, то А продолжает выполняться одновременно с В. Исходная последовательность выполнения теперь разделилась на две параллельных последовательности выполнения.
Теперь или подпрограмма А, илп подпрограмма В, илп обе могут инициировать другие задачи, позволяя любому числу параллельных последовательностей выполнения сосуществовать одновременно. Вообще говоря, каждая задача является зивисимой от той задачи, которая ее инициировала. Когда задача готова к завершению, она должна дождаться, пока завершатся все зависимые от нее задачи.
Таким образом, разделенная на несколько последовательностей выполнения первоначальная последовательность по мере завершения задач становится состоящей из все меньшего числа параллельных последовательностей, пока снова, после завершения последней зависимой задачи, не останется одна последовательность выполнения. При нормальных обстоятельствах каждая из этих задач верхнего уровня управляет большей частью системы (в настоящее время часто распределенной компьютерной системы); ожидается, что, однажды инициированные, они будут выполняться нескончаемо долго.
Управлениезадачами Определение задачи в программе мало отличается от определения обычной подпрограммы за исключением определения того, как задача синхронизируется и взаимодействует с другими задачами, Большая часть тела определения задачи состои~ из обычных объявлений и операторов, реализующих функциональность задачи, пока она работает независимо от других задач.
В языке Ас1а, который будет здесь нашим основным демонстрационным языком, определение задачи принимает следующий вид: дави нвво зз -Осьявления для синхронизации и взаииодейсгвия с другиии заданаии 11.2. Параллельное программирование 503 епд садк Ьооу маше тв -Обычные локальные обьявпения, свойственные дэбой подпротраиие Ьеойп -Поспедоватепьность операторов епш Инициализация выполнения задачи может принимать вид обычного вызова подпрограммы. Например, во многих реализациях Р!.У! задача В инициируется выполнением следующего оператора: са11 В(параиетры> Савы; В Ас!а используется несколько иной метод. Определение задачи, как сказано ранее, включается в набор объявлений некоторой более крупной программной структуры, такой, например, как главная программа. При входе в эту более крупную программную структуру все объявленные в ней задачи автоматически инициируются.
Таким образом, не нужен явный оператор вызова; задачи начинают выполняться параллельно сразу после входа в содержащую их бол ыпую программную структуру. В приложениях часто требуется несколько одновременных активаций одной и тпой же задачи. Рассмотрим, например, компьютерную систему, которая управляет некоторым множеством пользовательских терминалов. Основной задачей может являться программа, которая следит за состоянием всех мониторов.
Когда какой-либо пользователь входит в систему с некоторого терминала, эта задача, Моей 'ьог, инициирует новую задачу, Тегшт па1, чтобы управлять взаимодействием с пользователем, работающим за этим конкретным терминалом. Когда пользователь выходит из систелты, задача тегш1 па1 завершается, Задача мопттог, конечно, работает непрерывно за исключением аварийной остановки всей системы. Когда несколько пользователей входят одновременно в систему с различных терминалов, то требуется несколько активаций задачи Тегш\ пв1, по одному на каждого пользователя.
Если задача инициирована с использованием обычного оператора вызова подпрограмм, как в Р! /1, тогда повторного выполнения оператора вызова достаточно для создания нескольких активаций. В языке Ат)а приведенное выше определение задачи может быть использовано только для создания одной активации задачи в соответствии с правилами неявной инициализации задач. Поэтому задача Моп1бог будет, вероятно, определена, как и ранее. Для задачи Тегшт па1 требуется несколько активаций, и они должны создаваться и инициироваться задачей Моп!'ьог по мере необходимости. В Ат)а задача Тегш1 па1 определяется как птип Таей: Савв Сите Тегштпа! тв -остальная част~ определения совпадает с обычныи опредепениеи епд; Определение Тегштпа1 как тип Тавк позволяет рассматривать активацию задачи как тип объекта данных в том же смысле, как обычное определение типа используется для определения класса объектов данных (см.
раздел 6.3). Создание и инициирование новой активации задачи тогда аналогично созданию нового объекта данных с использованием определения типа в качестве шаблона. Для создания нескольких активаций с именами А, В и С программист на языке Ат)а пишет соответствующие объявления так же, как объявления обычных переменных: А: Тегяп па1 В,С: Тепптпа1: 504 Глава 11.