This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
RPC: Remote Procedure Call
petición
El Llamado de procedimientos remotos
respuesta
Dr. Roberto Gómez C. Diapo. No. 1
Principios teóricos y programación en Unix
RPC: Remote Procedure Call
cliente servidor(leer FA45 de arch1)
Cliente/Servidor: envío/recepción mensajes
cliente servidor(34759037F3247A)
cliente servidor(ack)
Dr. Roberto Gómez C. Diapo. No. 2
cliente servidor(ack)
cliente servidor
2
RPC: Remote Procedure Call
Desventajas paradigma envio/recepción mensajes
• Paradigma envio/recepción es del tipo Entrada/Salida– procedimientos send(), receive() están dedicados a realizar
E/S• E/S no es un concepto clave para los sistemas
centralizados; pero si para la computación o cálculo distribuido
Dr. Roberto Gómez C. Diapo. No. 3
• Objetivo: hacer el cálculo distribuido como si fuera cálculo centralizado
• Cálculo centralizado: llamadas de procedimientos y/o funciones
RPC: Remote Procedure Call
Ejecución de una llamada de procedimiento local
main(){
:count = read(fd, bytes, buf)
:
main(){
:count = read(fd, bytes, buf)
:
main(){
:count = read(fd, bytes, buf)
:
Variables localesal main
Variables localesal main
Variables localesal main
bytesbuffd
dirección regreso
SP SP
SP
:}
:} }
Dr. Roberto Gómez C. Diapo. No. 4
a) Stack antes llamada read b) Stack durante ejecución read c) Stack después llamada read
3
RPC: Remote Procedure Call
Tipos de paso de parámetros
• Por valor– en el stack se copia el valor del parámetroen el stack se copia el valor del parámetro– valor de salida es igual al valor de entrada
• Por referencia– en el stack se almacena la dirección de la variable– es posible modificar el valor del parámetro
• call-by-copy/restorese copia el valor de la variable en el stack (como en paso por valor)
Dr. Roberto Gómez C. Diapo. No. 5
– se copia el valor de la variable en el stack, (como en paso por valor)– al final de la ejecución local se copia el valor que tiene la variable dentro
del procedimiento, en el stack– el procedimiento que mandó llamar al procedimiento copia el valor final– en condiciones normales tiene el mismo efecto que el paso por referencia
RPC: Remote Procedure Call
El RPC
• Creado por Birrel & Nelson en 1984• Permiten a los programas llamar procedimientos localizados en• Permiten a los programas llamar procedimientos localizados en
otras máquinas• Un proceso x en una máquina A, puede llamar un procedimiento
localizado en una máquina B• Información puede llevarse del proceso invocador al invocado
dentro de los parámetros
Dr. Roberto Gómez C. Diapo. No. 6
• Ningún mensaje u operación de E/S es visible para el programador• Problemas a resolver:
– procedimientos invocador e invocado se ejecutan en diferentes máquinas, i.e. diferentes direcciones y posiblemente diferentes arquitecturas
– ambas máquinas pueden fallar
4
RPC: Remote Procedure Call
Máquina Cliente Máquina Servidorstub delcliente
stub delservidor
Principio funcionamiento del RPC
cliente
call
return
Packparámetros
Unpackresultado
Unpackparámetros
Packresultado
servidor
call
return
Dr. Roberto Gómez C. Diapo. No. 7
kernel kernel
Mensaje transportado en la red
RPC: Remote Procedure Call
Proveniencia de los stubs
• Varios sistemas: generados automáticamente• Varios sistemas: generados automáticamente– rpcgen de Sun– generacion archivos esqueleto, para cliente y servidor, a
partir de un compilador y de la especificación del servicio
• Rutinas de especificación de stubs
Dr. Roberto Gómez C. Diapo. No. 8
– rutinas de alto y bajo nivel– posibilidad de definir más aspectos
• timeouts• protocolos
5
RPC: Remote Procedure Call
Máquina Cliente Máquina Servidorstubs
El paso de parámetros
sum sum47
47
mensaje mensaje sum(i,j)int i,j;{
return(i+j);}
::
n=sum(4,7);::
Dr. Roberto Gómez C. Diapo. No. 9
kernel kernel
RPC: Remote Procedure Call
• Tipos de paso de parámetros– por valor
Aspectos a considerar en el paso de parámetros
por valor– por referencia– call-by-copy/restore
• Problemas a resolver– diferencias entre representación de datos– diferencias en formatos– paso de apuntadores, (estructuras complejas)
Dr. Roberto Gómez C. Diapo. No. 10
paso de apuntadores, (estructuras complejas)
• Optimización– especificación parámetros de entrada y salida– registros para paso de apuntadores
6
RPC: Remote Procedure Call
#include <header.h>specification of file server, version 3.1
Binding dinámico: especificación formal servidor
specification of file_server, version 3.1long read(in char name[MAX_PATH], out char buf[BUF_SIZE],
in long bytes, in long position);
long write(in char name[MAX_PATH], in char buf[BUF_SIZE],in long bytes, in long position);
int create(in char[MAX_PATH], in int mode);
Dr. Roberto Gómez C. Diapo. No. 11
int delete(in char[MAX_PATH]);end.
RPC: Remote Procedure Call
Binder
Registro del servidor
SERVIDORBinder
Sistema DistribuidoNombreNum. versiónId único
Dr. Roberto Gómez C. Diapo. No. 12
Id.únicoManejador, (handler)
Otros (autentificación)
7
RPC: Remote Procedure Call
servicio NOdisponible
error3
Petición cliente
procesosolicitante
stub
Binder
serviciodisponible
disponible
1
2 3’
Dr. Roberto Gómez C. Diapo. No. 13
stubcliente
disponible
Nombre, Num. versión,Id.único, Manejador
RPC: Remote Procedure Call
Parámetros entrada/salida de la interfaz binder
Acción Parámetros Entrada Salida
Registrar Nombre, versión, manejador, id único
Suprimir Nombre, versión, id único
Buscar Nombre versión Manejador id único
Dr. Roberto Gómez C. Diapo. No. 14
Buscar Nombre, versión Manejador, id único
8
RPC: Remote Procedure Call
Paso 1: ‘Este es PRIMEPROG Version 1,Estoy usando el puerto 1061’’ Puerto
111
Registro y localización de un servidor RPC
Prog Vers PuertoPaso 2: ‘Dondeesta PRIMEPROGVersion 1?’
Puerto1061
Servidor Portmapper
Dr. Roberto Gómez C. Diapo. No. 15
Paso 4: ‘Llamaprocedimiento 1.Aquí están losdatos
Paso 3: ‘Esta en el puerto 1061’
Cliente
RPC: Remote Procedure Call
Binding y nombramiento servicios
Convención para números de programa de Sun
00000000 - 1FFFFFFF definido por y administrado por Sun20000000 3 d fi id l i20000000 - 3FFFFFFF definido por el usuario40000000 - 5FFFFFFF de tránsito, (aplicaciones con generación de
números)60000000 - FFFFFFFF reservado para un futuro uso
El comando rpcinfo
Realiza una llamada RPC a un servidor RPC y reporta lo que encuentra
Dr. Roberto Gómez C. Diapo. No. 16
Realiza una llamada RPC a un servidor RPC y reporta lo que encuentra.Dependiendo de los parámetros es posible:
- listar todos los servicios de un RPC en un host- listar todos los servicios RPC registrados con rpcbind versión 2- realizar una llamada RPC al procedimiento 0 de un determinado programay de una determinada versión en un host dado.
Algunas opciones-T especifica el transporte sobre el cual el servicio es requerido-a utiliza el parámetro como la dirección universal en el transporteb realiza un broadcast al procedimiento 0 de los prognum y versnum
Dr. Roberto Gómez C. Diapo. No. 17
-b realiza un broadcast al procedimiento 0 de los prognum y versnumespecificados y reporta todos los hosts que respondieron
-d borra el regsitro correpondiente al prognum y versnum especificados-l despliega una lista de entradas que contienen un prognum y un versnum
en el host especificado-s despliega una lista consisa de todos los programas RPC registrados en
host. Si no se especifica ningún host tomo el host local
1. El procedimiento del cliente llama al client-stub normalmente.2. El client-stub construye un mensaje y lo pasa al kernel.3. El kernel envía el mensaje al kernel remoto.4. El kernel remoto pasa el mensaje al server-stub.5. El server-stub desempaca los parámetros y llama al servidor.6. El servidor realiza el trabajo y regresa el resultado al stub.7. El server-stub lo empaqueta en un mensaje y lo pasa al kernel.
Dr. Roberto Gómez C. Diapo. No. 21
8. El kernel remoto envía un mensaje al cliente.9. El kernel del cliente le da el mensaje al client-stub.10. El stub desempaca el resultado y lo regresa al cliente.
-Arreglos tamaño fijoint alumnos[10]; int alumnos[10];
RPC: Remote Procedure Call
-Arreglos tamaño variableint a <12> /* a los mas 12 elementos*/
struct {u_int a_len;int *a_val;
} a;
RPCL Equivalente en C
} a;int b<> /* cualquier numero de elementos */
struct {u_int b_len;int *b_val;
} b;Tamaño máximo = parámetro maxsize en xdr_array()No especificación máximo => máximo valor puede tomar u_int;Solo es posible trabajar con arreglos unidimensionales
Dr. Roberto Gómez C. Diapo. No. 26
-Estructurasstruct punto { struct punto {
int x; int x;int y; int y;
}; };typedef struct punto punto;
14
RPC: Remote Procedure Call
-StringsNo existen en C, RPCL convención de terminación en NULLTamaño especifica máximo número caracteres permitidos en stringNo especificado => tamaño máximo = máximo valor u_int;
string nombre <32> char *nombre;string nombresote<> char *nombresote;
-UnionesMás cercanas al registro variante de Pascalunion resultado switch (int errno){ struct resultado {
case 0: int errno;opaque data[1024]; union {
1 h d t [1024]
Dr. Roberto Gómez C. Diapo. No. 27
case 1: char data[1024]int valor; int valor;
default: } resultado_u;void };
}; typedef struct resultado resultado;
RPC: Remote Procedure Call
-Datos opacosUsados para describir datos que no tienen tipoDato puede ser de tamaño fijo o variable
-Typedef RPCLMisma sintaxis que en CEjemplo define un fname_type usado para declarar strings de nombres de archivos que tienen una longitud máxima de 255 caracteres
- IdentificadoresCompuestos de letras, números y el underscoreDistinción entre mayusculas y minusculas
15
RPC: Remote Procedure Call
- Diseñar programa usando llamadas locales.
Pasos para convertir llamadas locales en remotas
p g- Restructurar cada función de tal forma que sólo tenga un parámetro pasado por valor y asegurarse que trabaja bien localmente.- Crear un archivo de especificación con extensión .x.- Ejecutar rpcgen con opciones -a y -C para generar archivos necesarios.- Usar el makefile generado para compilar los archivos. Es posible detectar errores en las definiciones de tipos en el archivo de especificación.- Insertar programa que va a llamar a la función en el archivo _client.c generado por rpcgen.
Dr. Roberto Gómez C. Diapo. No. 29
- Insertar código función local en el archivo _server.c generado por rpcgen.- Intentar compilar los programas usando el makefile generado.- Jugar, (fiddle), con el _server.c y el _client.c hasta que trabajen. Este juego puede no ser necesario si solo se utilizan tipos simples de datos.
int a;int a;int per;double sup;if (argc !=2 ) {fprintf(stderr,"Error, uso: %s a \n",argv[0]);exit(1);
}a = atoi(argv[1]);
Dr. Roberto Gómez C. Diapo. No. 34
per = perimetro(a);sup = area(a);
printf("El perimetro del cuadrado es %d \n",per); printf("El area del cuadrado es %d \n",sup);
}
18
RPC: Remote Procedure Call
El archivo de encabezado cuad.h
int perimetro(int);double area(int);
Dr. Roberto Gómez C. Diapo. No. 35
RPC: Remote Procedure Call
Compilando y ejecutando
rogomez@cuba:93>gcc cliente.c servidor.c -o cuadrorogomez@cuba:94>cuadro 5El perimetro del cuadrado es 20El area del cuadrado es 25rogomez@cuba:95>cuadro 2El perimetro del cuadrado es 8El area del cuadrado es 4
-Dnombre[=valor] Define un símbolo (igual que #define)-I Genera un código para soporte de inted en el servidor (SunOS 4.1)-K segundos Servidor existe después de segundos de inactividad-L Los errores del servidor serán impresos en el syslog-T Genera código para soportar tablas de atención de RPC-s transporte Genera el código del servidor que soporta el transporte-o archivo-salida Nombre del archivo de salida-c Sólo genera rutinas XDR-h Sólo genera el archivo de encabezado-l Sólo genera los stubs del cliente-m Sólo genera los stubs del servidor-t Genera la tabla de atención de RPC-a Genera todos los archivos b Modo backward de compatibilidad (genera código para SunOS4 1)
Dr. Roberto Gómez C. Diapo. No. 41
-b Modo backward de compatibilidad (genera código para SunOS4.1)-C Genera lenguaje C de ANSI-i tamaño Tamaño a partir del cual se empieza a generar código in-line-N Soporta varios argumentos y llamado por valor-Sc Genera esqueleto cliente que usa procedimientos remotos-Ss Genera esqueleto servidor que define los procedimientos remotos-Y path Nombre del directorio para encontrar pre-procesadores de C (cpp)
RPC: Remote Procedure Call
Archivos generados por rpcgen
Comando a ejecutar:
$ rpcgen -C -a cuadro.x
Archivos generados:
makefile.cuadromakefile para compilar el código del cliente y del servidor.
cuadro_clnt.ccontiene el stub del cliente el cual usualmente no es modificado
Dr. Roberto Gómez C. Diapo. No. 42
contiene el stub del cliente, el cual usualmente no es modificado.cuadro_svc.c
contiene stub servidorcuadro.h
contiene todos los tipos XDR generados a partir de la espcecificación.
22
RPC: Remote Procedure Call
Archivos generados por rpcgen
cuadro client ccuadro_client.cprograma esqueleto del cliente con llamadas dummy al servicio remoto.Inserta código para asignar los valores de los argumentos para el servicioremoto.
cuadro_server.ccontiene stubs para servicios remotos. Inserta código para la versión localdentro de los stubs.
Dr. Roberto Gómez C. Diapo. No. 43
cuadro_xdr.ccontiene filtros XDR necesarios para los stubs del cliente y servidor.
RPC: Remote Procedure Call
Archivos generados por rpcgen del archivo cuadro.x
cuadro server.c
cuadro.x rpcgen
_
cuadro_svc.c
cuadro_xdr.c
cuadro.h
fi
archivos servidor
archivos comunes
Dr. Roberto Gómez C. Diapo. No. 44
makefile.cuadro
cuadro_clnt.c
cuadro_client.carchivos cliente
23
RPC: Remote Procedure Call
Paso III
Insertar código enarchivos generados
Dr. Roberto Gómez C. Diapo. No. 45
gpor rpcgen
RPC: Remote Procedure Call
Programa cuadro_client.c generado por rpcgen
/** This is sample code generated by rpcgen.* These are only templates and you can use them* id li f d l i f ti* as a guideline for developing your own functions.*/
#if defined(__STDC__) || defined(__cplusplus)#define PERIMETRO 1extern int * perimetro_1(int *, CLIENT *);extern int * perimetro_1_svc(int *, struct svc_req *);#d fi AREA 2#define AREA 2extern double * area_1(int *, CLIENT *);extern double * area_1_svc(int *, struct svc_req *);extern int cuadro_prog_1_freeresult (SVCXPRT *,xdrproc_t,caddr_t);#else /* K&R C */
#define PERIMETRO 1extern int * perimetro_1();extern int * perimetro 1 svc();
Dr. Roberto Gómez C. Diapo. No. 64
extern int perimetro_1_svc();#define AREA 2extern double * area_1();extern double * area_1_svc();extern int cuadro_prog_1_freeresult ();#endif /* K&R C */
::
33
RPC: Remote Procedure Call
Llamadas con más de un parámetro
problemas y soluciones
Dr. Roberto Gómez C. Diapo. No. 65
RPC: Remote Procedure Call
Ejemplo aplicación: solución ecuaciones 2do. grado
a,b,c
r1, r2real, imag
:res1 = raiz(a,b,c)
:res b b a c
a= − ± −2 4
2
Dr. Roberto Gómez C. Diapo. No. 66
: res2 = complejo(a,b,c)
:co m p lex b
ab a c
aj=
−±
−2
24
2( )
34
RPC: Remote Procedure Call
Diseño del servicio a nivel local
Código del servidorCódigo del clienteContenido del archivo encabezado
La solucion de (1.0 -1.0 1.0)es (0.50000 -1.50000j) y (0.50000 1.50000j)rogomez@armagnac:158>toto 1 9 14La solucion de (1.0 9.0 14.0)es -2.00000 y -7.00000rogomez@armagnac:159>toto 1 1 1La solucion de (1.0 1.0 1.0)
Dr. Roberto Gómez C. Diapo. No. 71
( )es (-0.50000 -1.50000j) y (-0.50000 1.50000j)rogomez@armagnac:160>toto 1 2 2La solucion de (1.0 2.0 2.0)es (-1.00000 -2.00000j) y (-1.00000 2.00000j)rogomez@armagnac:161>
RPC: Remote Procedure Call
Diseño del sistema a nivel remoto
• Especificación del archivo raiz.x• Compilación con rpcgen• Reescritura del archivo servidor remoto
R it d l hi li t t
Dr. Roberto Gómez C. Diapo. No. 72
• Reescritura del archivo cliente remoto• Compilación y ejecución
}printf("La solucion de (%.1f %.1f %.1f)\n",data.a,data.b,data.c);printf("es (%.5f %.5fj) y (%.5f %.5fj)\n",rescom->real, rescom->imag,
rescom->real, (-1)*(rescom->imag));}
Dr. Roberto Gómez C. Diapo. No. 79
clnt_destroy(clnt);
}
RPC: Remote Procedure Call
Compilación
rogomez@costarica:81> make -f makefile.raizcc -g -c raiz_clnt.c -o raiz_clnt.occ -g -c raiz client c -o raiz client occ -g -c raiz_client.c -o raiz_client.occ -g -c raiz_xdr.c -o raiz_xdr.occ -g -o raiz_client raiz_clnt.o raiz_client.o raiz_xdr.o -lnsl cc -g -c raiz_svc.c -o raiz_svc.occ -g -c raiz_server.c -o raiz_server.oraiz_server.c: In function `resuelve_1_svc':raiz_server.c:20: warning: type mismatch in implicit declaration for built-in function `sqrt'cc -g -o raiz_server raiz_svc.o raiz_server.o raiz_xdr.o -lnslUndefined first referenced
Dr. Roberto Gómez C. Diapo. No. 80
symbol in filesqrt raiz_server.old: fatal: Symbol referencing errors. No output written to raiz_servermake: *** [raiz_server] Error 1[1] - Done /usr/4local/bin/xvile raiz.xrogomez@costarica:82>
41
RPC: Remote Procedure Call
Makefile generado por rpcgen
# This is a template makefile generated by rpcgen # Parameters CLIENT = raiz_clientSERVER = raiz_server
rogomez@costarica:84>raiz_client cuba 1 -1 1La solucion de (1.0 -1.0 1.0)es (0.50000 -1.50000j) y (0.50000 1.50000j)rogomez@costarica:85>raiz_client cuba 1 9 14La solucion de (1.0 9.0 14.0)es -2.00000 y -7.00000
rogomez@costarica:86>raiz_client cuba 1 1 1La solucion de (1.0 1.0 1.0)es (-0.50000 -1.50000j) y (-0.50000 1.50000j)rogomez@costarica:87>raiz_client cuba 1 2 2La solucion de (1.0 2.0 2.0)es (-1.00000 -2.00000j) y (-1.00000 2.00000j)rogomez@costarica:88>raiz_client cuba 1 -3 40La solucion de (1.0 -3.0 40.0)es (1.50000 -75.50000j) y (1.50000 75.50000j)rogomez@costarica:89>raiz client cuba 1 -3 -40
Dr. Roberto Gómez C. Diapo. No. 83
rogomez@costarica:89>raiz_client cuba 1 -3 -40La solucion de (1.0 -3.0 -40.0)es 8.00000 y -5.00000rogomez@costarica:90>raiz_client cuba 4 2 -1La solucion de (4.0 2.0 -1.0)es 0.30902 y -0.80902