Н. Джехани - Язык Ада (1988) (1160771), страница 29
Текст из файла (страница 29)
Если в ожидаемый момент времени показания не поступили, выдается сигнал тревоги — возбуждается исключение ХО ТЕМР КЕАР1ХО (нет измерения температуры), — по которому следует предпринять корректирующие действия. Такой процесс управления можно реализовать следующим образом: 1оор ве!ес! ассер( ХЕ% ТЕМР(А: 1п ТЕМРЕКАТОКЕ) оо Т: А; ево' ХЕ1г' ТЕМР; обработать последние значения температуры Т ог йе)ау 0.1; — ждать 0,1 секунды, а затем выдать сигнал тревоги гаЬе ХО ТЕМР КЕАР1ХО; — сигнал тревоги выдан. Исключения — рассматриваются в главе 5 ево ве!есй епа!оор; 4.8. Механизм взаимного исключения Механизм рандеву можно использовать для реализации взаимного исключения во времени.
Взаимное исключение необходимо для того, чтобы гарантировать целостность данных при их совместном использовании несколькими задачами [ВК173). Взаимное исключение в языке Ада можно реализовать достаточно просто, если потребовать, чтобы в каждом рандеву участвовало только две задачи. Одна из задач может осуществлять контроль за той областью совместно используемых данных, к которой разрешен взаимно исключающий доступ. Например, задача МЕНАКЕР РАТА контролирует совместно используемые данные, которые изменяются н читаются несколькими задачами: !аак БНАКЕР РАТА Ь ев!ту 1.1РРАТЕ (формальные параметры); ев!гу КЕАР(формальные параметры) Г3а яаноегь епо БНАКЕР ВАТА; 3ав)г Ьойу БНАКЕР ВАТА 3в описание совместно используемых данных Ьей)п 3оор Принять по одному запросы на изменение или чтение совместно используемых данных яе)ес3 ассере 3)РВАТЕ(формальные параметры) оо Запомнить параметры езн3 3)РРАТЕ; - - разрешить задаче, выдавшей запрос на изменение данных, - - продолжить выполнение -- в течение того времени, когда - - происходит фактическое изменение ог Изменить данные ассер3 КЕАР (формальные параметры) 3)о Присвоить параметрам соответствующие значения еш3 КЕАР; ог - - остановиться„если все задачи, использующие - - эти данные, уже завершились или готовы завершиться гепп)вазе; ево яе)ес3; епо!оор; евй МЕНАКЕР ВАТА; Доступ к общим данным осуществляется путем выполнения вызова входов: БНАКЕР ВАТА 3)РВАТЕ (фактические параметры) ЕНАКЕР ВАТА.КЕАР(фактические параметры) Этот пример показывает, что реализация механизма взаимного исключения в языке Ада очень проста.
Часто бывает необходимо обеспечить нескольким задачам возможность одновременного доступа к совместно используемым данным, так как это может уменьшить среднее время ожидания. Для этого должна быть спроектирована такая задача, которая представляла бы другим задачам право на обновление и чтение общих данных, но сама бы в отличие от задачи МЕНАКЕР РАТА не контролировала эти данные Задачи пользователя сообщают этой задаче о завершении своей работы с этими данными, чтобы она могла следить за другими задачами„имеющими доступ к совместно используемым данным.
Глава 4 4.9. Задачные типы 19.1, 9.21 Задачные типы облегчают описание одинаковых задач, так как несколько задач могут быть описаны вместе в массиве либо индивидуально. Описание задач- ного типа синтаксически аналогично описанию задачи с единственным отличием, что в него включено зарезервированное слово гуре. Например, задачный тнп РОКК можно описать следующим образом: $аяЫ гуре РОКК!в еп1гу Р1СК 1иР; визгу Р11Т 0Овв'Х; епй РОКК; Описание Р!, Р2: РОКК; определяет две задачи — Р! и Р2.
Эти задачи становятся активными непосредственно перед выполнением первого оператора подпрограммы илн перед выполнением пакета, в котором эти задачи описаны. Массивы, элементами которых являются задачи, описываются точно так же, как массивы элементов любых других типов. Например, каждый элемент массива Р, описанного как > Р:агаву(1О) о1 РОКК; является задачей. Задачные типы аналогичны лимитируемым личным типам. Объекты задачного типа являются константами, и к ним нельзя применять присваивание и проверку на равенство ~~. Задачи можно передавать как параметры, причем фактический и соответствующий формальный параметры обозначают одну и ту же задачу для всех видов параметров.
Если в программе требуется динамически создавать задачи либо запоминать и переименовывать их, то используется ссылочный тип. Например, рассмотрим ссылочный тип АХОТНЕК РОКК, описанный как гуре АХОТНЕК РОКК Ь ассеяя РОКК; и переменную ЕХТКА РОКК, описанную как ЕХТКА РОКК: АХОТНЕК РОКК: Задача может быть создана динамически с помощью генератора певч ЕХТКА РОКК:- веча РОКК; Такие задачи становятся активными после выполнения генератора. Задачи, порожденные генератором, должны быть завершены перед выходом из блока, подпрограммы или задачи, в которых описан этот ссылочный тип. В противном случае из них выйти нельзя. и И на неравенство. — Прим. ред. 141 Параллельность 4.10.
Оператор прекращения 19.101 Задачу можно явно прекратить с помощью оператора прекращения аЬогг. В результате выполнения оператора аЬогг Ть Ть ..., Т„; все задачи Ть Ть ..., Тм которые еще не были прекращены, переводятся в аварийное состояние, предотвращая любые дальнейшие рандеву с ними. Все задачи, которые зависят от задачи, перешедшей в аварийное состояние, также завершаются аварийно. Задача, ставшая аварийной, завершается немедленно, если она ожидает вызова входа операторов принятия, отбора или задержки. В противном случае эта задача завершается, как только будет достигнута точка синхронизации — начало или конец оператора принятия, обработчика исключения и т.
д. Если вызывающая задача стала аварийной в процессе рандеву, то до завершения ей разрешается закончить выполнение рандеву. Вызванная задача при этом не затрагивается. Если в процессе рандеву становится. аварийной задача, содержащая оператор приема, то в вызвавшей запаче в точке вызова входа возбуждается исключение ТАЗК)ХО ЕККОК (ошибка управления задачами). Исключение ТАЗК1)ЧО-ЕККОК возбуждается в точках вызова входа во всех задачах, ожидающих или пытающихся установить рандеву с задачей, завершившейся аварийно. Если задача стала аварийной (либо если выполнение задачи закончилось или завершено), атрибут САЕЕАВЬЕ принимает значение РА(.оЕ.
В языке Ада задача может завершить аварийно любую другую задачу, в том числе самое себя. Однако задачи, завершаемые таким образом, должны быть видимы в том месте программы, где они завершаются. Подобная возможность завершения задач, хотя и может быть использована неверно, тем не менее оказывается весьма полезной при управлении реакторами и ракетами. В этом случае может потребоваться завершить аварийно неверно выполняющуюся задачу, чтобы избежать катастрофических последствий. Оператор прекращения следует использовать только в ситуациях, которые до конца ясны.
4.11. Прерывания 113.5. Ц Язык программирования Ада предоставляет прекрасные возможности обработки запросов на прерывание от оборудования. Запросы на прерывание, которые можно поставить в очередь, рассматриваются системой как обычные вызовы входа, а те запросы на прерывание, которые нужно обработать немедленно, — как условные вызовы входов. Вход задачи можно связать с запросом на прерывание от оборудования, если потребовать, чтобы этот вход был расположен по адресу прерывания. Такая спецификация входа зависит от реализации. Оператору принятия, выполняющемуся в ответ на прерывание, дается наивысший приоритет (выше, чем у любой пользовательской задачи), чтобы обеспечить эффективное использование устройств и приемлемое время отклика при работе в условиях реального времени. (Более подробную информацию о связи входов с адресами прерываний можно получить в гл.
8.) 142 Глава 4 4.12. Приоритеты задач [9.81 Каждая задача может иметь приоритет, отличающийся от приоритета, присвоенного задаче по умолчанию при реализации. Приоритет задается с помощью прагмы РК1ОК1ТУ (приоритет) ргарпа РК10К1ТУ(Р); которая включается в спецификацию задачи.Р— статическое выражение, принадлежащее зависящему от реализации целому подтипу РК)ОК1ТУ. Чем больше значение Р, тем выше приоритет задачи. Приоритет задачи является статическим и его нельзя изменить динамически.
При выборе для выполнения рандеву задаче с более высоким приоритетом отдается предпочтение. Пусть две задачи, А и В, готовы выполнить рандеву с задачей С, причем А имеет более высокий приоритет, чем В. Если А и В вызвали разные входы задачи С, то задача А будет выбрана первой, поскольку она имеет более высокий приоритет. Если же задачи А и В вызвали один и тот же вход задачи С, то будет выбрана та задача, которая первой вызвала С: в этом случае приоритет не играет никакой роли. Порядок обслуживания задач с одинаковым приоритетом не определен и зависит от реализации.