Version 10/17/16
Sistemas Distribuidos
Remote Procedure
Call
Contenidos
Remote Procedure Call (RPC)
Conceptos bsicos
Aspectos relacionados con las RPCs
RPC de Sun Microsystems
Biblioteca de funciones de RPC
Compilar un programa
Ejemplo de RPC
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 2
Remote Procedure Call
RPC (Remote Procedure Call): llamadas a procedimientos
remotos
Por Birrel y Nelson (1985) en Implementing Procedure
Calls
Hbrido:
Llamadas a procedimientos en local
Paso de mensajes
Las RPC constituyen el ncleo de muchos SSDD
Llegaron a su culminacin con DCE (Distributed Computing
Environment)
Mecanismo para invocar procedimientos en espacios de
direcciones diferentes (en la misma o distinta mquina).
Soporta una variedad de estilos de comunicacin diferentes
Han evolucionado hacia orientacin a objetos
Invocacin de mtodos remotos (CORBA, RMI)
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 3
Consideraciones de
diseo
Bloqueantes vs. no bloqueantes
Con almacenamiento vs. sin almacenamiento
Fiables vs. no fiables
Caractersticas
Identificadores de mensajes
Timeouts
Mensajes de peticin duplicados
Mensajes de respuesta perdidos
Historia
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 4
Remote Procedure Call
Aplicaciones/servicios
RMI and RPC
Sockets
Aplanamiento (marshalling), representacin externa de
datos
Protocolo de transporte
UDP y TCP
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 5
Remote Procedure Call
RPCs en la pila de protocolos
RPC:
En el nivel de sesin en
OSI
En el nivel de
aplicacin en TCP/IP
Independientes del
protocolo de
transporte
TCP
UDP
Fiabilidad no
garantizada
Depende del protocolo
de transporte
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 6
RPC de Sun
La versin 2 de RPC, descrita en la RFC 1057, fue
estandarizada por Sun Microsystems
Se ocupa:
Especificacin e interpretacin de mensajes
NO se ocupa:
Cmo se realiza el intercambio de mensajes entre los procesos
Restricciones de la capa de transporte utilizado
Binding entre un cliente a un servicio
La sintaxis y el formato de los mensajes se define
mediante IDL (Interface Definition Language):
Lenguaje de especificacin de RPC
Lenguaje de especificacin de datos XDR
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 7
Funcionamiento de las RPCs
El proceso que realiza la llamada empaqueta los argumentos en
un mensaje, se los enva a otro proceso y espera el resultado
El proceso que ejecuta el procedimiento extrae los argumentos
del mensaje, realiza la llamada de forma local, obtiene el
resultado y se lo enva de vuelta al proceso que realiz la llamada
Objetivo: acercar la semntica de las llamadas a procedimiento
convencional a un entorno distribuido (transparencia)
main(){ sumar(int a, int b)
... receive(4,5) int r;
send(a, b);
r = sumar (4, 5); r = a + b;
receive(r);
... send (r) return r;
} }
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 8
Llamada local
main(){ Pila del proceso
...
r = sumar (4, 5);
...
}
sumar(int a, int b)
int r;
r = a + b;
return r;
} Dir retorno
a
Registro de activacin
b
r
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 9
Llamada a procedimiento
remoto
Cliente
main(){
...
r = sumar (4, 5);
...
}
Dir retorno
a
Stub sumar(int a, int b) b
send(a, b);
c
receive(r);
return(r); servidor
}
peticion main(){
receive (4, 5)...
r = sumar (4, 5);
send (r)
respuesta }
sumar(int a, int b) Stub
int r;
r = a + b;
return r;
}
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 10
Conceptos bsicos
Una RPC tiene dos participantes:
Un cliente activo, que enva una RPC al servidor
Un servidor pasivo, que calcula un resultado y lo devuelve al
cliente
Un servicio de red es una coleccin de uno o ms programas
remotos
Un programa remoto implementa uno o ms procedimientos
remotos
Un servidor puede soportar ms de una versin de un programa
remoto
Permite al servidor ser compatible con las actualizaciones de
protocolos
Un procedimiento remoto, sus parmetros y sus resultados se
especifican en un fichero de especificacin del protocolo escrito
en el lenguaje de especificacin de RPC y XDR
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 11
Suplentes (stubs) Cliente
Stub
Servidor
Stub
Se generan automticamente por el software de RPC
Stub del cliente
Stub del sevidor
Un stub es una pieza de cdigo usada en el cliente y el servidor
Responsable de convertir los parmetros de la aplicacin
cliente/servidor durante una llamada a procedimiento remoto
Espacio de direcciones independiente del cliente y servidor
Representaciones de datos diferentes (big-endian, little-endian)
Los suplentes son independientes de la implementacin que se
haga del cliente y del servidor.
Slo dependen de la interfaz
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 12
Suplentes (stubs) Cliente
Stub
Servidor
Stub
Funciones en el cliente:
Suplantar al procedimiento a ejecutar
Localizar al servidor
Empaquetar los parmetros y construir los mensajes
Enviar el mensaje al servidor
Esperar la recepcin del mensaje y devolver los
resultados
Funciones en el servidor:
Realizan tareas similares
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 13
Protocolos RPC
Request (R)
Called procedure returns nothing
Client does not wait for completion
Client does not require execution confirmation
No timeout nor retransmissions
Request-reply (RR)
Server reply is also an ACK for the client request
A new request is an ACK for the server reply
Client retransmits request if no reply arrives before
timeout.
Request/Reply/Ack-Reply protocol (RRA)
Client sends ACK for the server reply.
But only if all previous replies are received.
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 14
Protocolo request
Mquina cliente Mquina servidora
Proceso cliente Proceso servidor
(llamador) (llamado)
Protocolo
peticin
Stub Stub
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 15
Protocolo request
RPC asncrona
El cliente no espera la respuesta
No admite parmetros de salida
Ejemplo CORBA:
Se corresponden con mtodos especificados como
oneway
cliente servidor
localizar al Se registra en un
servidor servicio de nombres
preparar
parmetros,
enviar peticin Recibir la peticin
Ejecutar el
procedimiento
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 16
Protocolo request-reply
Solicitar Mensaje de peticin
operacin Recibir peticin
Seleccionar servicio
(esperar)
Ejecutar servicio
Mensaje de respuesta
Enviar respuesta
(contina)
Cliente Servidor
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 17
Estructura de los mensajes de
peticin-respuesta
Id. De peticin
Id. De operacin
argumentos
Resultado
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 18
Protocolo request-reply
localizar al cliente servidor
servidor Se registra en un
servicio de nombres
preparar
parmetros,
enviar peticin Recibir la peticin
Ejecutar el
procedimiento
Preparar la respuesta
Desempaquetar y enviar
la respuesta
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 19
Protocolo request-reply
Proceso cliente (llamador)
Conectar al servidor
Mquina cliente Invocar una llamada a
procedimiento remoto
Proceso cliente Stub o resguardo del cliente:
(llamador)
Localizar al servidor
Empaquetar los parmetros
Stub y construir los mensajes
Enviar los mensajes al
servidor
Bloquearse hasta esperar la
respuesta
Obtener la respuesta
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 20
Protocolo request-reply
Proceso servidor
(llamado)
Registrar las RPCs Mquina servidora
Implementar los
procedimientos Proceso servidor
(llamado)
Stub o resguardo del servidor:
Recibir la peticin del cliente
Desempaquetar los parmetros Stub
Invocar el procedimiento de
manera local
Obtener la respuesta y
enviarla al cliente
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 21
Consideraciones de
diseo
Lenguaje de definicin de interfaces (IDL)
Generador de stubs
Tipos de parmetros
Transferencia de parmetros
Protocolo de comunicacin
Enlace entre el cliente y el servidor (binding)
Semntica de las RPC en presencia de fallos
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 22
Lenguaje de Definicin
de Interfaz
Un Lenguaje de Definicin de Interfaz (IDL) permite
especificar el formato de los procedimientos remotos y otras
opciones de comunicacin
Cliente
La interfaz es compartida por
Stub
Cliente Servidor
Servidor
Stub
<opciones de comunicacin:
versin interfaz, tcp/udp,
>
<interfaz remota:
suma (in int a, in int b, out int c) ;
generador
>
STUB
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 23
Lenguaje de Definicin
de Interfaz
Una interfaz especifica:
Nombre de servicio que utilizan los clientes y servidores
Nombres de procedimientos
Parmetros de los procedimientos
Entrada
Salida
Tipos de datos de los argumentos
Los compiladores pueden disearse para que los clientes y
servidores se escriban en lenguajes diferentes
Tipos de IDL
Integrado con un lenguaje de programacin (Cedar, Argus)
Lenguaje de definicin de interfaces especfico para describir las
interfaces entre los clientes y los servidores (RPC de Sun y RPC de
DCE)
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 24
Tipos de parmetros
Parmetro de entrada (in)
El parmetro se enva del cliente al servidor
Parmetro de salida (out)
El parmetro se enva del servidor al cliente
Parmetro de entrada/salida (inout)
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 25
Transferencia de
paametros
Una de las funciones de los suplentes es empaquetar
los parmetros en un mensaje: aplanamiento
(marshalling)
Problemas en la representacin de los datos:
Servidor y cliente pueden ejecutar en mquinas con
arquitecturas distintas (ordenamiento de bytes)
Problemas con los punteros
Una direccin slo tiene sentido en un espacio de direcciones
Ejemplos de esquemas de representacin de datos:
XDR (eXternal Data Representation) es un estndar que
define la representacin de tipos de datos (RFC 1832)
Representacin comn de datos de CORBA (CDR)
Serializacin de objetos de Java
XML (eXtensible Markup Language ) es un metalenguaje
basado en etiquetas definida por W3C
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 26
Ejemplo de
representacin de datos
Mensaje: Smith, London, 1934
XDR CDR
indexin notes
sequenceofbytes 4bytes
03 5 lengthofstring
47 "Smit" Smith
811 "h___"
1215 6 lengthofstring
1619 "Lond" London
2023 "on__"
2427 1934 unsignedlong
XML
<person>
<name>Smith</name>
<place>London</place>
<year>1934</year>
</person >
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 27
Protocolo
Entre cliente y servidor debe establecerse un
protocolo:
Formato de los mensajes
Formato de representacin
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 28
Enlace (binding)
Enlace: asociacin entre el cliente y el servidor
Implica localizar al servidor que ofrece un determinado
servicio
El servidor debe registrar su direccin en un servicio
de nombres (binder)
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 29
Enlazador dinmico
Enlazador dinmico (binder): es el servicio que
mantiene una tabla de traducciones entre nombres de
servicio y direcciones.
Incluye funciones para:
Registrar un nombre de servicio
Eliminar un nombre de servicio
Buscar la direccin correspondiente a un nombre de servicio
Cmo localizar al enlazador dinmico:
1. Ejecuta en una direccin fija de un computador fijo
2. El sistema operativo se encarga de indicar su direccin
3. Difundiendo un mensaje (broadcast) cuando los procesos
comienzan su ejecucin.
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 30
Esquema de registro y
enlace
5
1
cliente 6 servidor
4 2
7
1 Obtiene direccin 3
2 Registra direccin
3 Busca servidor
binder
4 Devuelve direccin
5 Peticin
6 Respuesta
7 Borra direccin (fin del servicio)
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 31
Tipos de enlace
Enlace no persistente: el binding entre el cliente
y el servidor se establece en cada RPC
Ms tolerante a fallos
Permite migracin de servicios
Enlace persistente: el binding se mantiene
despus de la primera RPC
til en aplicaciones con muchas RPC repetidas
Problemas si lo servidores cambian de lugar
Modelos hbridos
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 32
Fallos que pueden
aparecer en las RPCs
El cliente no es capaz de localizar al servidor
Prdidas de mensajes
Se pierde el mensaje de peticin del cliente al
servidor
Se pierde el mensaje de respuesta del servidor al
cliente
El servidor falla despus de recibir una peticin
El cliente falla despus de enviar una peticin
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 33
Cliente no puede
localizar al servidor
Posibles causas:
El servidor puede estar cado
El cliente puede estar usando una versin antigua del
servidor
La versin ayuda a detectar accesos a copias obsoletas
Cmo indicar el error al cliente
Devolviendo un cdigo de error (-1)
No es transparente
Ejemplo: sumar(a,b)
Elevando una excepcin
Necesita un lenguaje que tenga excepciones
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 34
Prdida de mensajes del
cliente
Es la ms fcil de tratar
Se activa una alarma (timeout) despus de enviar
el mensaje
Si pasado el timeout no se recibe una respuesta
se retransmite el mensaje
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 35
Prdida del mensaje de
respuesta
Ms difcil de tratar
Se pueden emplear alarmas y retransmisiones, pero:
Se perdi la peticin?
Se perdi la respuesta?
El servidor va lento?
Algunas operaciones pueden repetirse y devolvern el mismo
resultado (operaciones idempotentes)
Una transferencia bancaria no es idempotente
La suma de dos nmeros es idempotente
La solucin con operaciones no idempotentes es descartar
peticiones ya ejecutadas
Un nmero de secuencia en el cliente
Un campo en el mensaje que indique si es una peticin
original o una retransmisin
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 36
Fallos en los servidores
El servidor no ha llegado a ejecutar la operacin
Se podra retransmitir
El servidor ha llegado a ejecutar la operacin
El cliente no puede distinguir los dos
Qu hacer?
No garantizar nada
Semntica al menos una vez
Reintentar y garantizar que la RPC se realiza al menos una vez
No vale para operaciones no idempotentes
Semntica a lo ms una vez
No reintentar, puede que no se realice ni una sola vez
Semntica de exactamente una
Sera lo deseable
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 37
Invocation Semantics
maybe: not ACK, not dup filter
Remote procedure may run one or zero
Client may get reply or not
at-least-once: ACK, no dup filter
Remote procedure run one or more
Client may get one or more replies
at-most-one: ACK, dup filter + reply retransmission
Remote procedure run one or zero
Client get a reply or an error
exactly-one
Not possible
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 38
Fallos en los clientes
La computacin est activa pero ningn cliente
espera los resultados (computacin hurfana)
Gasto de ciclos de CPU
Si el cliente rearranca y ejecuta de nuevo la RPC se
pueden crear confusiones
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 39
Estrategias ante fallos
Cliente RPC:
Cuando no se recibe la respuesta
Reenviar la peticin
Incluir identificador de peticin (nmero de secuencia)
Servidor RPC:
Para hacer frente a peticiones duplicadas
Filtrar las peticiones (nmeros de secuencia, etc.)
Si se necesita reenviar una respuesta de una peticin
no idempotente:
Guardar un histrico de las peticiones anteriormente
ejecutadas y su respuesta para no ejecutar de nuevo la
peticin.
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 40
Aspectos de
implementacin
Protocolos RPC
Orientados a conexin
Fiabilidad se resuelve a bajo nivel
Peor rendimiento
No orientados a conexin
Uso de un protocolo estndar o uno especfico
Algunos utilizan TCP o UDP como protocolos bsicos
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 41
Programacin con RPCs
El programador debe proporcionar:
La definicin de la interfaz (IDL)
Nombres de los procedimientos
Parmetros que el cliente pasa al servidor
Resultados que devuelve el servidor al cliente
El cdigo del cliente
El cdigo del servidor
El compilador de IDL genera :
El resguardo (stub) del cliente
El resguardo (stub) del servidor
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 42
Programacin con RPCs
FICHERO
DESARROLLO DE DEFINICIN
DE LA DE INTERFAZ
INTERFAZ
COMPILADOR IDL
SUPLENTE CABECERA SUPLENTE
EN CLIENTE EN SERVIDOR
FICHEROS CABECERA CABECERA
FICHEROS
FUENTE DEL FUENTE DEL
COMPILADOR C CLIENTE SERVIDOR COMPILADOR C
COMPILADOR C COMPILADOR C
OBJETO FICHEROS FICHEROS OBJETO
SUPLENTE OBJETO DEL BIBLIOT. BIBLIOT. OBJETO DEL SUPLENTE
EN CLIENTE CLIENTE RPC RPC SERVIDOR EN SERVIDOR
MONTADOR MONTADOR
EJECUTABLE EJECUTABLE
DESARROLLO DEL DESARROLLO
DEL
DEL CLIENTE SERVIDOR
CLIENTE SERVIDOR
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 43
RPCs de Sun
Microsystems
Diseado para el sistema de ficheros NFS
Descrito en RFC 1831
Tambin se denomina ONC-RPC (Open network computing)
Se puede elegir UDP o TCP
Cliente y servidor deben estar de acuerdo en el protocolo de
transporte a utilizar
Utiliza la semntica al menos una vez
Utiliza un lenguaje de definicin de interfaces denominado XDR
Soporte:
Para C a travs del compilador rpcgen en UNIX/Linux
Para Java
[Link]
Para plataformas Windows
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 44
RPCs de Sun en el
modelo OSI
7. Aplicacin aplicacin
aplicacin
6. Presentacin XDR
XDR
5. Sesin RPC
RPC
4. Transporte
TCP
TCP UDP
UDP
3. Red IP
IP
1-2 Enlace de datos Interfaz
InterfazHW
HW
Y fsico
RED
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 45
Lenguaje XDR
XDR (eXternal Data Representation) es un estndar que define la
representacin de tipos de datos (RFC 1832)
Utilizado inicialmente para representaciones externas de datos
Se extendi a lenguajes de definicin de interfaces
Una interfaz contiene:
Un nmero de programa
Un nmero de versin del programa
Un conjunto de procedimientos remotos:
Un nombre y un nmero de procedimiento
Los procedimientos slo aceptan un parmetro de entrada (se encapsulan en
una estructura)
Los parmetros de salida se devuelven mediante un nico resultado
El lenguaje ofrece una notacin para definir:
constantes
definicin de tipos
estructuras, uniones
programas
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 46
Formato de definicin de
interfaz
program-def:
"program" identifier "{"
version-def
version-def *
"}" "=" constant "; /* Number of program */
version-def:
"version" identifier "{"
procedure-def
procedure-def *
"}" "=" constant ";" /* Number of version */
procedure-def:
type-specifier identifier "(" type-specifier
("," type-specifier )* ")"
"=" constant "; /* Number of procedure */
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 47
Ejemplo: programa ping
/* Simple ping program */
program PING_PROG {
/* Latest and greatest version */
version PING_VERS_PINGBACK {
void
PINGPROC_NULL(void) = 0;
/*
* Ping the caller, return the round-trip time (in microseconds).
Returns -1 if the operation timed out.
*/
int
PINGPROC_PINGBACK(void) = 1;
} = 2;
/* Original version */
version PING_VERS_ORIG {
void
PINGPROC_NULL(void) = 0;
} = 1;
} = 1;
const PING_VERS = 2; /* latest version */
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 48
Identificacin de
llamadas a RPC
Un mensaje de llamada de RPC se identifica
unvocamente mediante tres campos enteros sin
signo:
(NUM-PROG, NUM-VERSION, NUM-PROCEDURE)
NUM-PROG es el nmero de programa remoto,
NUM-VERSION es el nmero de versin de programa,
NUM-PROCEDURE es el nmero de procedimiento remoto
Detalles de implementacin:
NUM-PROG se definen en la RFC 1831
[Link]
La primera implementacin (versin) de un protocolo deber ser la 1
Los nmeros de procedimientos se especifican por el programador
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 49
El proceso portmapper
El enlace en las RPC de sun se realiza mediante un proceso denominado
portmapper
En cada servidor ejecuta un proceso portmapper en un puerto bien
conocido (111)
El portmapper almacena por cada servicio local:
El nmero de programa
El nmero de versin
El nmero de puerto
Enlace dinmico:
El nmero de puertos disponibles es limitado y el nmero de programas
remotos potenciales puede ser muy grande
Slo el portmapper ejecutar en un puerto determinado (111) y los nmeros
de puertos donde escuchan los servidores se averiguan preguntando al
portmapper
Soporta TCP y UDP (ver /etc/services)
sunrpc 111/tcp portmapper #RPC4.0portmapper
sunrpc 111/udp portmapper
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 50
El proceso portmapper
Protocolo:
Cuando un servidor arranca registra en el portmapper la
informacin anterior
Cuando un cliente necesita invocar un procedimiento remoto
enva al portmapper del host remoto (necesita conocer la
direccin IP del servidor)
El nmero de programa y el nmero de versin
El portmapper devuelve el puerto del servidor
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 51
El proceso portmapper
./servidor &
rpcinfo p [Link]
programa vers proto puerto
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 32772 status
100024 1 tcp 59338 status
99 1 udp 46936
99 1 tcp 40427
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 52
Biblioteca de funciones
de RPC
La biblioteca de funciones de RPC
Sistemas Unix
Servicios de RPC para construir aplicaciones
En el cliente
Crear un manejador de cliente
Destruir un manejador de cliente
En el servidor
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 53
Biblioteca de funciones
de RPC
rpc.h es una biblioteca de funciones para
desarrollar aplicaciones distribuidas que usan
RPC:
#include <rpc/rpc.h>
Mltiples niveles de acceso:
Interfaz simplificado
Rutinas de nivel intermedio
Rutinas de alto nivel
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 54
Servicios de RPC
Crear un manejador para el cliente
CLIENT *
clnt_create (const char *host, const u_long prognum, const
u_long versnum, const char *nettype)
Argumentos:
host nombre del host remoto donde se localiza el programa
remoto
prognum Nmero de programa del programa remoto
versnumNmero de versin del programa remoto
nettype Protocolo de transporte:
NETPATH, VISIBLE, CIRCUIT_V, DATAGRAM_V, CIRCUIT_N,
DATAGRAM_N, TCP, UDP
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 55
Servicios de RPC
Destruir el manejador del cliente
void clnt_destroy (CLIENT *clnt)
Argumentos:
clnt Manejador de RPC del cliente
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 56
Servicios de RPC
Indicar el error en un fallo de RPC:
void clnt_perror (CLIENT *clnt, char *s)
void clnt_pcreateerror (CLIENT *clnt, char *s)
Argumentos:
clnt Manejador de RPC del cliente
s Mensaje de error
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 57
Ejemplo: crear/destruir
un manejador
#include <stdio.h>
#include <rpc/rpc.h>
#define RMTPROGNUM (u_long)0x3fffffffL /* Define remote program number and version */
#define RMTPROGVER (u_long)0x1
main()
{
CLIENT *client; /* client handle */
/* Crear el manejador del cliente */
client = clnt_create([Link], RMTPROGNUM, RMTPROGVER, TCP);
if (client == NULL){
clnt_pcreateerror(client, Could not create client\n);
exit(1);
}
// Invocar procedimiento remoto
/* Destruir el manejador del cliente */
clnt_destroy(client);
exit(0);
}
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 58
Invocar un procedimiento
Un procedimiento remoto se invoca:
tipo_resultado procedimiento_v (tipo_arg1 arg1,
tipo_arg2 arg2,
tipo_argn argn,
CLIENT *clnt)
donde:
procedimiento_vNombre del procedimiento a invocar
arg1,arg2,,argn Argumentos del procedimiento
clnt Manejador de un cliente de RPC
NOTA: v se sustituye por el nmero de versin que se invoca
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 59
Implementar un
procedimiento (servidor)
Para cada procedimiento remoto, el servidor ofrece
una implementacin de procedimiento respetando su
prototipo:
tipo_resultado
procedimiento_v_svc (tipo_arg1 arg1,
tipo_arg2 arg2,
tipo_argn argn,
struct svc_req *rqstp)
donde:
procedimiento_v_svc
Nombre del procedimiento a
implementar
arg1,arg2,,argn Argumentos del procedimiento
rqstp Estructura que contiene informacin de
la peticin
NOTA: v se sustituye por el nmero de versin que se implementa
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 60
Compilador de interfaces
rpcgen es el compilador de interfaces que genera
cdigo C para:
Stub del cliente
Stub del servidor y procedimiento principal del
servidor
Procedimientos para el empaquetado y
desempaquetado XDR
Fichero de cabecera (.h) con los tipos y declaracin de
prototipos de procedimientos
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 61
rpcgen
Compilar usando rpcgen
rpcgen infile
rpcgen [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
rpcgen [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
rpcgen [-s nettype]* [-o outfile] [infile]
rpcgen [-n netid]* [-o outfile] [infile]
infile fichero en lenguaje de definicin de interfaz de
RPC (XDR en RPC de SUN)
Algunas opciones:
-N Permite a los procedimientos tener mltiples argumentos
-a Genera todos los ficheros incluyendo cdigo de ejemplo para
cliente y servidor
-M Genera stubs multi-thread para paso de argumentos
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 62
Ejemplo: sumar dos
nmeros
Mquina A Mquina B
sumar(5,2)
cliente servidor
5+2
NCLEO Resultado = 7 NCLEO
RED
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 63
Esquema de la aplicacin
cliente.c
Archivos para
el cliente
suma_clnt.c
suma_xdr.c
rpcgen Archivos
suma.x
comunes
suma.h
suma_svc.c
Ficheros generados por el programador
Archivos para
Ficheros generados mediante rpcgen suma.x
el servidor
servidor.c
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 64
Esquema de la aplicacin
cliente.c
Archivos para
el cliente
suma_clnt.c
suma_xdr.c
rpcgen Archivos
suma.x
comunes
suma.h
suma_svc.c
Ficheros generados por el programador
Archivos para
Ficheros generados mediante rpcgen suma.x
el servidor
servidor.c
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 65
suma.x
struct argumentos {
int a;
int b;
};
program SUMAR {
version SUMAVER {
int SUMA(argumentos) = 1;
int RESTA(argumentos) = 2;
} = 1;
} = 99;
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 66
suma.h
#ifndef _SUMA_H_RPCGEN
#define _SUMA_H_RPCGEN
#include <rpc/rpc.h>
struct argumentos {
int a;
int b;
};
#define SUMAVER ((u_long)99)
#define SUMA ((u_long)1)
#define RESTA ((u_long)2)
extern int * suma_1(argumentos *, CLIENT *);
extern int * suma_1_svc(argumentos *, struct svc_req *);
...
#endif /* !_SUMA_H_RPCGEN */
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 67
servidor.c
#include "suma.h"
int *suma_1_svc(argumentos *argp, struct svc_req *rqstp)
{
// TODO: implementacin del procedimiento suma_1_svc
static int result;
result = argp->a + argp->b;
return(&result);
}
int *resta_1_svc(argumentos *argp, struct svc_req *rqstp)
{
// TODO: implementacin del procedimiento resta_1_svc
static int result;
result = argp->a - argp->b;
return(&result);
}
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 68
cliente.c
#include "suma.h"
#include <rpc/rpc.h>
main( int argc, char* argv[] )
{
CLIENT *clnt;
int *res;
argumentos suma_1_arg;
char *host;
if(argc < 2) {
printf("usage: %s server_host\n", argv[0]);
exit(1);
}
host = argv[1];
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 69
cliente.c
/* Paso 1: localizar al servidor */
clnt = clnt_create(host, SUMAR, SUMAVER, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host); Binding:
exit(1); Se contacta con el portmapper de host
} Se indica el host:API:versin:protocolo
El portmapper indica la localizacin
suma_1_arg.a = 5; (puerto)
suma_1_arg.b = 2;
/* Paso 2: Invocar el procedimiento remoto */
res = suma_1(&suma_1_arg, clnt);
if (res == NULL) {
clnt_perror(clnt, "call failed:");
}
printf("La suma es %d\n", *res);
/* Destruir el manejador */
clnt_destroy( clnt );
}
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 70
suma_xdr.c
#include "suma.h"
bool_t
xdr_argumentos (XDR *xdrs, argumentos *objp)
{
register int32_t *buf;
if (!xdr_int (xdrs, &objp->a))
return FALSE;
if (!xdr_int (xdrs, &objp->b))
return FALSE;
return TRUE;
}
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 71
suma_clnt.c Cliente
(stub del cliente) Stub
Servidor
Stub
#include <memory.h> /* for memset */
#include "suma.h"
/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = { 25, 0 };
int * suma_1(argumentos *argp, CLIENT *clnt)
{
static int clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
if (clnt_call (clnt, suma,
(xdrproc_t) xdr_argumentos, (caddr_t) argp,
(xdrproc_t) xdr_int, (caddr_t) &clnt_res,TIMEOUT) != RPC_SUCCESS)
{
return (NULL);
}
return (&clnt_res);
}
int * resta_1(argumentos *argp, CLIENT *clnt)...
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 72
suma_svc.c Cliente
(stub del servidor) Stub
Servidor
Stub
int main (int argc, char **argv)
{
register SVCXPRT *transp;
pmap_unset (SUMAR, SUMAVER);
transp = svcudp_create(RPC_ANYSOCK);
svc_register(transp, SUMAR, SUMAVER, sumar_1, IPPROTO_UDP;
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
svc_register(transp, SUMAR, SUMAVER, sumar_1, IPPROTO_TCP;
svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 73
suma_svc.c Cliente
(stub del servidor) Stub
Servidor
Stub
static void sumar_1(struct svc_req *rqstp, register SVCXPRT *transp)
{
union {
argumentos suma_1_arg;
argumentos resta_1_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
case suma:
_xdr_argument = (xdrproc_t) xdr_argumentos;
_xdr_result = (xdrproc_t) xdr_int;
local = (char *(*)(char *, struct svc_req *)) suma_1_svc;
break;
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 74
suma_svc.c Cliente
(stub del servidor) Stub
Servidor
Stub
case resta:
_xdr_argument = (xdrproc_t) xdr_argumentos;
_xdr_result = (xdrproc_t) xdr_int;
local = (char *(*)(char *, struct svc_req *)) resta_1_svc;
break;
default:
svcerr_noproc (transp); return;
}
memset ((char *)&argument, 0, sizeof (argument));
svc_getargs (transp, _xdr_argument, (caddr_t) &argument);
result = (*local)((char *)&argument, rqstp);
if (result != NULL &&
!svc_sendreply(transp, _xdr_result, result)){
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
exit (1);
}
return;
}
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 75
Compilar la interfaz
rpcgen a N M suma.x
Opciones:
-a: genera todos los ficheros incluyendo ejemplos
-N: permite varios argumentos
-M: genera cdigo multithread (cdigo que puede ser
utilizado en aplicaciones con varios threads)
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 76
Compilar
gcc c suma_xdr.c
gcc c suma_svc.c
gcc c suma_clnt.c
gcc c cliente.c
gcc c servidor.c
gcc suma_xdr.o suma_clnt.o cliente.o o cliente
gcc suma_xdr.o suma_svc.o servidor.o o servidor
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 77
Evolucin de las RPCs
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 78
Rendimiento: sockets vs.
RPCs
Rendimiento de sockets y RPC. Incluye todo el
tiempo. Enlace, conexin en sockets, etc.
Sockets RPC
Udp Tcp Udp Tcp
Local 2.2 ms 2.74ms 4,61 ms 5,43 ms
Remoto 6.8 ms 7.35 ms 8.21 ms 8.77 ms
Sistemas Distribuidos - Llamadas a Procedimiento Remoto 79
References
G. Coulouris, Distributed Systems: Concepts
and Design, Addison Wesley 2011, Fifth edition
Section 5.3 Remote Procedure Call
[Link], B.J. NELSON, Implementing Remote
Procedure Calls, Xerox PARC
Ejemplo:
1. [Link]
RPC:
[Link]://[Link]/~schmidt/PDF/[Link]
XDR data types and formats
1. [Link]
Sistemas Distribuidos - Llamadas 80