Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 135
Текст из файла (страница 135)
Сущеспювание переменных монитора, за исключением переменных в процедуре монитора, начинается с выполнения оператора ъпь к и заканчивается одновременно с завершением программы. Их область видимости ограничивается самим монитором. Экспортированные процедуры монитора можно вызвать либо процессамн, либо процедурами в других мониторах. 12.4.2. Синхронизация взаимодействия Одно из наиболее важных свойств монитора заключается в том, что совместно используемые данные размещаются именно в мониторе, а ни в одном модуле-клиенте. Таким образом, программист не синхронизирует взаимно исключающий доступ к совместно используемым данным с помощью семафоров нли каких-либо иных механизмов.
Поскольку все методы доступа солержатся в мониторе, лла того, чтобы гарантировать синхронизированный доступ, можно выполнить реализацию монитора, просто поставив условие, что в один момент времени разрешаетсв только один доступ. Выювы процедур монитора неявно устанавливаются в очередь, если монитор занят в момент его вызова.
12.4.3. Синхронизация конкуренции Несмотря на то по взаимно исключающий доступ к совместно используемым данным является внутренним свойством монитора, взаимодействие процессов остается залачей программиста. В частности, программист должен пзрантировать, что в совместно используемом буфере не произойдет переполнения или потери значимости. Для этой цели язык Сопсцпепг Рааса) имеет специальный тип данных срзеие и две операции с ним: с(е1ау и 12.4.
Мониторы сопс1пце. Тип с1цеце имеет вид семафора, и две указанные операции связаны с операциями семафора зепи и ге1еаве. Переменная типа с1цеце хранит процессы, которые ожидают своей очереди на доступ к совместно используемой структуре данных. Операция ае1ау получает переменную типа с1цеце как параметр. Ее действия сводятся к помещению вызывающего ее процесса в указанную очередь и отмене его прав на исключительный доступ к структурам данных монитора. Таким образом, процесс, выполняющий операцию бе1ау, приостанавливается.
В этом случае монитор доступен другим процессам. Вследствие этого операция де1ау отличается от операции семафора ма 1 с, поскольку операция де 1 ау всегда блокирует вызывающую ее задачу. Операция сопсзпце также получает параметр типа с1цеце. Она разъединяет вызывающий ее процесс и монитор, освобождая, таким образом, монитор и предоставляя его в распоряжение других процессов; затем операция сопсдпце проверяет указанную очередь. Если эта очередь содержит некоторый процесс, этот процесс удаляется из нее и его выполнение, приостановленное операцией ое1ау, запускается вновь. Операция соптдпце отличается от операции семафора ге1еаве, поскольку операция ге1еаае выполняет некоторые действия, в то время как операция сопс 1 пое ничего не делает, если очередь пуста. На рис.
12.2. показана программа, содержащая четыре процесса и монитор, обеспечивающий синхронизированный доступ параллельно выполняемых процессов к совместно используемому буферу. Про~рамма Рнс. П.З. Программа, применяющая.монитор для управления доступач к соачестно нспо|ьэуечочу буферу С помощью типа данных с1цеце, операций ае1ау и сопсдпце можно создать монитор, который управляет совместно используемым буфером, обеспечивая таким образом как синхронизацию конкуренции, так и синхронизацию взаимодействия.
В следующем примере совместно используемый буфер реализован как список с круговой логической структурой, состоящий из 100 целых чисел. Глава 12. Параллельность аура батаЬиГ = воп1аог попас Ьийвтге = 100; чаг Ьиб : аггау «1..Ьийв1те] ой 1птедег; пехт 1п, пехт сит: 1..Ьибвуге; й111еб : О..Ьи1в1тег вепаег с(, тесеучет д : диеиа; ргоовс]иге опеку бероя1т(1теи : 1птедег); Ьед1п 1г' 4111еб = Ьийв1те еЬеп бе1ау(вепсег д); Ьи1[пехг 1п] := 1тепг пехг. 1п : (пехт 'и воб Ьи1в1те) + 1; 1111еб := т111еб + 1; сопт'пие(гесеат ег д) б; ргосебиге впегу ЙетсЬ(чаг 1 еп : 1птедет)) Ьедап 1т 1111еб = 0 еЬеп бе1ау(гесеачег д)) 1теж := Ьит[пехт оиг]; пехт сит := (пех сит воб Ьитв1те) + 1) 1111еб 111).еб -1.
соптупие(яепбет Ч) впб; Ьед1п 1111еб := 0; пехт 1п := 1; пехт си := 1; епс1) Экземпляр типа багаЬи1 является абстракцией частного вида буфера, храняшего целые числа. Кроме того, буфер типа батаЬи1 координирует операции добавления и удаления его значений с помошью параллельных процессов. Целостность буфера гарайтируется механизмами, использованными при его построении. Он зашишен от переполнения и потери значимости, и параллельные процессы, используюшие его, не могут разрушительным образом воздействовать друг на друга. Ниже приводится пример объявления процессов, которые могут использовать монитор батаЬи1.
аура ргобисег = ргоаевв(Ьиййег : батаЬий) чаг пенча1ие : 1птедет; Ьад1п оус1е -- произвести значение пеича1ие-- Ьиттет.беров1т(пенча1ие)г $19 ] 2.4. Мониторы а аг Гуре сопяцжег = ргосввв!Ьцййег с(атаЬц1)г чат ятогес) ча1ие : 1пкедет) Ьед1п оуо1е Ьцттег. ЙетсЬ(ятогес( ча1ие) г -- получить значение ягогес(ча1ие-- впс( епс() Объявления куре монитора с(агаЬцг и два процесса ргос(цсег и сопяипег можно поместить в разделе объявлений программы. в которой они должны быть использованы, как показано ниже: -- объявления гуре чаг пеи ргог)исет : ргот)исетг пеи сопяцаег : сопяоветг пеи Ьой1ег : с(асаЬой; Ьедйп йпяк пеи Ьцй1ег, пеи ртос(цсег(пеи Ьцт'тет), пеи сопяцаег(пеи Ьибгег)г епа) Зго может показаться несколько странным читателю, не знакомому с параллельными программами, поскольку не совсем ясно, как начинается или заканчивается программа.
Наш пример программы начинается с выполнения оператора япйк, когда создается буфер и два процесса, и в это же время начинается выполнение процессов. Заметим, что циклы оуо1е ... епа и в процессе ргос)цсег, и в процессе сопяоаег являются бесконечными.
Они не заканчиваются никогда. 12.4.4. Оценка Мониторы являются более удачным способом синхронизации конкуренции, чем семафоры, в основном из-за проблем. связанных с семафорами, как показано в разделе 12.3. Однако использование переменных типа дцеие для синхронизации взаимодействия с помощью операций с(е1ау и сопгупие порождает те же проблемы, что и семафоры, применяемые для этой цели в других языках. 12.5.
Передача сообщений Монитор — это надежный и безопасный метод обеспечения синхронизации конкуренции при доступе к совместно используемым данным в параллельных модулях, использующих одну и ту же память. Рассмотрим задачу синхронизации работы модулей в распределенной системе, в которой каждый процессор имеет свою собственную память вместо обшей совместно используемой памяти. Очевидно, монитор — не очень естественная конструкция в этой ситуации.
Однако синхронизации в распределенной системе можно совершенно естественно достичь с помощью передачи сообщений. $20 Глава 12. Параллельность 12.5.1. Введение Первые попытки разработать языки программирования, обеспечивающие возможность передачи сообщений между параллельными задачами, были прелприняты Бринчем Хансеном (1978) и Хоаром (!978). Первые разработчики передачи сообщений изобрели также способ решения проблемы. возникающей, когда задачи, поддерживающие связь с данной задачей, посылают к ией несколько одновременных запросов. Было решено применить недетерминированный полход для того. чтобы выбор запроса, который должен стать первым, был справедливым. Эту справедливость можно определить по-разному, но, в общем, она означает, что всем запросам предоставляются равные шансы при поддержании связи с данной задачей. Недетерминированные конструкции для управления на уровне операторов, названные защищенными команлами, были созданы Дийкстрой (1975).
(Защищенные колзанды обсуждались в главе 7.) Защищенные команды являются основой конструкции, разработанной лля управления передачей сообщения. 12.5.2. Концепция синхронной перадочи сообщений Передача сообщений может быть либо синхронной. либо асинхронной. Асинхронная передача сообщений в языке Ада 95 описана в разделе 12.6. Злесь мы рассматриваем синхронную передачу сообщений.
Основная идея синхронной передачи сообщений состоит в том, что задача часто нахолится в состоянии занятости и поэтому не лолжна прерываться другими модулями. Предположим, что залачи А и В выполняются одновременно, и задача А желает передать сообщение задаче В. Очевидно, если залача В занята, нежелательно позволять другой задаче прерывать ее. Это может прервать текущую обработку данных, выполняемую задачей В. Кроме того, сообщения часто вызывают выполнение связанной с ними обработки ланиых в получателе, что может оказаться бессмысленным. если другая обработка данных осталась незавершенной.
Альтернатива заключается в том, чтобы обеспечить лингвистический механизм, позволяющий задаче указывать другим задачам. когда именно она готова получать сообщения. Зто похоже на ситуацию. когда руководитель инструктирует своего секретаря ни с кем его ие соединять, пока не закончится важное совещание. Позднее руководитель говорит секретарю, чтобы он соединил его с одним из звонивших во время совещания. Задачу можно разработать так, что она приостановит свое выполнение в некоторой точке либо потому, что она свободна, либо потому, что ей нужна информация от лругого модуля, чтобы продолжить свое выполнение. Зто похоже на человека, ожидающего важного звонка.
Иногда остается только сидеть и жлать. В этой ситуации, если задача А хочет передать сообщение задаче В, а задача В готова к получению сообщения, то сообщение можно передавать. Эта реальная передача сообщения называется рандеву (гепбехчоцх). Заметим, что рандеву может состояться, только если и отправитель, и получатель желают, чтобы оно произошло. Информашпо, содержащуюся в сообщении. можно передавать в обоих швтравлениях.
И синхронизацию взаимодействия, и синхронизацию конкуренции залач улобно осуществлять с помощью модели передачи сообщений, как описано в дальнейших подразделах. 321 12.5. Передача сообщений 12.3.3. Модель передачи сообщения в языке Ада М Разработка задач в языке Ада частично основывается на работе Бринча Хансена и Хоара. которая в основу разработки кладет перелачу сообщений, а для выбора среди конкурирующих задач используется недетерминированный подход. Полная модель задач в языке Ада сложна, и дальнейшее ее обсуждение должно быть ограничено. Здесь мы сосредоточимся на механизме синхронной передачи сообщений в языке Ада.
В языке Ас(а задачи могут быть более активными, чем мониторы. Мониторы — это пассивные сушности, обеспечиваюшие средства управления совместно используемыми данными. храияшимися в них. Однако они предоставляют свои услуги только тогда, когда в ннх возникает необходимость.