Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 137
Текст из файла (страница 137)
Если очереди всех открытых операторов пусты, задача ожидает поступления сообщения в один из тех операторов аооврк. во время которого происходит рандеву. Если выполняется оператор вв1вок и все операторы аооврк закрыты, возникает исключительная ситуация, или ошибка. Этого можно избежать, либо гарантируя. что условие из оператора м)твп всегда истинно, либо добавляя оператор в1вв в оператор вв1воц. Оператор в1вв может содержать любую последовательность операторов.
за исключением оператора аооврк. Оператор вв1воц может содержать особый оператор квхайпацв. который выбирается только тогда, когда данный оператор открыт, а любой другой оператор аооврк закрыт. Прн выборе оператора вв1воц задача уже закончила свою работу, но еше не завершилась. Завершение залачи обсуждается ниже в этом разлеле. 12.$.5. Синхронизация конкурвнции ) войства, описанные выше, обеспечивают синхронизацию взаимодействия и связь между задачами. Далее мы обсуждаем, каким образом можно обеспечить взаимно исключающий доступ к совместно используемым структурам данных.
Если доступ к структуре данных лолжен управляться задачей, то взаимно исключающий доступ можно обеспечить, объявив эту структуру данных внутри задачи. Семантика выполнения задачи обычно гарантирует взаимно исключающий доступ к структуре, поскольку в каждый момент времени в задаче может быть активным только олин оператор аооврк. Единственное исключение из этого правила допускается, когда задачи вложены в процедуры или другие задачи. Например, если задача, определяющая совместно используемую структуру данных, имеет вложенную задачу, то эта вложенная залача может также иметь доступ к ланной структуре, что может разрушить целостность данных.
Следовательно, задачи, предназначенные для управления доступом к совместно используемой структуре данных, не должны определять другие задачи. Ниже приводится пример задачи на языке Ада для обеспечения синхронизированного доступа к буферу.
Это очень похоже по эффекту на наш пример монитора. пав)е ВОГ ТАЯХ Ев вакху ОЕРОБ1Т(1ТЕМ : Еп 1ИТЕСЕК)т впцку ГЕТСН(1ТЕМ : оиц 1МТЕОЕК)) ( ВОГ ТАЯХ) сав)т )тот(у В0Г ТАЯХ Ев ВУГЯ12Е : оопвкапй 1НТЕЯЕК : 100т ВОГ : аккау (1..ВОГЯ12Е) оЕ 1НТЕОЕКт ГТЬЬЕР : 1ИТЕОЕК каттдв О..ВОГБ12Е : От МЕХТ 1Нг БРЕХТ СОТ : 1ИТЕОЕК катзов 1..ВОГЯ12Е : 1т )звдЫ 1оор вв1вок м)твп Г1ЬЬЕО < ВОГБ12Е =) $2У 12.5. Передача сообщений ассврс ОЕР081Т(1ТЕМ : 1п 1НТЕОЕК) сзо ВОГ(НЕХТ 1Н) : 1ТЕМ] впсз РЕР081Т; ИЕХТ 1Н: (НЕХТ 1Н аосз ВОГЯ1ЕЕ) + 1; Г1ЬЬЕО : Г1ЬЬЕО +1; ок иЬеп Г1ЬЬЕО > О => ассерк ГЕТСН(1ТЕМ : оис 1НТЕОЕК) с]о 1ТЕМ : ВОГ(НЕХТ ООТ): епс( ГЕТСН; НЕХТ ОПТ : (НЕХТ ООТ асс] ВОГ81ЕЕ] + 1; Г1ЬЬЕО := Г11 ЬЕΠ— 1; апс( ва1ескз впс$1оор; а ВОГ ТАЯХ] В этом примере оба оператора ассерк явлаотся расширенными.
Онн позволяют выполнять задачу ВОГ ТАБК параллельно с вызывающими ее задачами. Задачи производителя и потребителя, которые могуг использовать задачу ВОГ ТАЯК, имеют слелуюший вид: Каа]с РКОООСЕКс гав]с СОНЯОМЕК; Еав]с Ьобу РКОРОСЕК Ев НЕИ ЧАЬОЕ : 1НТЕСЕК; Ьесап 1оор — произвести значение переменной НЕИ ЧАЬОЕ— ВУГ ТйЯК.ОЕР081Т(НЕИ ЧА1ЛЕ); епс( 1оор> апс( РКОРОСЕКз Еав]с Ьос$у СОНБОМЕК ь ° ЯТОКЕО ЧАЬУЕ : 1НТЕОЕК] Ьасзп 1оор ВОГ ТйБК.ГЕТСН(ЯТОКЕО ЧАЬОЕ]; — использовать значение переменной ЯТОКЕР ЧАЬОЕ— а]. р; впсз СОНЯОМЕК] 12.$.6. Зеве(йзиеиие йездечи Рассмотрим понятие '"завершение задачи". Выполнение задачи закончено, если управление достигло конца его тела кода.
Это должно когда-то произойти, посколысу при этом возникает исключительная ситуация, для которой не предусмотрен обработчик. (Обработка исключительных ситуаций в языке Ада описна в главе 13.) Если задача не создала никаких других задач, называемых подчиненными, то она завершается, когда ее выполнение заканчивается. Задача, создавшая подчиненные задачи, завершается, когда закончено выполнение ее кода, и все подчиненные ей задачи завершены. Задача может закончить свое выполнение во время ожидания в открытом операторе Квкждпаее. $28 Главе 1 2. Параллельность В этом случае задача завершается, только когда ее хозяин (блок, подпрограмма или задача, создавшая ее) и все задачи, зависящие от хозяина, либо завершены, либо пребывают в состоянии ожидания в открытом операторе Фехжз.паке.
В этом случае все задачи завершжотся одновременно. Блок нли подпрограмма не завершаются, пока все их подчиненные задачи не завершатся. 12.5.7. Прнврнтвтьз Как именованным, так и безымянным типам могут быть присвоены приоритеты. Это осуществляется с помощью указания компилятору. Например: ргайжа рг1огТФу(выражение)) Значение выражения опрелеляет относительный приоритет задачи или опрелеления типа задачи, в котором она появляется. Возможный диапазон значений приоритета зависит от конкретной реализации.
Наивысший возможный приоритет может быть задан с помощью приписывания слова 1авФ к типу ргзогЕФ у, который определяется во встроенном пакете Яузгеа. Например, приведенный ниже код определяет наивысший приоритет в любой реализации ргасвяа ргзогзгу(Яувгеа.рг1огзсу'1ааФ) г Приоритеты задач в языке Ада применяются только к задачам, находящимся в состоянии готовности. Они используются ллл определения порядка, в котором планировщик выбирает залачн для дальнейшего перевода их в текущее состояние. Если есть три задачи, ожидающие своей очереди в некотором операторе аооерт„и они имеют разные приоритеты, эти приоритеты не влияют на то, какая именно задача первой получит рандеву. 12.$.Б. Бннялрньзв евд(нзфвры Если доступ к структурам данных должен быть управляемым, и эта структура данных не инкапсулирована в некоторую задачу, то для обеспечения взаимно исключающего доступа следует использовать лругие средства.
Например, можно создать залачу бинарного семафора длл использования вместе с задачей, ссылающейся на данную структуру данных. Такую задачу бинарного семафора можно было бы определить следующим образом: Фав)с В1НАНУ ЯЕИАРНОНЕ 1в епггу НА1Т) епкгу НЕЕЕАЯЕ; епа В1МАВг' ЯЕИАРНОНЕ) Фаей Ьоау В1ЙАНУ ЯЕИАРНОВЕ дв Ьепдп 1оор аааерФ НА1Т) аосерФ НЕЕЕАЯЕ> а1. р; епс1 В1МАНУ ЯЕИАРНОНЕ) Цель этой задачи — гарантировать, что операции ХА1Т и ВЕЕЕАЯЕ выполняются поочередно. 1 2.5. Передача сообщений Задача ВХХАНУ ВЕИАРНОВЕ иллюстрирует упрощения, возможные, если сообщения в языке Аба используются только для синхронизации, не передавая при этом никаких данных. Особенно следует отметить простую форму операторов аааерк, не нуждающихся в наличии тела.
Задачу В1МАНУ ЯЕИАРНОНЕ для взаимно исключающего доступа к совместно используемой структуре данных можно использовать точно так же, как и семафоры в примере из раздела 12.3. Конечно, это применение семафоров страдает от все тех же потенциальных проблем, обсуждаемых здесь. Подобно семафорам мониторы можно моделировать с помощью возможностей задач в языке Ада. Задачи обеспечивают неявный взаимно исключающий доступ точно так же, как и мониторы. Таким образом, модель задач в языке Аба поддерживает как семафоры, так и мониторы.
12.5.9. Оценка В отсугствие распределенных процессоров с независимыми запоминающими устройствами выбор между мониторами и передачей сообщений в качестве средства синхронизации конкуренции в некотором смысле является делом вкуса. Синхронизация взаимодействия при передаче сообщений меньше зависит от правильного использования, чем семафоры (которые требуются вместе с мониторами). Таким образом, передача сообщений немного лучше, чем остальные средства, даже в среде с совместно используемой памятью. Однако лля распределенных систем передача сообщений является лучшей моделью обеспечения параллельности, поскольку она естественным образом поддерживает концепцво отдельных процессов, выполняемых параллельно на отдельных процессорах. 12.б. Параллельность в языке Ада 95 Одной из целей при разработке языка Ада было улучшить возможности языка Ада 83 для поддержки параллельности.
Использование исключительно модели передачи сообщений в языке Ада 83 для управления доступом к совместно используемым данным приводит к медленному выполнению вследствие сложности механизма рандеву. Чтобы разрешить эту ситуацию, язык Ада 95 использует защищенные обьекты (ргогесгед оЬ)есгз), обеспечивающие более удобное и эффективное управление доступом к совместно используемым данным. Язык Аба 95 также содержит метод обеспечения асинхронной связи между задачами. Сначала обсудим защищенные объекты.
12.6.1. Защищенные объекты В языке Айа 83 доступ к совместно используемым данным управляется путем вложения данных в задачу и разрешения доступа только через входы задачи, что неявно обеспечивает синхронизацию конкуренции. Одна нз проблем, связанных с этим способом, состоит в том, что трудно эффективно реализовать механизм рандеву.
Защищенные обьекты а языке Ада 95 обеспечивают альтернативный способ поддержки синхронизации конкуренции, который не нуждается в применении рандеву. Защищенный объект не является задачей; он больше похож на монитор. Доступ к защищенным объектам можно получить либо через защищенные полдрограммы, либо через входы, похожие иа входы задач. Защищенные подпрограммы могут быть либо за- 530 Глава 12.
Параллельность шишенными процелурами, обеспечивающими взаимно исключающий доступ лля чтения-записи данных защищенного объекта, либо защищенными функциями. обеспечивающими параллельный доступ лля чтения-записи этих данных. Внутри тела защищенной процедуры текущий экземпляр вложенного защищенного модуля опрелеляется в качестве переменной; внутри тела защищенной функции текущий экземпляр вложенного защищенного молуля определяется в качестве константы, позволяющей параллельный доступ только для чтения. Входные вызовы защищенного объекта обеспечивают синхронную связь с олной или несколькими задачами. использующими один и тот же защищенный объект.
Эти вхолные вызовы обеспечивают доступ, похожий на доступ к данным, включенным в задачу. Проблему буфера, решенную с помощью задачи в языке Аба в прелылушем подразделе, можно проще решить с помощью защищенного объекта. ргогесгес( ВОГГЕН Дв воску ОЕРОЯ1Т(1ТЕМ : хп ?ИТЕОЕН); влеку ГЕТСН(1ТЕМ : оик ?НТЕОЕН)) ркхчаке ВОГЯ1ЕЕ : оопасапк ?ИТЕОЕН := 100; ВОГ : аккау (..ВОГЯ?ЕЕ] ов 1ИТЕОЕВ; Г?ЕОЕО : ?НТЕОЕН калде 0..ВОГЯ?ЕЕ := 0; НЕХТ ?И, НЕХТ ООТ : 1НТЕОЕН калде 1..ВАРЯ?ЕЕ : 1; епс? ВОГГЕРГ ргогескес( Ьоау ВОГГЕК Ее васку 0ЕРОЯ?Т(1ТЕМ : Еп 1(ЧТЕОЕН) нЬеп Г?Е? Е0 < ВОГЯ?ЕЕ Ее Ьвдзп ВОГ(НЕХТ 1Ч) := 1ТЕМ; (ЧЕХТ ?И : (НЕХТ 1(Ч аос? ВОГЯ?ЕЕ) + 1; Г???Е0: Г???ЕО + 1? впо 0ЕРОЯ1Т; епску ГЕТСН(1ТЕМ : оик ?ИТЕОЕК) нЬеп Г?ЬЕЕ0 > 0 Ее Ьедсп ?тем : ВОГ(нехт Оот); НЕХТ ООТ :- (НЕХТ Оот аос? ВОГЯ?ЕЕ) + 1; епс? ГЕТСН; епч? ВБГГЕР; 12.6.2.