Основы ОС Unix RPC (Remote Procedure Call) Удаленный вызов процедур Основы ОС Unix 5/21/08 Слайд 1 из 34 Сегодня: RPC – основа NIS и NFS ● ● ● ● ● ● ● Модель Клиент/Сервер и RPC Механизм работы RPC Представление данных Поток данных при RPC portmap демон / rpcinfo RPCGEN – компилятор протоколов ONC и DCE RPC Основы ОС Unix 5/21/08 Слайд 2 из 34 Модель клиент/сервер и RPC ● ● ● ● ● Клиент Сервер Вызывающая процедура Вызываемая процедура {protocol, local-address, local-process, foreignaddress, foreign-process} – – – – protocol – TCP, UDP local address/process (port) – клиент foreign address/process (port) – сервер port – идентификатор процесса для коммуникации Основы ОС Unix 5/21/08 Слайд 3 из 34 Механизм работы RPC 1. Вызывающая процедура готовит все данные для RPC. (Замечание: выполнение процедуры может оказаться на другой архитектуре!) 2. Вызвыющая процедура передает данные на удаленный хост для выполнения RPC, используя сетевой адрес (маршалинг) 3. RPC принимает данные, выполняется и передает результат обратно (маршалинг/демаршалинг) 4. Вызывающая процедура получает результат RPC и продолжает выполнение. Представление данных ● ● ● ● low order / high order = little-endian/big-endian сетевое представление = big-endian ONC стандарт для представления данных (XDR) – коллекция С функций для конвертации представлений данных enum x_op: – – – XDR_ENCODE преобразовать в XDR XDR_DECODE пробразовать в локальное пред. XDR_FREE очистить память Поток данных при RPC 1) клиент кодирует данные через XDR фильтр; 2) клиент передает закодированные XDR данные по сети на удаленный хост; 3) сервер декодирует данные через XDR фильтр; 4) сервер выполняет RPC и кодирует результат через XDR фильтр; 5) сервер передает закодированный резудьтат по сети обратно клиенту; 6) клиент декодирует RPC результат через XDR фильтр и продолжает выполнение. portmap – связывание клиента и сервера для RPC ● ● ● ● portmap демон регистрирует номер порта для RPC программ; сервер RPC назначает целые идентификаторы для программ и процедур RPC для регистрации в таблице диспетчеризации, хранящей адреса XDR фильтров и адреса реальных процедур; клиент обращается к portmap для получения доступа к нужному порту и процедуре из таблицы диспетчеризации. См. rpcinfo RPCGEN – компилятор протоколов ● ● ● Утилита rpcgen автоматизирует создание XDR процедур, необходимых для конвертации параметров и результата удаленной процедуры в сетевой формат и обратно; rpcgen это компилятор для RPC языка, на котором описывается интерфейс удаленной процедуры (.x); rpcgen обрабатывая *.x файл создает 4 C-файла: – *.h общий заголовочный файл; – *_clnt.c прокси (stub) программу для клиента; – *_svc.c скелетон главной программы сервера ; – *_xdr.c XDR фильтры для параметров и результата. Пример RPC файла avg.x 1./* 2. * Процедура average принимает массив вещественных 3. * чисел и возвращает их среднее значение 4. * Этот игрушечный сервис обрабатывает максимум 5. * 200 чисел. 6. */ 7.const MAXAVGSIZE = 200; 8. 9.struct input_data { 10. double input_data<200>; 11.}; 12. 13.typedef struct input_data input_data; 14. 15.program AVERAGEPROG { 16. version AVERAGEVERS { 17. double AVERAGE(input_data) = 1; 18. } = 1; 19.} = 22855; Пример: клиент client.c ● ● #include "avg.h" реализует функцию void averageprog_1( char* host, int argc, char *argv[]) обрабатывает и печатает входные параметры вызывает функцию clnt = clnt_create(host, AVERAGEPROG, AVERAGEVERS, "udp"); – выполняет вызов RPC result_1 = average_1(&average_1_arg, clnt) – – ● реализует функцию main(argc, argv) – принимает входные параметры командной строки – вызывает averageprog_1( host, argc, argv); Пример: server.c #include <rpc/rpc.h> #include "avg.h" #include <stdio.h> static double sum_avg; double * average_1(input_data *input, CLIENT *client) { .... return(&sum_avg); } double * average_1_svc(input_data *input, struct svc_req *svc) { CLIENT *client; return(average_1(input,client)); } Работа Реализации RPC ONC RPC – Open Network Computing (Sun Microsystems) ● ● ● ● ● язык ONC RPC XDR - eXternal Data Representation int номер программы сервера portmap демон rpcgen компилятор DCE RPC – Distributed Computing Environment (OSF) ● ● ● ● ● язык IDL NDR - Network Data Representation строка UUID – Universal unique identifier uuidgen rpcd демон IDL компилятор Приложения RPC ● сервисы, например, – – ● NIS – Network Information Service NFS – Network Filesystem Service Распределенные приложения – – многопроцессорные системы кластеры Литература 1. Ed Petron. Remote Procedure Call. http://www.linuxjournal.com/article/2204 2.У.Р.Стивенс. UNIX Разработка сетевых приложений. Питер, 2003. 3.Родерик В. Смит. Сетевые средства Linux. M:Вильямс, 2003. 4.J.Blommer. Power Programming with RPC. O'Reilly Acc. 1993. Основы ОС Unix 5/21/08 Слайд 15 из 34