Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 139
Текст из файла (страница 139)
так и составным. На время выполнения этого оператора или операторов объект блокируется. Таким образом. оператор или операторы выполняются точно так же. как если бы они были телом синхронизированного метода. Объект. лля которого определены синхронизированные метолы. должен иметь связанную с ним очередь. хранящую синхронизированные методы. которые девали попытки выполнения в то время, как этот объект обрабатывался другим синхронизированным методом. Когда синхронизированный л1етод завершит свою работу с объектом, метал, находящийся в очереди ожидания, если таковой существует, помещается в очередь задач, готовых к выполнению.
12.7.4. Синхронизация конкурвнции Синхронизация взаимодействия в языке 5ача осуществляется с помощью методов надг и посзйу, опрелеленных в классе ОЬз еог, базовом классе всех классов в языке зача. Все классы, кроме класса ОЬз еос, наследуют зти методы. Метод надс помещен в цикл, проверяющий условие законного доступа. Если зто условие не выполняется, поток помещается в очередь ожидания. Метод поп11у предназначен для того, чтобы сообщить ожидающему потоку. что ожидаемое событие произошло.
Методы на 1г и пос1 й у можно вызвать только внутри синхронизированного метода, поскольку они используют блокировку, наложенную на объект таким методом. Метод назт может возбудить исключительную ситуацию 1псеггорзес(Вхоерс1оп, являюшу)ося потомком исключительной ситуации Вхоерсдоп, Слеловательно, любой код, 12.7. Потоки языка Зача вызывающий метод назг, должен также перехватывать исключительную ситуацию 1пгеггцрсес(ехсергзоп. Предположим, что условие, выполнения которого мы ожидаем, называется ГпеСопс(1суоп. Тогда метод на1г удобно использовать следующим образом: сгу ( нЬ11е (! гЬеСопс(1г1оп) науг (); — Выполнить все, что требуется, — когда условие СЬеСопс(1С1оп станет истинным саФс)з (1псеггцрсес(Ехсерс1оп шургоЬ1еш) Оператор агу определяет область видимости обработки исключительной ситуации, а метод саесЬ является обработчиком исключительной ситуации в операторе егу.
Следующая программа реализует круговую очередь для хранения значений типа Епв, Она иллюстрирует синхронизацию взаимодействия и синхронизацию конкуренции. // Очередь // Этот класс реализует круговую очередь для хранения целых // чисел. Он содержит конструктор для размещения и // инициализации очереди заданного размера. В нем описаны // синхронизированные методы для вставки чисел в очередь // и удаления их из нее с1аев Оуеце ( ргйчаге 1пг [] с)цег ргйчаге Епг пехг1п, пехГОцс, 1111ес), с(це51гег риЬ11с Оцеце (1пг язге) ( с(це = пои Епг [яьге]; 1111ес( = О; пехс1п 1; пехСОцс = 1; ~)це51ге = я1ге; ] //** конец конструктора Оцеце риЬ11с вупспгоп1вес( чс1с( с(ероя1г (1пг 1сет) сгу ( ъгЬ11е (1111ес( = с(це51ге) науг (); с)це[пехс1п] - 1сещ; пехс1п = (пехс1п % с)це51ге) + 1( 1111ес(++г пог11у() г ) //** конец оператора Егу сагсь(1пгеггцргес(ехсерс1оп е) () ) //** конец метода с(ероя1г 536 Глава 12. Параллельность роЫ1о вупоЬгопйвей йпс бетой() ( йпс 1тев = 0; игу ( нМ1е (Е111еа == 0) наат () ] 1тев = с(це[пехтОцт); 1111ес(-; пот1бу(); //** конец оператора агу оаеоь(1птетгцргеоехсерт1оп е) () геецгп и';ею; ) //** конец метода бе" с]; //** конец класса Яоеое Заметим, что обработчик исключительной ситуации (сааоЬ) здесь ничего не делает.
Классы для определения объектов-производителей и объектов-потребителей, которые могли бы использовать кяасс 0цеце, можно определить след1юшим образом: с1ааа Ргос(осет вхееп6я ТЛтеао ( ргачаев лиепе Ьоабег; роЬ11о Ртос(осет(0оеое Чое] ( Ьоббег = ~)ое> ) рЫ. Ы () ( апе пен 1текн нЬ11е (Ггое) ( // — Произвести переменную пен 1гев Ьо1йег.с(ероя1 (пен 1тев]; ) о1ааа Сопяовег ехтеп6я ТЬгеас( ( ргачасе 0оеце Ьоййетз роЬ11о Сопсцвег(Яоеое с(ое) ( Ьоййег = с(ое) ) риЫйс чоас( гцп() ( йпа ятогес( 1сев; иЬз.1е (тгое) // — Использовать переменную ятогеб 1тев Ьоййег.йетсЛ(ятотес( 1тев); Слелуюший код создает объект класса 0оеое, а также объекты классов Ргобосег и Сопяцвег, приписанные к объекту класса 0оеое, и начинает нх выполнение: Яоеое Ьц111 = пен 0оеое(100); Ргос(осег ргоцосег1 = пвн Ргос(осег(Ьойй1)) Сопсцвег сопсцвег1 пен Сопсцвег(Ьобб1); 12.7. Потоки языка Зача 5ЗУ ргос)осег1.есагс()) сопвижег1.вгагг()) При необходимости мы могли бы определить оба класса Ргос(цсег и Сопвожег как реализации интерфейса йцппаЬ1е, а не как подклассы класса Тпгеас(.
Единственная разница заключается в первой строке, которую теперь можно записать так: с1еве Ргос(осег зжр1вжвпве йиппаЬ1е Чтобы создать и запустить объект такого класса, необходимо создать объект класса Тпгеао, связанный с этим объектом. Это иллюстрируется следующим кодом; ргоаисвг р ос)осег1 = пвн Ргос(исег(Ьийй1) г Тйгеас) ргос)цсегТЬгеас( = пвм ТЬгеас)(ргооисег1) ргос)осегТЛгеас).всагг()) 12.7.5. Оценка Поддержка параллельности в языке 3ача относительно проста, но эффективна.
В языке )ача можно легко создать и мониторы, и семафоры. 12.8. Параллельность на уровне операторов В этом разделе мы кратко рассмотрим вопросы разработки языка для поддержки параллельности на уровне операторов. Целью разработки языка является создание механизма, который программист мог бы использовать для того, чтобы информировать компилятор о возможных способах отображения программы на многопроцессорную архитектуру. Хотя язык АЕОО(.68 содержал семафоры, которые предназначались для обеспечения параллельности на уровне операторов, здесь подобное их использование не обсуждается.
В этом разделе рассматривается только один набор лингвистических конструкций лля поддержки параллельности на уровне операторов одного языка. Далее описываются конструкции и нх предназначение в терминах машины с ЯМ(у-архитектурой, хотя они разработаны так, что могут быть полезными в различных архитектурных конфигурациях. Мы обсудим также вопрос, как с помощью языковых конструкций минимизировать обмен данными между процессорами и запоминающими устройствами других процессоров. Предполагается, что доступ процессора к данным, нахолящимся в его собственной памяти, осуществляется быстрее, чем доступ к данным в памяти другого процессора.
Хорошо разработанные компиляторы отлично справляются с этим процессом, но можно достичь намного большего, если программист получит возможность предоставлять компилятору информацию о возможной параллельности, которую можно было бы использовать. 12.8.1. Язык Н!Яй-Рейапнаасе РОЯТЯАМ Язык Н(8Ь-Рег(оппапсе ГОКТКАН (НРГ) (АСМ, 1993Ь) — это набор расширений языка ГОКТКАН 90, предназначенных лля того, чтобы предоставлять компилятору информацию, способствующую оптимизации выполнения программ на многопроцессорных компьютерах.
Язык НРГ содержит как новые операторы спецификации, так и внутренние, или встроенные, подпро(раммы. В этом разделе обсуждаются только некоторые из новых операторов. 53$ Глава ) 2. Параллельность Основные операторы спецификации в языке НРЕ предназначены для указания количества процессоров, распределения данных между запоминающими устройствами этих процессоров, а также выравнивания данных в памяти. Операторы спецификации в языке НРЕ появляются в программе в виде специальных комментариев. Кажлый из них начинается префиксом ! НРРЯ, где знак ! — это символ, начинающий строку комментария в языке ЕОКТКА)ч 90. Этот префикс делает их невидимыми лля компиляторов языка ЕОКТКАН 90, но легко распознается компиляторами языка НРЕ.
Спецификация РКОСЕЯЯОК5 имеет следующий вил; !НРГЯ РКОСЕЯЯОКЯ ргосв (и) Этот оператор указывает компилятору количество процессоров, которые могут использоваться колом, сгенерированным для этой программы. На основе этой информации совместно с другими спецификациями компилятор определяет, как именно распределены данные между запоминающими устройствами, связанными с этими процессорами. Оператор 015ТК1ВОТЕ указывает, что данные являютея распределенными, а также отмечает вид используемого распределения.
Его форма такова: !НРГ5 015ТК1ВОТЕ (вид) ОИТО ргосв :: список идентификаторов В этом операторе внд распределения данных может залаваться ключевым словом ВЬОСК или СУСЫС. Список илентификаторов — это имена массивов, подлежащих распределению. Переменные, которые поллежат распределению вида ВЬОСК, разделяются на п одинаковых групп, каждая из которых состоит из смежных наборов элементов массивов, равномерно распрелеленных между запоминающими устройствами всех процессоров.
Например, если массив из 500 элементов под названием Ь15Т распределен как ВЬОСК между пятью процессорами, то первые 100 элементов массива ЫЯТ будут размещены в памяти первого процессора и т.д. Распределение СУСЬ1С указывает на то, что отлельные элементы массива циклически размещаются в запоминающих устройствах процессоров. Например, если массив Ь15Т распределен как СУСЫС между пятью процессорами, то первый элемент массива Ь1ЯТ будет размещен в памяти первого процессора, второй элемент — в памяти второго процессора и т.д. Форма оператора АЫ ОМ такова: АЫОБ массив1 элементов Х1ТН массив2 элементов Оператор АЫОИ используется для связи между распределениями двух массивов.