Язык Ада, 06 лекция (от 31 марта)
Материал из eSyr's wiki.
Содержание |
Выбор процессом варианта поведения в зависимости от ситуации
[код на 1 листке] Описываем пакеты Анализ синтез. Анализ принимает сообщения из внешнего мира, а у синтеза вход-выход. Моделируем внешнюю среду. Пусть генератор генерирует случайные сообщения, а анализатор сообщений, который воспринимает результат. Как могут быть устроены пакеты генератор и анализ? Тело генератора – строчки 31-44. Оператор приема входа + бесконечный цикл. И вызывается вход принять пакета анализатор. Пакет анализатор сообщений - 47-59. Прием входа старт. Бесконечный цикл, в котором вызов входа выдать задачи синтез с целью забрать полученное сообщение. Внизу страницы находится главная программа. Она вызывает вход старт с одной и другой стороны. Необходимо реализовать распараллеленную обработку сообщений. Для этого можно сделать буфер, в который задача анализ будет складывать, а анализ – забирать сообщения. [код на 2 листке] На обороте 1 листа находится спецификация пакета, который реализует структуру данных буфер ограниченного размера, у которого есть 3 операции: положить в буфер, взять из буфера, проверить на полноту буфер. Тело пакета анализ синтез. Объявляем внутри тела пакета еще одну задачу – буфер - с 2 входами: положить и взять. Предположим, буфер умный и сам все сделает, т.е. будет избегать тупиков и пр. 93-106 – анализ. Заводятся переменные и находимся в бесконечном цикле. Сначала прием входа ПРИНЯТЬ, потом выполняется анализ и вызывается вход ПОЛОЖИТЬ задачи буфер. Тело задачи синтез – зеркальное отображение. Взять из буфера очередной объект, с которым надо работать, проводится работа синтез и отдается во внешнюю среду.
Буфер
Создается обычный буфер[на обороте странички]. Тело задачи буфер [со 129 строчки], оператор отбора[132 -150]. Вариант поведения в зависимости от ситуации. Начинается со слова select, кончается слова endSelect. Есть альтернативы, разделенные ключевым словом or. Количество альтернатив – любое. Альтернатива устроена так: содержится оператор приема входа везде, кроме последней альтернативы. Каждая альтернатива начинается с условия, а потом идет оператор приема. Как работает: сначала проверяются последовательно все условия, выбирается те из них, которые истины. Порядок проверки – любой. Рассматривают те альтернативы, в которых истина условие. В каждой из них есть оператор приема. Те альтернативы, которые истина, будем называть открытыми. Среди открытых альтернатив смотрим на операторы приема и смотрим, есть ли кто-нибудь, вызывающий данных выход, не пуста ли очередь вызов. Выбираем готовую к рандеву. В результате появляется набор открытых и готов альтернатив. Допустим, есть хотя бы одна открытая и готовая альтернатива, именно она будет выбрана и выполнена. Если таких альтернатив несколько, то выберется какая-нибудь из них. Охранное ограничение: для входа ПОЛОЖИТЬ –буфер не полный. У альтернативы с приемом входа ВЗЯТЬ из буфера условие такое: брать можно из полного буфера, либо который не пуст, и если никто не хочет положить. Если не создается приоритет для процесса анализ, то можно потерять сообщение. Т.о. производится выбор действия в зависимости от ситуации: пуст буфер, полон буфер, наполовину полон, может кто-то положить еще сообщения, никто не может.
Пример с измерением температуры
Бесконечный цикл, где есть select, количество альтернатив на прием входа должно быть хотя бы одно. Вход задачи считывает откуда-то значение температуры. В качестве альтернативы – альтернатива задержки. Эта альтернатива всегда открыта. Когда он выполняется, проверяется, есть ли вызов этого входа. Если вызов есть, он отрабатывается. Если вызова нет, то переходим на альтернативу задержки. Если за указанное время пришел вызов входа, то отработается оператор приема. Если за это время вызов не пришел, выполняется операторы после, возбуждение исключительной ситуации. Другой вариант со стороны измеряющей. Бесконечный цикл, select. Альтернативы. Присваивается значение текущей температуры. В качестве хвоста оператора select будет else часть. Если кто-то хочет мгновенно считать текущую температуру, то ему предоставляется такая возможность, иначе переходим в else часть. Снова выбор действия производится в зависимости от ситуации. Процесс-клиент тоже выбирает действие в зависимости от ситуации. Клиент всегда знает, что он хочет. Может быть лишь один вызов входа(обращение к одному мастеру). Бесконечный цикл. Пусть надо считать какую-то информацию. Это происходит так: вызов входа устройства для чтения, операторы для случая, если обработали, выход из бесконечного цикла и потом else часть, в которой некие локальные вычисления. Делается попытка вызова входа. Если рандеву немедленно невозможно, то сразу перескакиваем в else часть. Это называется условный вызов входа. Второй вариант выбора клиента – временной. Select, первым оператором является вызов входа. Происходит вызов входа, если рандеву немедленно возможно, то оно отрабатывает, если невозможно, то вызов становится в очередь. Если за указанное время задержки вызов будет обработан, то хорошо. Если за указанное время рандеву не состоялось, то вызов входа изымается из очереди. Все описанные выше механизмы были известны еще в 1970е года. Все остальное было добавлено в 1995 году. Добавлены были 2 основные вещи: защищенные записи и асинхронная передача управления.
Асинхронная передача управления
Пример: ключевое слово select. Оператор состоит из двух частей. В прерываемой части описываются некие действия, а в другой части – условия, при наступлении которых эти условия могут быть прерваны. Примеры таких условий: по прошествии некого времени или вызов входа.