Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VSOS_2014.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.9 Mб
Скачать
      1. Вызов удаленных процедур (rpc)

Идея вызова удаленных процедур (Remote Procedure Call - RPC) состоит в расширении хорошо известного и понятного механизма передачи управления и данных внутри программы, выполняющейся на одной машине, на передачу управления и данных через сеть.

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

Реализация удаленных вызовов существенно сложнее реализации вызовов локальных процедур. Начнем с того, что поскольку вызывающая и вызываемая процедуры выполняются на разных машинах, то они имеют разные адресные пространства, и это создает проблемы при передаче параметров и результатов, особенно если машины не идентичны. Так как RPC не может рассчитывать на разделяемую память, то это означает, что параметры RPC не должны содержать указателей на ячейки нестековой памяти и что значения параметров должны копироваться с одного компьютера на другой. Следующим отличием RPC от локального вызова является то, что он обязательно использует нижележащую систему связи, однако это не должно быть явно видно ни в определении процедур, ни в самих процедурах. Удаленность вносит дополнительные проблемы. Выполнение вызывающей программы и вызываемой локальной процедуры в одной машине реализуется в рамках единого процесса. Но в реализации RPC участвуют как минимум два процесса - по одному в каждой машине. В случае, если один из них аварийно завершится, могут возникнуть следующие ситуации: при аварии вызывающей процедуры удаленно вызванные процедуры станут «осиротевшими», а при аварийном завершении удаленных процедур станут «обездоленными родителями» вызывающие процедуры, которые будут безрезультатно ожидать ответа от удаленных процедур.

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

Эти и некоторые другие проблемы решает широко распространенная технология RPC, лежащая в основе многих распределенных операционных систем.

Контрольные вопросы

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

  2. Какие события вызывают перепланировку процессов (потоков)?

  3. Может ли быть в мультипрограммной системе, основанной на квантовании, использоваться алгоритм, основанный на приоритетах?

  1. Синхронизация процессов

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

Параллельный доступ к данным может нарушить их целостность. Вернемся к задаче «Производитель-потребитель». Изменим несколько ее решение, добавив счетчик элементов counter, с тем, чтобы использовать весь объем буфера.

Схема работы производителя будет следующей:

repeat

........

[формируется очередной элемент в nextp]

........

while counter = n do no-op;

buffer [in]:= nextp;

in:=(in+1)mod n;

counter := counter + 1;

until false ;

Приведем теперь схему работы потребителя:

repeat

while counter= 0 do no-op

next c: = buffer [out];

out: = (out+1) mod n;

counter := counter - 1;

........

[потребляется очередной элемент из nextc]

.........

until false;

Поскольку оба процесса выполняются раздельно, то они могут выполняться некорректно, если работают параллельно. Например, в результате того, что оба процесса пытаются изменить значение счетчика, оно может оказаться равным 4, 5 или 6 (исходное значение 5). Покажем, что это действительно так.

Оператор counter := counter + 1 реализуется на машинном языке следующим набором команд:

register1 := counter; (T0)

register1 := register1 + 1; (T1)

counter := register1; (T2)

Аналогичным образом реализуется оператор counter := counter – 1:

register2 := counter; (T3)

register2 := register2 - 1; (T4)

counter := register2; (T5)

Заметим, что register1 и register2 могут быть одним и тем же физическим регистром.

Если последовательность выполнения команд будет T0, T1, T2, T3, T4, T5, то переменная counter получит верное значение 5. При последовательности выполнения T0, T1, T3, T4, T5, T2 переменная counter получит значение 6, а при последовательности выполнения T3, T4, T0, T1, T2, T5 - значение 4. Некорректность получилась за счет того, что мы разрешили обоим процессам работать с переменной counter параллельно.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]