Н. Джехани - Язык Ада (1988) (1160771), страница 31
Текст из файла (страница 31)
При этом задача СОХЯЗМЕК должна завершаться после получения этого символа от задачи В(ЗРРЕК. В этом случае следует зарезервировать символ, являющийся признаком завершения. 2. Добавить новые входы к задаче В1ЗРРЕК. Используя эти входы, задача РКОО(ЗСЕК будет информировать задачу В(ЗРРЕК о том, что пересылка данных закончена, а задача СОХЯЗМЕК вЂ” определять, исчерпаны ли данные.
Задача СОХЯЗМЕК завершается, если данные закончились. 3. Добавить к задаче В(ЗРРЕК вход, используя который задача может определить, содержатся ли в буфере символы. После того как задача СОХЯЗМЕК определит, что задача РКОО(ЗСЕК закончилась или завершилась (с помощью атрибута САЬ(.АВ(.Е), а задача ВБРРЕК не содержит больше символов, она заканчивается. 4. Изменить структуру программы. Ни одна из этих альтернатив не является совершенной.
Тем не менее первая из них кажется предпочтительной. Задача ВЗЗРРЕК приостанавливает задачи РКОО(ЗСЕК и СОХЯЗМЕК на время, необходимое для обмена данными между задачей В(ЗРРЕК и этими задачами, т. е. до конца оператора принятия, соответствующего входу, вызываемому задачами. Было бы нежелательно останавливать выполнение задач на время большее, чем необходимо.
Например, оператор принятия эг'К1ТЕ'в задаче В(ЗРРЕК можно переписать следующим образом: ассер( %К1ТЕ(С: 1п СНАКАСТЕК) йо О(1ХВ пнк$ Х); С; 1ХВ: 1ХВ пни1 Х + 1; евп' 'эг'К1ТЕ; Однако данный фрагмент является неэффективным, так как задача РКОО(ЗСЕК будет приостановлена на время, необходимое для проведения локальных вычислений в задаче В1ЗРРЕК (увеличение значения 1ХВ). Чтобы избежать необязательных задержек вызывающей задачи, следует делать как можно более короткой последовательность операторов, заключенную в скобки йо ... епй оператора принятия. 4.14.4.
Управление планированием задач Вызовы входов принимаются в порядке первым пришел — первым вышел (Р1РО). Однако в некоторых случаях необходимо организовать другой порядок обслуживания. Например, запросы на доступ к диску могут обрабатываться в таком порядке, чтобы свести к минимуму необходимые передвижения магнитной головки, а операционная система в свою очередь может планировать выполнение заданий так, чтобы сначала обрабатывались задачи с наименьшим временем выполнения, что минимизирует среднее время ожидания обработки. Главе 4 Один из способов реализации механизма планирования схемы выполнения задач заключается в использовании семейства входов. Предположим, что запросы на обслуживание подразделяются на три категории и описываются как (уре КЕЯУЕЗТ (,ЕЧЕ1.
!в (1)КОЕХТ, ХОКМА(., 1.0зЧ); Срочные запросы (УКОЕХТ) обрабатываются раньше всех других. Обычные (ХОКМАЕ) запросы принимаются только в том случае, если нет ожидающих обслуживания срочных запросов. И наконец, запросы с самым низким приоритетом (1.О%~) обрабатываются только тогда, когда нет задержанных срочных и обычных запросов. В рамках каждой категории запросы обрабатываются в порядке Р1ЕО.
Эту схему можно реализовать с помощью задачи БЕКЧ1СЕ, содержащей описание семейства входов КЕ()()ЕБТ! !азЬ БЕКЧ1СЕ (в еп!гу КЕ( ОЕБТ(КЕО()ЕБТ 1.ЕЧЕ1.) Ф: !и оп! РАТА); епп' БЕКЧ1СЕ; Каждый вход из семейства входов КЕ(ПЗЕЗТ обрабатывает запросы только одной категории. Так, вызов входа БЕКЧ1СЕ.КЕО()ЕБТО)КОЕХТ) Ф); — Р— это данные является запросом на срочное обслуживание. Тело задачи БЕКЧ1СЕ имеет следующий вид: еавЬ Ьоду БЕКЧ1СЕ !е — локальные описания Ьей!и !еер ее!ес! аееер! КЕО()ЕЗТ(ПКОЕХТ) Ф: (п оп! РАТА) ео обработать запрос епе КЕ()()ЕБТ ег нЬеп КЕО()ЕБТЙЖОЕХТ) СО13ХТ 0 > — число задач, находящихся в очереди к — входу, определяется атрибутом СО()ХТ. ассер! КЕ()1)ЕБТ(ХОКМА1,) (Р: 1п еп! РАТА) йо обработать запрос епй КЕ( НЗЕБТ ег ггЬеп КЕЯ()ЕБТЙЖОЕХТ)'СООХТ 0 апй КЕО1)ЕБТ(ХОКМА(.)'СО()ХТ 0 > ассер! КЕЯ13ЕЗТ(1.0!Ч) (Р: !и оп! РАТА) йе збз Пв еяяепьноагь обработать запрос епд КЕ(11)ЕВТ; епо ке1еей ев1 1оор; епд БЕКЧ1СЕ; Приведенную схему нельзя использовать для реализации алгоритмов планирования, которые минимизировали бы число передвижений магнитной головки илн среднее время ожидания обработки.
Для реализации обшей схемы планирования нужно использовать двухступенчатый процесс, содержащий вызовы двух входов. На первом этапе задача, выдающая запрос на обслуживание, получает идентификационный номер и выполняет вызов входа, показывающий, что данная задача ожидает обработки. Этот вызов принимается немедленно, а задача ЯЕКЧ1СЕ каким-либо образом помечает вызывающую задачу. Данная стадия называется стадией подключения. На следующем этапе вызывающая единица выдает еще один вызов входа.
Этот вызов входа принимается задачей БЕКЧ1СЕ только в том случае, если она может выполнить запрос на обслуживание. Данная стадия называется стадией ожидания обработки. В данном алгоритме два вызова входа необходимы потому, что задача БЕКЧ1СЕ не может планировать обработку вызывающей задачи, например А, до тех пор, пока она не выполнит рандеву с этой задачей и не получит необходимую информацию о запросе и требуемых ресурсах. Задача А получает уникальный идентификационный номер, который затем используется при обслуживании. Регистрация запроса на обслуживание происходит во время первого вызова задачи БЕКЧ1СЕ на входе КЕС1БТЕК КЕ( ()ЕЯТ. После этого задача А снова вызывает задачу БЕКЧ!СЕ. Теперь задача А вызывает тот вход из семейства входов ОЕТ БЕКЧ1СЕ, который соответствует ее идентификационному номеру.
После этого задача А задерживается до тех пор, пока ее запрос на обслуживание не будет обработан. Следующая обрабатываемая задача, т. е. задача, запрос которой будет принят на вход ПЕТ-ЯЕКЧ1СЕ, определяется задачей ЯЕКЧ1СЕ в соответствии с некоторым алгоритмом планирования.
Задача БЕКЧ1СЕ является реализацией следующего абстрактного алгоритма: 1оор принять все задания„ожидающие обслуживания обработать запрос на обслуживание одной задачи (если он есть) епд !оор Если разрешить вызывающей задаче действительно выполнять два вызова входа, то это может привести к нежелательным ошибкам. Вместо этого вызовы входов помещаются в тело процедуры, поэтому задача, выдающая запрос на обслуживание, должна выполнить только один вызов процедуры (синтаксически аналогичный вызову входа). Спецификация подпрограммы не может находиться внутри спецификации задачи, поэтому задача БЕКЧ!СЕ помещается в пакет ЯЕКЧ1СЕ РАСКАОЕ: збг Глввв 4 расйайе БЕКЧ1СЕ РАСКАОЕ 1в -- определение типа РАТА ргосез3аге ОЕТ БЕКЧ1СЕ(Р: !а оа! РАТА); еао БЕКЧ1СЕ РАСКАОЕ; расйаае Ье$у БЕКЧ1СЕ РАСКАОЕ!в ваЬ!уре 1Р 1в 1МТЕОЕК гапйе 1..100; — процедуры МЕХТ 1Р, РКЕЕ 1Р и данные для — назначения/освобождения идентификационных номеров — требующим обработки задачам.
Они используются в — процедуре ОЕТ БЕКЧ!СЕ, — Другие локальные описания пакета БЕКЧ1СЕ РАСКАОЕ агвЬ БЕКЧ1СЕ !в еп!гу КЕ018ТЕК КЕОПЕБТ(1Р) Ф: 1а оа! РАТА); — подключиться — Семейство входов с типом индекса 1Р Задание с уникальным идентификационным — номером Я типа 1Р вызывает для обслуживания вход 5 епвгу 8ЕКЧЕ КЕЯ()ЕБТ(1Р) Ф: !п оа! РАТА); ев$8ЕКЧ!СЕ; ргосеааге ОЕТ БЕКЧ1СЕФ: !п оа! РАТА) !в Ьеи(а Получить уникальный идентификатор [ — зарегистрировать запрос на обслуживание; вход ! из — семейства входов КЕ01БТЕК КЕ(.ИЗЕБТвызывается с данными Р БЕКЧ1СЕ.КЕ018ТЕК КЕЯОЕБТ(1) Ф); — ожидать обслуживания БЕКЧ1СЕ.БЕКЧЕ КЕЯ13ЕБТ(1) Ф); освободить идентификатор 1 еао ОЕТ БЕКЧ1СЕ; Гав1с Ьоду БЕКЧ1СЕ 1в Ьей!п 1оор 1ог 1!п 1Р!оор — вызовы семейства входов принимают — в цикле ве!есв — опросить все входы семейства входов; — каждому входу из семейства входов соответствует — только олин вызов, так как требующим обработки — заданиям были присвоены уникальные — идентификационные номера эссер! КЕ018ТЕК КЕ( ПОЕБТ(1) (Р: !п оа! РАТА) до Пл лллельлосгь — добавить задание ! к списку заданий, ожидающих — — обслуживания епд КЕб!ВТЕК КЕ(.ИЗЕТ; е!яе ппй; епд яе)ес(; епд 1оор; !1 имеются задания, ожидающие обслуживания гпеп — Выбрать очередное обрабатываемое задание — в соответствии с алгоритмом планирования ассер( БЕКЧЕ КЕЯ(ЗЕЙТ(К) Фз(п оо1 РАТА) до епд ЯЕКЧЕ КЕ(11)ЕБТ; епд !Е епд 1оор; епд БЕКЧ!СЕ; епд БЕКЧ1СЕ РАСКАСЕ; 4.14.5.
Упорядоченные сигналы в языке Модула Гчт'1К77а — 'Ж1К77В) ва11 (Я, К) Задержать вызывающий процесс до тех пор, пока он не получит сигнал Б и не выдаст ранг задержки К процесса (К вЂ” положительное целое выражение). пай (Б) кепд (Я) То же самое, что н па(Г (Я, 1). Послать сигнал процессу, который ожидает сигнал Б и имеет минимальный ранг задержки. Если имеется несколько процессов с одинаковыми рангами задержки, то сигнал передается процессу, находящемуся в состоянии ожидания дольше других.
Процесс, получивший сигнал, возобновляет свое выполнение. Данный раздел посвящен реализации примитивов синхронизации параллельных процессов языка Модула. В языке Модула синхронизация процессов осуществляется с помощью сигналов. Примитивы синхронизации обеспечивают возможность определения ранга задержки процесса. (Процесс с минимальным рангом задержки имеет наивысший приоритет.) Рассмотренный ранее пакет Я101чА!. РАСКАОЕ не обеспечивает обработку ранга задержки и, кроме того, предусматривает наличие только одного сигнала.
Новый пакет, реализующий сигналы, позволит пользователю задавать ранг задержки процесса и описывать более одного сигнала. Синхронизирующими примитивами языка Модула являются: Глава 4 ажайес! (Б) Функция принимает значение ТВОЕ, если имеется процесс, ожидающий сигнал Б. В противном случае — значение функции РАЬБЕ. Эти примитивы будут реализованы в виде подпрограмм, содержащихся в пакете Б10ХАЬБ РАСКАОЕ.
Этот пакет содержит также лимитируемый личный тип Б10ХАЬ, используемый для описания сигналов. Тип Б10ХАЬ реализован как задачный тип, входы которого выражаются подпрограммами пакета Б1ОХА1.Б РАСКАОЕ, реализующими примитивы языка Модула. Для простоты ранг задержки будет реализован как некоторое целое значение типа КАХК в диапазоне от 1 до !О (а не произвольное целое значение). Новые сигналы можно описать как Б: Б10ХАЬБ РАСКАОЕ.Б10ХА1.; (исходя из предположения, что пакет виден в точке описания). Если задать специ- фикатор использования пве ЯОХА1.Б РАСКАОЕ; то приведенное выше описание сигнала Б можно записать просто как Б: Б1ОХАЬ; Спецификация пакета ЯОХАЬБ РАСКАОЕ имеет следующий вид: рас)гайе Б1ОХАЬБ РАСКАОЕ !а Фуре ВАХК В ганне Ь.!О; Фуре Б10ХАЬ !в Впз!ФеФ$ рпгаФе; ргосейпге %А1Т(Б: гп Б10ХА1.; Вл !п КАХК:- !); — вызов %'А1Т(Б) эквивалентен вызову %А1Т (Б, 1), — благодаря использованию значения формального параметры К, --которое задается по умолчанию.