Н. Джехани - Язык Ада (1988) (1160771), страница 26
Текст из файла (страница 26)
— КО%); спи БАГЕ; ргосеввге РК1ХТ РОЯТ1ОХБ 1я Ьерп уог 1 (п 1..8 1оор Р()Т («номер ферзя»); Р()Т(1); Р()Т («находящегося в столбце»); Р()Т(1); Р(3Т («и строке»); Р()Т(К0% - РОВ(1)); ХЕ% ЫХЕ; епг) 1оор; епо РК1ХТ РОБ1Т1ОХБ; епг) СНЕББ ВОАКР; Процедура Е1ОНТ ( ()ЕЕХЯ, которая печатает допустимую конфигурацию, имеет вид пчТЬ ТЕХТ Ю; вяе ТЕХТ 10; ргосеввге ЕЮНТ ()()ЕЕХЯ В рас)гайе 10 1ХТЕОЕК 1я пеп 1ХТЕОЕК Ю(1ХТЕОЕК); 124 Глава Э пве 1О 1ХТЕОЕК; — вставить здесь спецификацию н тело — пакета СНЕББ ВОАКО пзе СНЕББ ВОАК1); рюсейвге РЬАСЕ О(ЗЕЕХБ(1: 1п 1ХТЕОЕК; БЫССЕББН)Ь: ощ ВОО1.ЕАХ) (к У: 1ХТЕОЕК:= 0; — 1 номер строки и 1 номер столбца Ьей(п Б()ССЕББГОЬ:= ГАЬБЕ; згййе по( ЯЗССЕББЛЗЬ апо 1 У= 8 1оор 1:= 1-ь 1; Ы БАГЕ(1, 1) (Ьеп Р13Т ()(ЗЕЕХ(1, 1); Ы 1 < 8 1Ьеп Р1.АСЕ ()1)ЕЕХБ(1 + 1, ЯЗССЕББГУЬ); Ы по1 Я)ССЕББНЗЬ 1Ьеп КЕМОУЕ С1(ЗЕЕХ(Ю, 1); епо Ы; е1зе Я.1ССЕББГ()Ь: = ТЛЕ; епо Ы; епо Ы; епо 1оор; епй РЬАСЕ ЯУЕЕХБ; БУССЕББГОЬ: ВООЬЕАХ; Ьей(п — тело главной программы Е1ОНТ О1)ЕЕХБ РЬАСЕ (,11)ЕЕХБ(1, Б()ССЕББГУЬ); — разместить все 8 ферзей Ы Я)ССЕББН)Ь 1Ьеп РК1ХТ РОБ1Т1ОХБ; — нет необходимости в проверке — правильности процедуры Р1.АСЕ С11)ЕЕХБ, — поскольку — известно, что допустимые конфигура— ции существуют.
епо' Ы; епд Е1ОНТ О()ЕЕХБ; В качестве упражнения для читателя предлагается вариация на тему задачи о восьми ферзях: необходимо распечатать все возможные допустимые позиции ферзей на шахматной доске. Совет: когда все ферзи будут успешно размещены, то печатается позиция, а переменная Б()ССЕББГУЬ устанавливается в ГАЬБЕ для того, чтобы заставить процедуру РЬАСЕ ЯОЕЕХБ искать другие допустимые позиции. Другой вариацией на эту тему будет следующая задача: необходимо обобщить задачу для Х ферзей и шахматной доски Х на Х.
Глава 4 Параллельность ~9~ 4.1. Введение Язык программирования Ада предусматривает средства высокого уровня для программирования параллельных алгоритмов. Параллельность в языке Ада может быть реализована на многомашинном или многопроцессорном комплексе либо смоделирована с помощью средств мультипрограммирования (т. е. путем чередующегося выполнения) иа единственном физическом процессоре. Включение в язык программирования средств параллельности желательно по следующим причинам.
Во-первых, средства параллельности позволяют достаточно просто описывать многие алгоритмы. Во-вторых, на многомашинных или многопроцессорных комплексах программы, явно использующие параллелизм, могут быть реализованы гораздо эффективнее, чем последовательные. Используемая в языке Ада модель параллельности основана на концепции взаимодействующих последовательных процессов Хоара [НОА78[, в рамках которой для синхронизации параллельных процессов и обмена значениями между ними используются операторы ввода-вывода.
Кроме того, в модели параллельности языка Ада чувствуется сильное влияние идей распределенных процессов Брипча Хансена [ВК178[. Разработчики языка Ада отказались от таких механизмов параллельной обработки, как семафоры, события и сигналы, поскольку они являются примитивами низкого уровня. Такой примитив, как мониторы, не был использован из-за присущей ему сложности и из-за того, что связанные с мониторами сигналы имеют низкий уровень [РО1779б[.
4.2. Задачи и рандеву [9.5] Параллельные процессы в языке Ада называются задачами. Задачи, а также подпрограммы, пакеты и настраиваемые модули образуют четыре вида программных модулей, из которых состоит программа на языке Ада. Задача может содержать входы, вызываемые другими задачами. Синхронизация двух задач происходит, когда задача, выполнившая вызов входа, и задача, принимающая этот вызов, могут установить связь посредством рандеву.
Во время рандеву между задачами происходит обмен значениями. Важным средством взаимодействия задач являются входы ". Обмен данными в обоих направлениях осуществляется через фактические параметры в операторе вызова входа и соответствующие формальные параметры оператора принятия (ассерГ) этого входа. о Задачи могут также взаимодействовать через глобальные переменные. Главе 4 Концепция рандеву схематично изображена на рис. 4.1. Время Время Я (е ) Задача А выполнила вылов входа Е яадачи В Задача В тотова принять выхов входа Е А е В Задачи А и В выполняют рандеву на входе Е Рне.
4.1. Рандеву. На рисунке изображены три ситуации. В первом случае (а) задача А вызывает вход Е до того, как задача В готова принять этот вызов. Задача А ждет (ее выполнение приостанавливается) до тех пор, пока задача В ие будет готова к рандеву.
После синхронизации задачи взаимодействуют (т. е. происходит передача данных). Выполнив рандеву, обе задачи продолжают свое выполнение параллельно. Во втором случае (б) задача В готова принять вызов входа до того, как задача А выполнит этот вызов. Задача В ожидает, пока задача А будет готова к рандеву. И наконец, в случае (в) задача А может выполнить вызов входа именно в тот момент, когда задача В готова принять этот вызов.
Используемая для рандеву схема именования является асимметричной: требуется, чтобы вызывающая задача (т. е. задача, выполнившая вызов входа) называла имя вызываемой задачи (т. е. задачи, принимающей вызов входа), в то время как вызываемая задача не называет имя вызывающей. Такая асимметрия позволяет создавать библиотеки, состояшие из лроцессов-служищих. то время как вызываемая задача не называет имя вызывающей. Такая асимметрия позволяет создавать библиотеки, состояшие из л)уоцессов-слухеащих.
ЯЯ ЯЯ Я Дв Я-'Я ЯЯ ЯЯ, ЯЯ ЯЯ Я-'Я ЯЯ Я,Я ЯЯ Я-'Я ЯЯ ЯЯ зз ьиость згу Рандеву между двумя задачами„а также между группами из двух и более задач может происходить в любой момент времени. В общем случае для данной задачи рандеву с другой задачей должно закончиться до начала рандеву с третьей задачей. Однако встречаются ситуации, когда задачи, выполняющие рандеву друг с другом, должны обмениваться значениями с третьей задачей до завершения своего рандеву. Пусть задача А вызывает задачу В для получения некоторой информации.
Задача В может предоставить эту информацию только после обмена значениями с задачей С. Существует возможность описать подобное взаимодействие между задачами. Задача, принимающая вызов входа, может в процессе рандеву обмениваться данными с другими задачами. Например, пусть задача А вызывает задачу В, а задача В во время рандеву может вызвать задачу С. А — —  — — С Залача В выполняет рандеву с задачами А и С В этом случае задача В должна выполнить свое рандеву с задачей С до заверщения рандеву с задачей А.
С другой стороны, во время выполнения рандеву с задачей А задача В может принять вызов входа от задачи Т» Во время обмена значениями с задачей Тз задача В может принять еще один вызов входа, например от задачи Тз. Точно так же задача В может обмениваться значениями с задачами Тз, ..., Тп — и Тп. Задача В выполняет рандеву с задачами д,т,,т„.,т„ В этом случае задача В должна закончить свои рандеву с другими задачами в порядке, обратном тому, в котором были установлены, т. е. Тп, ..., Ть А. 128 Глава 4 4.3. Спецификация и тело задачи [9.1! Задачи, подпрограммы, пакеты и настраиваемые модули являются основными видами программных модулей, из которых состоят программы на языке Ада.
Как подпрограмма или пакет, задача состоит из двух частей: спецификации и тела. Спецификация задачи может быть задана в одной из следующих форм: сав1с идентиФикатор; или сад1с идентиФикатор !в описания входов специФикатор представления еид идентиФикатор; Первая форма спецификации определяет задачу без входов. Такую задачу нельзя вызвать другими задачами для выполнения рандеву. (Использование специФикаторов представления, содержащихся в спецификации задачи, рассматри ваегся на примерах.
Более подробно они рассматриваются в гл. 8, посвященно! спецификаторам представления и средствам выражения особенностей, зависящих от реализации.) Тело задачи имеет следующую форму: !ав1с Ьси!у идентиФикатор !д описания Ьей!и последовательность операторов [ ехсер!!оп обработчики исключений 1 епд идентиФикатор (Обработчики исключений рассматриваются в гл.
5, посвященной исключениям.) В качестве примера рассмотрим задачу РКО(э!)СЕК (поставщик), которая считывает некоторый текст из стандартного входного файла и передает этот текст другой задаче — СОХЯЗМЕК (потребитель) (рис. 4.2). Задача СОХЯЗМЕК заменяет все строчные буквы прописными и записывает новый текст в стандартный выходной файл. Стандавтныя вывод Стандаотиььк ввод Рис.