Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Т2. Связь_Таненбаум_СРС_ПРИС.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.59 Mб
Скачать

2.2. Удаленный вызов процедур 93

Т акой подход к подразделению на уровни приводит нас к слегка измененной эталонной модели взаимодействия (рис. 2.5). По сравнению с моделью OSI сеан­совый уровень и уровень представления заменены одним промежуточным уров­нем, который содержит не зависящие от приложений протоколы. Как мы гово­рили, эти протоколы нельзя поместить на более низкие уровни. Истинные транспортные службы также могут быть представлены в виде служб промежу­точного уровня. Для этого не потребуется даже модификации. Этот подход ана­логичен переносу UDP на транспортный уровень. Точно так же службы проме­жуточного уровня могут включать в себя службы пересылки сообщений, схожие с теми, которые предоставляются на транспортном уровне.

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

2.2. Удаленный вызов процедур

Основой множества распределенных систем является явный обмен сообщениями между процессами. Однако процедуры send и receive не скрывают взаимодейст­вия, что необходимо для обеспечения прозрачности доступа. Эта проблема была известна давно, но по ней мало что было сделано до появления в 1980 году статьи [62], в которой предлагался абсолютно новый способ взаимодействия. Хотя идея была совершенно простой (естественно, после того как кто-то все придумал), ее реализация часто оказывается весьма хитроумной. В этом разделе мы рассмот­рим саму концепцию, ее реализацию, сильные и слабые стороны.

Если не вдаваться в подробности, в упомянутой статье было предложено по­зволить программам вызывать процедуры, находящиеся на других машинах. Когда процесс, запущенный на машине А, вызывает процедуру с машины В, вызываю-

94 Глава 2. Связь

щ ий процесс на машине А приостанавливается, а выполнение вызванной проце­дуры происходит на машине В. Информация может быть передана от вызываю­щего процесса к вызываемой процедуре через параметры и возвращена процессу в виде результата выполнения процедуры. Программист абсолютно ничего не за­метит. Этот метод известен под названием удаленный вызов процедур (Remote Procedure Call, RPC).

Базовая идея проста и элегантна, сложности возникают при реализации. Для начала, поскольку вызывающий процесс и вызываемая процедура находятся на разных машинах, они выполняются в различных адресных пространствах, что тут же рождает проблемы. Параметры и результаты также передаются от машины к машине, что может вызвать свои затруднения, особенно если машины не оди­наковы. Наконец, обе машины могут сбоить, и любой возможный сбой вызо­вет разнообразные сложности. Однако с большинством из этих проблем можно справиться, и RPC является широко распространенной технологией, на которой базируются многие распределенные системы.

2.2.1. Базовые операции rpc

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

Общепринятые вызовы процедур

Для того чтобы понять, как работает RPC, важно сначала разобраться, как осуще­ствляются общепринятые (в пределах одной машины) вызовы процедур. Рас­смотрим вызов в языке типа С:

count = read(fd, buf, bytes);

Здесь fd — целое, указывающее на файл; buf — массив символов, в который будут считываться данные; bytes — другое целое, говорящее, сколько байт следует считать. Если вызов производится из главной программы, стек до вызова выгля­дит так, как показано на рис. 2.6, а. Делая вызов, вызывающая программа поме­щает параметры в стек в порядке «последний первым», как показано на рис. 2.6, б. Причина, по которой компилятор С помещает параметры в стек в обратном по­рядке, заключается в функциях типа printf. Чтобы выполняться, функция printf всегда должна знать, где искать свой первый аргумент — строку формата. После завершения read система помещает возвращаемое значение в регистр, удаляет адрес возврата и возвращает управление назад, в вызвавшую программу. Затем вызвавшая программа удаляет из стека параметры, приводя его в исходное со­стояние.

Следует особо отметить некоторые моменты. Во-первых, в С параметры мо­гут передаваться как по значению, так и по ссылке. Параметр-значение, такой как fd или bytes, просто копируется в стек, что и показано на рис. 2.6, б. Для вы­зываемой процедуры параметр-значение представляет собой просто инициали­зированную локальную переменную. Вызываемая процедура может ее изменить,