Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРО МЕТОДИЧКА.docx
Скачиваний:
27
Добавлен:
09.12.2018
Размер:
953.18 Кб
Скачать

Система программирования на основе передачи сообщения

Широкое распространение компьютеров с распределенной памятью определило и появление соответствующих систем программирования. Как правило, в таких системах отсутствует единое адресное пространство, и для обмена данными между параллельными процессами используется явная передача сообщений через коммуникационную среду. Отдельные процессы описываются с помощью традиционных языков программирования, а для организации их взаимодействия вводятся дополнительные функции. По этой причине практически все системы программирования, основанные на явной передаче сообщений, существуют не в виде новых языков, а в виде интерфейсов и библиотек.

К настоящему времени примеров известных систем программирования на основе передачи сообщений накопилось довольно много: Shemen, Linda,DVM,MPI.

Система параллельного программирования Lindа.

Система разработана в середине 80-х годов прошлого века в Йельском университете, США. Идея ее построения исключительно проста.

Параллельная программа есть множество параллельных процессов, где каждый процесс работает как обычная последовательная программа. Все процессы имеют доступ к общей памяти, единицей хранения в которой является кортеж. Отсюда происходит и специальное название для общей памяти — пространство кортежей.

Каждый кортеж — это взятая в скобки упорядоченная последовательность значений, разделенных запятыми. Например,('"Не11о", 42, 3.14), (5,False, 97, 1024, 2), ("worker", 5).

Так, первый кортеж этого примера состоит из строки "Не11о", элемента целого типа 42 и вещественного числа 3.14.

Во втором кортеже есть элемент целого типа 5, элемент логического типа false и три целых числа.

Последний кортеж состоит из двух элементов: строки "worker" и целого числа 5. Количество элементов в кортеже, вообще говоря, может быть любым, однако конкретные реализации могут накладывать ограничения. Если первым элементом кортежа является строка, то эта строка называется именем кортежа.

Все процессы работают с пространством кортежей по принципу: поместить кортеж, забрать, скопировать.

В отличие от традиционной памяти, процесс может забрать кортеж из пространства кортежей, после чего данный кортеж станет недоступным остальным процессам.

В отличие от традиционной памяти, если в пространство кортежей положить два кортежа с одним и тем же именем, то не произойдет привычного для нас "обновления" значения переменной — в пространстве кортежей окажется два кортежа с одним и тем же именем.

В отличие от традиционной памяти, изменить кортеж непосредственно в пространстве нельзя. Для изменения значений элементов кортежа его нужно сначала оттуда изъять, затем процесс, изъявший кортеж, может изменить значения его элементов, и вновь поместить измененный кортеж в память.

В отличие от других систем программирования, процессы в системе Linda никогда не взаимодействуют друг с другом явно, и их общение всегда идет через пространство кортежей.

По замыслу создателей системы Linda в любой последовательный язык достаточно добавить лишь четыре новые функции, после чего он становится средством параллельного программирования.

Эти функции и составляют систему Linda: три для операций над кортежами и пространством кортежей и одна функция для порождения параллельных процессов.

Функция OUT - помещает кортеж в пространство кортежей.

Например, out ("GoProcess", 5) ;

помещает в пространство кортежей кортеж ("GoProcess", 5). Если такой кортеж уже есть в пространстве кортежей, то появится второй, что в принципе позволяет иметь сколь угодно много экземпляров одинаковых кортежей. По этой же причине с помощью функции out нельзя изменить кортеж, уже находящийся в пространстве.

Для этого кортеж должен быть сначала оттуда изъят, затем изменен и после этого помещен назад. Функция out никогда не блокирует выполнивший ее процесс.

Функция IN - ищет подходящий кортеж в пространстве кортежей, присваивает значения его элементов элементам своего параметра-кортежа и удаляет найденный кортеж из пространства кортежей.

Например, in ("Р", int i, false);

Этой функции соответствует любой кортеж, который состоит из трех элементов: значением первого элемента является строка "Р", второй элемент может быть любым целым числом, а третий должен иметь значение false. Подходящим кортежем считается кортеж, имеющий столько же элементов того же типа, и, если указано конкретное значение, то и такое же значение.

В данном примере подходящими кортежами могут быть ("Р", 5, false) или ("р", 135, false ), но не ("Р", 7.2, false) или ("Ргос", 5, false).

Поскольку основной способ выборки данных из пространства кортежей опирается не на адрес, а на совпадении значений отдельных полей, то само пространство кортежей можно считать виртуальной обшей ассоциативной памятью.

Если параметру функции in соответствуют несколько кортежей, случайным образом выбирается один из них. После нахождения кортеж удаляется из пространства кортежей, а неопределенным формальным элементам параметра-кортежа, содержащимся в вызове данной функции, присваиваются соответствующие значения.

Если в пространстве кортежей ни один кортеж не соответствует функции, то вызвавший ее процесс блокируется до тех пор, пока соответствующий кортеж в пространстве не появится.

Элемент кортежа в функции in считается формальным, если перед ним стоит определитель типа.

Если используется переменная без типа, то берется ее значение и элемент рассматривается как фактический параметр.

Например, во фрагменте программы

Int i = 5;

In ("Р", i, false);

функции in , в отличие от предыдущего примера, соответствует только кортеж ("Р", 5, false).

Если переменная описана до вызова функции и ее надо использовать как формальный элемент кортежа, нужно использовать ключевое словоformal или знак ?

Например, во фрагменте программы

j = 15;

in("Р", ? i, j);

Последнюю строку можно заменить и на оператор in ("Р",formal i,jз). В этом примере функции in будет соответствовать, например, кортеж ("р", 6, 15), но не ("Р", 6, 12).

Функция READ - отличается от функции in лишь тем, что выбранный кортеж не удаляется из пространства кортежей.

Все остальное точно так же, как и у функции in. Этой функцией удобно пользоваться в том случае, когда значения переменных менять не нужно, но к ним необходим параллельный доступ из нескольких процессов. Иногда вместо обозначения read для данной функции используют обозначение rd.

Функция EVAL - похожа на функцию out. Разница заключается в том, что для вычисления значения каждого поля, содержащего обращение к какой-либо функции, порождается отдельный параллельный процесс. На основе вычисленных значений функций, найденных в полях, eval формирует результирующий кортеж и помещает его в пространство кортежей.

Функция, вызвавшая eval, не ожидает завершения порожденного параллельного процесса и продолжает свою работу дальше.

Следует отметить и то, что пользователь не может явно управлять размещением порожденных параллельных процессов на доступных ему процессорных устройствах — это Linda делает самостоятельно.

Порядок вычисления полей в кортеже заранее не определение следует использовать запись или заблокировать функции in,read.

Сильные и слабые стороны системы Linda:

Простота и стройность , основной ее козырь, однако эти эффекты оказываются проблемами на практике. Если вычислительная система обладает распределенной памятью , то общая через пространство картежей заведомо сопровождается расходами.

Если процессор выполняет функции read или in, то как среди огромного числа кортежей в пространстве кортежей найти подходящий, подобную проблему пытаются решить разными способами. Например, введением нескольких именных пространств. Но все эти решения или усложняют систему либо эффект для узкого класса программ.