204
Unidad III Primitivas de Sincronización M.C. Juan Carlos Olivares Rojas

Unidad III Primitivas de Sincronizacióndsc.morelia.tecnm.mx/~jcolivares/courses/sd107v/sd1_u3.pdf · 2014. 2. 7. · Unidad III Primitivas de Sincronización M.C. Juan Carlos Olivares

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • Unidad III Primitivas de Sincronización

    M.C. Juan Carlos Olivares Rojas

  • Temario

    • 3.1. Introducción 3.2. Comunicación

    • sockets, RPC, share memory• 3 3 Sincronización• 3.3. Sincronización • Semáforos, colas, memoria compartida y

    monitoresmonitores

  • Temario Propuestop

    • 3.1. Introducción • 3.2. Sincronización: Semáforos, colas,3.2. Sincronización: Semáforos, colas,

    memoria compartida y monitores• 3 3 Comunicación: sockets RPC share• 3.3. Comunicación: sockets, RPC, share

    memory

  • 3.1. Introducción • Para lograr la distribución de procesos se

    requiere de mecanismos que permitancoordinar y controlar la ejecución deprocesos en ambientes no centralizados, yasean de manera local y remota.

    • Los primeros protocolos para la distribuciónLos primeros protocolos para la distribuciónde procesos remotos fueron para máquinashomogéneas.homogéneas.

  • Introducción• La mayoría del control de procesos se hace

    a nivel de sistema operativo a través de lasllamadas del sistema.

    • El sistema de archivo forma parte importanteEl sistema de archivo forma parte importantede las primitivas de sincronización entreprocesos.procesos.

  • Introducción• Una forma básica de sincronización entre

    procesos es redireccionar el flujo de entrada,teniendo la entrada estándar y la tubería | para redireccionar lasalida de un programa sea la entrada deotra.

    • ls > archivo.txt; mysql < respaldo.sql• cat archivo txt | grep c*• cat archivo.txt | grep c

  • Introducción• Otra forma de comunicación fue la

    estandarización de sistemas heterogéneoscon interfaz común UUCP (Unix to UnixCopy Protocol) que dio origen a loscomandos R (rcopy, rlogin, rsh).

    • rlogin [email protected] [email protected]• rsh [email protected]

  • 3.2. Sincronización • 3.2.1 IPC• 3.2.2 Semáforos• 3.2.3 Colas (mensaje)3.2.3 Colas (mensaje)• 3.2.4 Memoria compartida

    3 2 5 Monitores• 3.2.5 Monitores

  • Comunicación• La comunicación entre procesos (IPC) es

    parte fundamental de las primitivas desincronización de un sistema distribuido.

    • Los mecanismos de comunicación entreLos mecanismos de comunicación entreprocesos no sólo aplican a aplicacionesdistribuidas sino a cualquier tipo.distribuidas sino a cualquier tipo.

  • Procesos• Son la unidad básica de atención del sistema

    operati ooperativo.

    • Se pueden copiar procesos en diferentessegmentos del sistema operativo.

    • Los procesos son dependientes del sistemaoperativo por lo que no se ejecutan en todoslos sistemas.

  • Procesos Unix• Los procesos se crean con fork()

    #include pid t pid;pid_t pid;pid = fork()

    • Se pueden copiar procesos con la familia defunciones exec.

  • fork()()if (pid == -1)perror(“Error al crear proceso”);

    else{

    if (pid == 0)/*Proceso hijo*/

    else/*Proceso padre*/

    }}

  • Terminación de procesosp• Cuando un proceso termina devuelve un valor de

    t l dretorno al proceso padre.

    T d l ti d E t• Todos los procesos tienen un proceso padre. Estecódigo de retorno puede ser consultado a través dela variable de entorno $?la variable de entorno $?

    • La forma más fácil de salir es devolver un código• La forma más fácil de salir es devolver un códigode retorno (e.g., return 0).

  • Terminación de procesosp• Otra forma de salir es a través de exit(),

    realiza aparentemente el mismocomportamiento, ayuda a desbloquearprocesos en espera.

    • La función atexit() permite definir una funciónque se ejecutará al finalizar un programa.que se ejecutará al finalizar un programa.

  • Terminación de procesosp• A el código de estado de un proceso

    formalmente se llama señalformalmente se llama señal.

    • Un proceso huérfano es aquel que se haquedado sin padre.

    • Un proceso zombi es aquel que se haquedado ocupando una posición de la tablade descriptor de procesos.

  • wait()()• En algunas ocasiones un proceso padre

    necesita esperar a q e s s hijos terminenecesita esperar a que sus hijos termine.Para ello necesita sincronizarse losprocesosprocesos.

    La función que nos permite parar un proceso• La función que nos permite parar un procesohasta que termine otro es wait

    • pid = wait(&estado);

  • wait()()• Algunas macros que nos ayudan en este

    proceso son:

    • WIFEXITED• WEXITSTATUS• WEXITSTATUS• WIFSIGNALED• WTERMSIG• WCOREDUMP

  • Más sobre procesosp• Un ejemplo de clonación de procesos es la

    ejecución de la función system() que nospermite ejecutar una llamada al sistema,generalmente un comando de la shell.

    • hijo = getpid();• Padre = getppid();• Padre = getppid();• Grupo = getpgrp();

  • Identificadores de usuario y de grupogrupo

    • En muchas ocasiones no sólo es necesarioconocer los identificadores de procesos sinoconocer los usuarios y los gruposconocer los usuarios y los grupos.

    • uid_t getuid(); /*usuario real*/• uid_t geteuid(); /*usuario extendido*/• gid_t getgid();• gid t getegid();g _ g g ();

  • Variables de entorno• En algunos casos es necesario compartir

    algunos valores entre aplicaciones, esto sepuede hacer a través de la variable deentorno.

    • Las variables de entorno pueden verse conel comando env (ambiente). Muchosel comando env (ambiente). Muchoscomandos muestran información a través deeste entorno.este entorno.

  • Variables de entorno• Hay algunas variables disponibles en la

    mayoría de los sistemas como HOME,SHELL, TERM, PATH.

    • Pueden accederse de manera individualPueden accederse de manera individualhaciendo eco en la pantalla con echo.

    • char *valor = getenv(“TERM”);

  • Variables de entorno• char *var1 = “VARIABLE=valor”• putenv(var1); /*Coloca una variable en el

    entorno*/

    • La función sleep() permite dormir un proceso• La función sleep() permite dormir un procesouna cantidad determinada de milisegundos.

  • Señales• Definidas en • 10 SIGBUS

    11 SIGSEGV• 1 SIGHUP• 2 SIGINT

    • 11 SIGSEGV• 12 SIGSYS• 13 SIGPIPE• 3 SIGQUIT

    • 4 SIGILL• 5 SIGTRAP

    • 13 SIGPIPE• 14 SIGALARM• 15 SIGTERM• 5 SIGTRAP

    • 6 SIGIOT• 7 SIGEMT

    • 15 SIGTERM• 16 SIGUSR1• 17 SIGUSR2

    • 8 SIGFPE• 9 SIGKILL

    17 SIGUSR2• 18 SIGCLD• 19 SIGPWR19 SIGPWR

  • Señales• int kill(pid, sig) sirve para mandar una señal

    de un proceso a otro.

    • pid > 0 proceso; pid = 0 a todos los procesosque pertenecen al mismo grupo.que pertenecen al mismo grupo.

    La función signal sirve para capturar una• La función signal sirve para capturar unaseñal y realizar una función con ella.

  • Señalesmain() {

    id i i t h dl ()void sigint_handler();if(signal(SIGINT,sigint_handler)== SIG_ERR)perror(“Error en la señal”);perror( Error en la señal );

    ……..}}

    void sigint handler(int sig) {void sigint_handler(int sig) {printf(“señal recibida”);

    }}

  • 3.2.1 IPC• El mecanismo de comunicación entre

    procesos más famosos es el IPC (Interprocesos más famosos es el IPC (InterProcess Comunication) de Unix System V.

    • El otro punto a tratar es sobre losmecanismos de intercomunicación entremecanismos de intercomunicación entreentidades de procesamiento diferentes condiferentes sistemas operativos: POSIXdiferentes sistemas operativos: POSIX.

  • Tuberías• Se pueden utilizar tuberías desde los

    procesos.

    • int pipe(tuberia);• int tuberia[2];• int tuberia[2];

    • tuberia[0]• tuberia[1]

  • Tuberías• Al dejar de utilizar una tubería, esta se debe

    de cerrar en sus dos extremos: close(pipe).

    • Por un extremo de la tubería se lee, y por elotro se escribe. Ya depende de la lógica delotro se escribe. Ya depende de la lógica delprograma ubicar que lado escribe y que ladolee. En general, primero se escribe y luegolee. En general, primero se escribe y luegose lee.

  • Tuberías• Para escribir en una tubería se realiza lo

    siguiente: write(tuberia[1] mensajesiguiente: write(tuberia[1], mensaje,strlen(mensaje)+1).

    • Para leer: read(tuberia[0], mensaje, MAX)

    • Las tuberías no son bidireccionales sólo vanLas tuberías no son bidireccionales, sólo vanen un sentido, pero se pueden utilizar dostuberías para pasar mensajes en ambastuberías para pasar mensajes en ambasdirecciones.

  • Tuberías• Las tuberías utilizadas sólo están disponibles

    para los descendientes de un proceso que locrean. Por este motivo, no están disponiblepara otros procesos.

    • Las tuberías entre procesos iguales se lesllama sin nombre. El otro tipo de tuberíasllama sin nombre. El otro tipo de tuberíastienen nombre y generalmente se les llamaFIFO.FIFO.

  • Tuberías• Las tuberías con nombre se manejan igual

    que las tuberías sin nombre con la salvedadde que presentan un nombre que ocupa unaentrada de directorio.

    • Se trabajan igual que un archivo sólo que sebloquea cuando un proceso escribe en labloquea cuando un proceso escribe en latubería.

  • Tuberías• Para crear una tubería con nombre desde

    shell se debe ejecutar: mknod fifo 1 pshell se debe ejecutar: mknod fifo_1 p

    • Desde programación las tuberías connombre se crean: mknod(“tubo”, S_IFIFO |permisos, 0)

    • Las comunicaciones vistas hasta ahora sonhalf-duplex Se puede utilizar un poll o selecthalf duplex. Se puede utilizar un poll o selectpara realizar comunicación full-duplex

  • 3.2.2 Semáforos• Los semáforos son mecanismos que

    permiten sincronizar procesospermiten sincronizar procesos.

    • Todos los mecanismos IPC tienen unaentrada en una tabla especial con una llavedefinida por el usuario.

    • Los posibles valores de la llave sonIPC PRIVATE IPC CREATE IP EXECLIPC_PRIVATE, IPC_CREATE, IP_EXECL,entre otros.

  • Semáforos• Cada entrada de la tabla tiene un registro de

    permisos (rw), información de estado yp ( ), yllamadas de control.

    • Las llaves son del tipo key_t. Para crear unallave se utiliza:llave se utiliza:

    #include #include y pkey_t ftok(path, id)

  • Llaveskey_t llave;if((llave= ftok(“/etc/ntp.conf”, ‘A’) == (key_t)-1)

    /*Error al crear la llave*/

    • ipcs se utiliza para ver los mecanismos ipc• ipcs se utiliza para ver los mecanismos ipcasignados (-q, -m, -s, -b)

    • ipcrm se utiliza para liberar recursos (-qmsqid, -m shmid, -s semid)

  • Semáforos• Es un mecanismo para prevenir colisiones

    cuando uno o más procesos solicitansimultáneamente un recurso.

    • Dijsktra los define como un objeto tipo enteroDijsktra los define como un objeto tipo enteroen los cuales se puede aplicar dosoperaciones: P (Proberen, comprobar) y Voperaciones: P (Proberen, comprobar) y V(Verhogen, incrementar), donde P sirve paraobtener el recurso y V para liberarlo.obtener el recurso y V para liberarlo.

  • Semáforos• Las operaciones sobre un semáforo son

    semget para crear un semáforo o habilitarsemget para crear un semáforo o habilitaruno existente, semctl para realizaroperaciones de control e inicialización,operaciones de control e inicialización,semop para realizar operaciones P y V.

    #include #include #include yint semget(key, nsems, semflg)

  • Semáforosint llave, semid;if((llave= ftok(“auxiliar”, ‘K’)) ==(key_t)-1)

    /*Tratamiento del error*/

    if((semid= semget(llave 4 IPC CREAT |if((semid= semget(llave, 4, IPC_CREAT |0600)) == -1)/*Error al crear el semáforo*//*Error al crear el semáforo*/

  • Semáforosint semctl(semid, semnum, cmd, arg)nion sem n{union semun{

    int val;struct semid_ds *buf;ushort *array;

    }arg;

    • Las opciones de control son: GETVAL,SETVAL GETPID GETNCNT GETZCNTSETVAL, GETPID, GETNCNT, GETZCNT,GETALL, SETALL, IPC_STAT, IPC_SET

  • Semáforosushort asem;asem[0]=5; asem[1]=3; asem[2]=4; asem[3]=8;semctrl(semid, 0, SETALL, asem)semctrl(semid, 0, SETALL, asem)valor = semctrl(semid, 3, GETVAL, 0)

    int semop(semid, sops, nsops)struct sembuf *sops;

  • Semáforosstruct sembuf{

    ushort sem num;ushort sem_num;short sem_op;short sem flg;short sem_flg;

    };

    • Si semop es negativo se decrementará (P), si seincrementa (V) y si es 0 no hace nadaincrementa (V) y si es 0 no hace nada.

    Las banderas son: IPC WAIT IPC NOWAIT• Las banderas son: IPC_WAIT, IPC_NOWAIT,SEM_UNDO

  • Semáforosstruct sembuf operacines[4];Operaciones[0].semnum = 1;Operaciones[0].sem op = -1;Operaciones[0].sem_op 1;Operaciones[0].sem_flg = 0;Operaciones[1] semnum 4;Operaciones[1].semnum = 4;Operaciones[1].sem_op = 1;Operaciones[1].sem_flg = 0;

    semop(semid, operaciones, 2);

  • 3.2.3 Colas (mensaje)( j )• La filosofía de las colas de mensajes es

    similar a las tuberías, pero con mayorversatilidad.

    • Una cola es una estructura de datosUna cola es una estructura de datosgestionada por el kernel, en la cual variosprocesos pueden escribir sobre ella. Elprocesos pueden escribir sobre ella. Elsincronismo para evitar colisión lo realiza elkernel.kernel.

  • Colas de mensajesj#include int msgget(ke msgflg)int msgget(key, msgflg)

    If((msqid= msgget(llave, IPC_CREATE | 0600))== -1)/*Error al crear la cola de mensajes*/

    • msgctrl(msq, cmd, buf) sirve para leer ymodificar la información estadística y demodificar la información estadística y decontrol de una cola.

  • Colas de mensajesj• Los comandos de control son: IPC_STAT,

    IPC SET IPC RMID Por ejemplo:IPC_SET, IPC_RMID. Por ejemplo:msgctrl(msqid, IPC_RMID, 0);

    • Las operaciones básicas de una cola dej i ibi l jmensajes son enviar y recibir los mensajes

    que se realizan con las siguientes funciones:

    int msgsnd(msqid, msgp, msgsz, msgflg);g ( q gp g g g)int msgrcv(msqid, msqp, msgtyp, msgflag);

  • Cola de mensajesj• El parámetro msgtyp indica el tipo de

    mensaje que se desea leer: 0 para el primermensaje, > 0 el primer mensaje de tipomsgtyp que haya en la cola,

  • Cola de mensajesjstruct{

    long tipo;char cadena[20];

    }mensaje;

    strcpy(mensaje.cadena, “SD1”);mensaje.tipo = 1;longitud = strlen(mensaje.cadena)if(msgsnd(msqid,&mensaje,longitud,0)==-1) /*Err*/( g ( q , j , g , ) )if(msgrcv(msqid,&mensaje,longitud,1,0) ==-1) /*Er*/

  • 3.2.4 Memoria compartidap• La forma más rápida de comunicar dos procesos

    t d ies que compartan una zona de memoriacompartida.

    • Las primitivas para manipular memoria compartidason: shmget para crear una zona d ememoriason: shmget para crear una zona d ememoriacompartida o utilizar una ya creada, shmctl paraacceder y modificar la información administrativa yy yde control, shmat para unir una zona de memoriacompartida a un proceso, y shmdt para separa unazona previamente unida.

  • Memoria compartidap#include int shmget(key, size, shmflg);

    int shmid;if((shmid shmget(IPC PRIVATE 4096if((shmid = shmget(IPC_PRIVATE, 4096,

    IPC_CREAT | 0600)) == -1)/*E l i tid *//*Error al crear memoria compartida*/

  • Memoria compartidap• int shmctl(shmid, cmd, buf)

    • cmd indica la operación la cual puede ser:cmd indica la operación la cual puede ser:IPC_STAT, IPC_SET, IPC_RMID,SHM LOCK, SHM UNLOCK.SHM_LOCK, SHM_UNLOCK.

    struct shmid s *buf• struct shmid_s *buf

    • smctl(shmid, IPC_RMID, 0);

  • Memoria compartidapchar *shmat(shmid, shmaddr, shmflg);i t h dt( h dd )int shmdt(shmaddr);

    float *memoria;shmid = shmget(llave, MAX * sizeof(float),

    IPC CREAT | 0600)IPC_CREAT | 0600);memoria = shmat(shmid, 0, 0);/*Operar memoria*/shmdt(memoria);shmctl(shmid, IPC_RMID, 0);

  • 3.2.5 Monitores• Es un procesos que se encarga de verificar

    el funcionamiento de algún recursogarantizando la exclusión mutua (mutex).

    • En un monitor los procesos se bloquean yEn un monitor los procesos se bloquean ydesbloquean.

    • Pueden existir diversas implementaciones noestandarizadas de un monitorestandarizadas de un monitor.

  • Hilos• Son procesos ligeros ya que no se duplican

    completamente, sólo duplican su segmentode código. Por tal motivo, comparten datosfácilmente, la desventaja es que ocurrenmuchos problemas del tipo “race conditions”,pero al igual que IPC se soluciona conmecanismos como regiones críticas, zonasde exclusión mutua, etc.

  • Hilos• PThreads (POSIX Threads) es la biblioteca

    para la creación de hilos más implementadaen sistemas *X.

    • Se utiliza la biblioteca pthread por lo queSe utiliza la biblioteca pthread por lo quealgunos compiladores ya la incluyen demanera predeterminada sino habrá quemanera predeterminada sino habrá queindicar su uso: gcc … -lpthread

  • Hilos• Crear hilos:int pthread_create(pthread_t *thread,

    pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)

    • Esperar la finalización de hilos:int pthread join(pthread t th voidint pthread_join(pthread_t th, void

    **thread_return)

  • Hilos• No guardar estado del hilo:int pthread_detach(pthread_t h)

    • Salir de un hilo:pthread exit(void *retval)pthread_exit(void *retval)

    • Biblioteca a utilizar: #include

  • Hilostypedef struct parametros {

    int id;char *nombre

    }};

    void *funcion(parametros *p) {printf(“%s %d”, p->cadena, p->id);pthread_exit(&(p->id))

    }

  • Hilos• Referencia asi mismo:Yo = pthread_self(); /*Demás funciones*/

    • Enviar una señal a un hilo:pthread kill(pthread t hilo, int señal);p _ (p _ , );

    • Los hilos no están tan extendidos por queLos hilos no están tan extendidos por queexisten muchas variantes: hilos mach, hilossolaris, Gthreads, etc., ,

  • Hilos• Mutex:

    pthread_mutex_init(pthread_mutex_t *mutex, constth d t tt t * tt )pthread_mutex_attr_t *attr)

    int pthread_mutex_lock(pthread_mutex_t *mutex)int pthread_mutex_lock(pthread_mutext_t *mutex)

    int pthread_mutext_destroy(pthread_mutext_t*mutex)

  • 3.3 Comunicación • 3.3.1 Sockets• 3.3.2 RPC• 3.3.3 RMI3.3.3 RMI• 3.3.4 CORBA

    3 3 5 Servicios Web• 3.3.5 Servicios Web• 3.3.6 Otras tecnologías distribuidas

  • 3.3.1 Sockets• Los sockets son el mecanismo de

    sincronización distribuida más importante.

    • Se les denomina conectores por que puedenunir un proceso cliente y un proceso servidor,unir un proceso cliente y un proceso servidor,de manera semejante a como se puede unirun enchufe de un dispositivo eléctrico con suun enchufe de un dispositivo eléctrico con surespectivo zócalo.

  • Sockets• El mecanismo de sockets más conocido es

    el referente a la API de Berkeley.

    • Está API está implementado enprácticamente todos los sistemas Unix, por loprácticamente todos los sistemas Unix, por loque se maneja C, pero también está portadoa otras arquitecturas como Windowsa otras arquitecturas como Windows(WinSock) y a otros lenguajes como Java

  • Sockets• Los sockets trabajan sobre capa 4

    (Transporte) del modelo OSI, aunquealgunos autores la ubican en la capa 5(Sesión).

    • Para la comunicación de procesos remotosse necesita conocer la dirección de lase necesita conocer la dirección de lamáquina destino y el puerto donde se va aescuchar.escuchar.

  • Sockets• Los sockets no están casados con ningún

    tipo de red, por lo que se puedenimplementar en diversos protocolos de redcomo IPX/SPX, NetBEUI, TCP/IP, siendoeste último el más importante.

    • Para hacer uso de sockets se necesitan dosPara hacer uso de sockets se necesitan doscosas: una familia o protocolo a utilizar parala comunicación y un tipo de conexión.la comunicación y un tipo de conexión.

  • Sockets• Se utiliza la biblioteca

    • Se utilizan las siguientes estructuras deSe utilizan las siguientes estructuras dedatos:

    struct sockaddr {h t f il /*F ili */u_shortsa_family_; /*Familia*/

    char sa_data[14]; /*Dirección*/};

  • Sockets• Para utilizar sockets TCP/IP se debe

    emplear la familia o protocolo Internet, la cualdefine sus direcciones en yson:

    struct in_addr {u long s addr; /*32 bits*/u_long s_addr; / 32 bits /

    };

  • Socketsstruct sockaddr_in {

    short sin_familiy; /*AF_INET*/u_short sin_port; /*16 bits*/struct in_addr sin_addr; /*32 bits*/char sin_zero[8]; /*8 bytes no usados*/y

    };

    • También existen sockets para sistemas Unixde manera nativa llamados “Unix Domain”de manera nativa llamados Unix Domain”

  • Sockets• La biblioteca define la siguiente

    estructura:estructura:

    t t k dd {struct sockaddr_un {short sun_family; /*AF_UNIX*/char sun_family; /*Ruta*/

    };

    • Los sockets se basan en la arquitecturaLos sockets se basan en la arquitecturacliente/servidor

  • Funciones de un servidor1. Abrir el canal de comunicación e informar a

    la red su dirección y su disposición paraaceptar peticiones de servicio.

    2. Esperar a que un cliente pida un servicio3. Atender un cliente (servidor interactivo) a la3. Atender un cliente (servidor interactivo) a la

    vez o crear un proceso hijo (servidorconcurrente)concurrente)

    4. Volver al punto 2 para esperar nuevaspeticionespeticiones.

  • Funciones de un cliente1. Abrir el canal de comunicaciones y

    conectarse a la dirección del servidor.

    2. Enviar al servidor un mensaje de peticiónde servicio y esperar hasta recibir lade servicio y esperar hasta recibir larespuesta.

    3. Cerrar el canal de comunicaciones yterminar la ejecuciónterminar la ejecución.

  • Primitivas de sockets en el servidorservidor

    • Las primitivas son para comunicaciónorientada a conexión (Stream)

    socket();bind();bind();listen();acept();read();write();

  • Primitivas de sockets en el cliente• Las primitivas de sockets pueden ser

    bloqueantes y no bloqueantes

    socket();connect();connect();write();read();close();

  • Primitivas de sockets en el servidorservidor

    • Las primitivas son para comunicación entreprocesos no orientada a conexión(Datagramas).

    socket();socket();bind();recvfrom();recvfrom();sendto();

  • Primitivas de sockets en el clientesocket();bind();sendto();sendto();recvfrom();shutdown();shutdown();

    Socket(int af, int type, int protocol)• Tipos: SOCK STREAM, SOCK DGRAMTipos: SOCK_STREAM, SOCK_DGRAM

  • Socketsbind(int sfd, const void *addr, int addrlen);

    listen(int sfd, int backlog);listen(int sfd, int backlog);

    connect(int sfd void *addr int addrlen);connect(int sfd, void *addr, int addrlen);

    accept(int sfd, void *addr, int *addrlen);

  • Sockets• Para establecer una comunicación a través

    de sockets se necesitan 5 requerimientos:

    • Dirección del servidor• Puerto del servidor• Puerto del servidor• Dirección del cliente• Puerto del cliente• Canal de comunicación abierto

  • Sockets• Para leer datos de un socket se pueden

    utilizar las siguientes primitivas: read, readv,recv, recvfrom y recvmsg; siendo las másutilizadas read y recv(sfd, buf, len, flags).

    • Para escribir datos en un socket se utilizanlas siguientes primitivas: write, writev, send,las siguientes primitivas: write, writev, send,sendto y sendmsg, siendo las más utilizadaswrite y send(sfd, buf, len, flags).write y send(sfd, buf, len, flags).

  • Sockets• Se necesitan funciones de conversión para

    d h i l dif i i t tpoder homogenizar las diferencias existentesentre las diversas arquitecturas de cómputo.

    #include p

    • inet addr(char *) convierte una dirección IP• inet_addr(char ) convierte una dirección IPen formato de cadena a su representación enbytesbytes.

  • Sockets• char *inet_ntoa(struct in_addr) convierte una

    dirección IP a cadena.

    unsigned long htonl(unsigned long hostlong);unsigned short htons(unsigned short hshort);unsigned short htons(unsigned short hshort);unsigned long ntohl(unsigned long netlong);unsgined long ntohs(unsigned short netsho);

    • h:host n:network l:long s:short

  • Servidor streamint sfd, nsfd, pid;struct sockaddr_in ser, cli;int tam clie;int tam_clie;

    if((sd socket(AF INET SOCK STREAM 0))if((sd = socket(AF_INET, SOCK_STREAM, 0))== -1) /*Error al crear el socket*/

    /*Dirección del servidor*/ser.sin_family = AF_INET;

  • Servidor streamser.sin_addr.s_addr = inet_addr(

    “148.208.209.25”);ser.sin_port = htons(24400);( )

    if(bind(sfd &ser sizeof(ser)) == -1)if(bind(sfd, &ser, sizeof(ser)) == -1)/*Error al publicar dirección*/

    listen(sfd, 5);

  • Servidor streamfor(;;){ /*Un servidor siempre está activo*/

    tam_clie = sizeof(clie);if((nsfd = accept(sfd, &clie, &tam_clie)) == -1)

    /*Error al aceptar peticiones*/

    if((pid = fork()) ==-1) /*Error al crear subproceso*/else if(pid ==0) /*Hijo atiende peticiones*//*Código padre*/ close(sfd);

    }}

  • Cliente streamint sfd;struct sockaddr_in ser;

    if((sfd = socket(AF_INET, SOCK_STREAM, 0))==-1) /*Error al crear el socket*/==-1) / Error al crear el socket /

    /*Dirección del servidor*/ser.sin_family = AF_INET;

  • Cliente streamser.sin_addr.s_addr = inet_addr(

    “148.208.209.25”);ser.sin_port = htons(24400);( )

    if(connect(sfd &ser sizeof(ser)) ==-1) /*Errorif(connect(sfd, &ser, sizeof(ser)) ==-1) / Erroral conectar*/

    send(); read(); ….close(sfd);

  • Servidor datagramagint sfd;struct sockaddr_in ser, clie;

    if((sfd = socket(AF_INET, SOCK_DGRAM, 0))== -1) /*Error al crear socket datagrama*/== -1) / Error al crear socket datagrama /

    /*Dirección del servidor*/ser.sin_family = AF_INET;ser.sin_port = htons(21100);

  • Servidor datagramagser.sin_addr.s_addr = inet_addr(

    “142.208.209.25”);

    if(bind(sfd, &ser, sizeof(ser)) ==-1) /*Error alligar el socket*/ligar el socket /

    recvfrom(); sendto();recvfrom(); sendto();close(sfd);

  • Cliente datagramagint sfd;struct sockaddr_in ser, clie;

    if((sfd = socket(AF_INET, SOCK_DGRAM, 0))==-1) /*Error al crear el socket*/==-1) / Error al crear el socket /

    /*Dirección del servidor*/ser.sin_family = AF_INET;ser.sin_port = htons(21100);

  • Cliente datagramagser.sin_addr.s_addr = inet_addr(

    “148.208.209.25”);

    /*Dirección del cliente*/cli sin family = AF INETcli.sin_family = AF_INETcli.sin_addr.s_addr =

    inet addr(INADDR ANY);inet_addr(INADDR_ANY);cli.sin_port = htons(0);

  • Cliente datagramagif(bind(sfd, &cli, & sizeof(cli)) ==-1) /*Error*/

    sento(); recvfrom(); …sento(); recvfrom(); …close(sfd);

    • Existen otras funciones auxiliares de socket:

    • gethostname(char *nombre, size t tipo);gethostname(char nombre, size_t tipo);

  • Otras funciones de sockets• shutdown(int sfd, int how) cierra la

    comunicación del socket Los socket porcomunicación del socket. Los socket pornaturaleza son bidireccionales. Si how es 0se deshabilita la recepción de datos si es 1se deshabilita la recepción de datos, si es 1se deshabilita el envío y si es 2, se cierratodo (similar a close())todo (similar a close()).

    • Para utilizar nombres de dominio se utilizan:

    struct hosent *gethostent();

  • Otras funciones de sockets• struct hostent *gethostbyname(char *nom);

    • struct hostent *gethostbyaddr(const charstruct hostent gethostbyaddr(const char*addr, int len, int type);

    • Para utilizar estas funciones se debe incluirla biblioteca:la biblioteca:

    #include

  • Otras funciones de socketsstruct hostent{

    char *h_name;char **h_aliasses;char h_addrtype;int h_length;gchar **h_addr_list;

    };};

  • Otras funciones de socketsstruct hostent *host;

    if((host = gethostbyname(argv[1])) ==-1) /*Errorif((host gethostbyname(argv[1])) 1) / Erroral resolver nombre a IP*/

    ser.sin_familiy =AF_INET;ser.sin_addr.s_addr = *(long *) host->

    h_addr_listser.sin_port = htons(1000);

  • Sockets• Algunas funciones trabajan en forma

    bloqueante como accept(), recv(), revfrom(),etc. Para cambiar el modo de trabajo seutiliza la función: int fcntl(int fd, int cmd, longarg)

    fd = socket(AF INET, SOCKET STREAM, 0);fd socket(AF_INET, SOCKET_STREAM, 0);fcntl(fd, F_SETFL, O_NONBLOCK);

  • Sockets• La función select permite monitorear un

    conj nto de descriptores para lect raconjunto de descriptores para lectura,escritura, y excepciones.

    int select(int n, fd_set *readfds, fd_set*writefds fd set *exceptfds timeval *t);*writefds, fd_set *exceptfds, timeval *t);

    • Se utilizan las macros FD_ZERO(),FD_SET(), FD_CLR() y FD_ISSET();

  • Sockets• Otra alternativa a select es poll,

    #include int poll(struct pollfd fds[] nfds t n int time);int poll(struct pollfd fds[], nfds_t n, int time);

    struct pollfd {struct pollfd {Int fd;Short events; /*Eventos solicitados*/;Short revents; /*Eventos ocurridos*/

    };

  • Sockets/*Para reutilizar dirección IP*/int i = 1;setsockopt(s, SOL SOCKET, 0, &i, sizeof(i));setsockopt(s, SOL_SOCKET, 0, &i, sizeof(i));

  • Sockets Java• Java es un lenguaje multiplataforma que al

    igual que otros lenguajes de programacióntiene APIs para la comunicación de procesosremotos.

    • La ventaja de utilizar sockets en Java conrespecto a su contraparte en C, radica enrespecto a su contraparte en C, radica enque Java enmascara la complejidad de losprocesos en clases más simples.procesos en clases más simples.

  • Sockets Java• Para utilizar sockets y clases similares se

    necesita utilizar el paquete java.net.*;

    try {URL loc = “http://www cursos com mx”;URL loc = http://www.cursos.com.mx ;getAppletContext().showDocument(loc);

    } catch(MalformedURLException e) {System.err.println(“URL inválido”);

    }

  • Sockets en Javatry {

    URL archivo = newURL archivo newURL(“http://www.itmorelia.edu.mx/lista.txt”);

    InputStream entrada = archivo.openStream();DataInputStream datos = newDataInputStream(entrada);

    String texto;String texto;

  • Sockets en Javawhile( texto = datos.readLine() != null)System.out.println(texto + “\n”);

    } catch(IOException e) {} catch(IOException e) {System.err.println(“Error al leer flujos”);

    }}

    //Servidor usando sockets streamServerSocket ss = new ServerSocket(5000,(

    100);

  • Servidor StreamSocket con = ss.accept();OutputStream sal = con.getOutputStream();

    String s = new String(“ITMorelia\n”);for(int i 0; i < s length(); i++)for(int i=0; i < s.length(); i++)

    sal.write((int) s.charAt(i));

    Conection.close();()

  • Cliente streamSocket c = new

    Socket(InetAddress.getLocalHost(), 5000);

    InputStream entrada = c.getInputStream();

    char c;while((c = (char) entrada.read()) != ‘\n’)

    System.out.println(String.valueOf(c));

  • Servidor datagramasgtry {

    DatagramSocket sS = newDatagramSocket();g ()DatagramSocket rS = new DatagramSocket(5000);5000);

    } catch(SocketException SE) {SE printStackTrace();SE.printStackTrace();System.exit(1);

    }}

  • Servidor datagramasgbyte a = new byte [100];DatagramPacket rP = new DatagramPacket( a,

    a.length);g )rS.receive(rP);

    System.out.println(“Dirección:” +rP getAddress() + “ Puerto” + rP getPort + “rP.getAddress() + “ Puerto” + rP.getPort + “longitud:” +rP.getLength());

  • Servidor datagramasgbyte d[] = rP.getData();sP = new DatagramPacket(d, d.length,

    rP.getAddress(), 5001);g () )

    sS send(sendPacket);sS.send(sendPacket);

    InetAddress comp =InetAddress.getByName(“www.itc.edu.mx”);

  • Sockets Java• Otras excepciones que se pueden capturar:

    • UnknownHostExceptionUnknownHostException• EOFException

    ConnectException• ConnectException

    • Otra forma de implementar la comunicaciónen grupos es a través de la multidifusión.

  • Cliente datagramasgtry {

    DatagramSocket sS = newDatagramSocket();g ()DatagramSocket rS = new DatagramSocket(5001);5001);

    } catch(SocketException SE) {SE printStackTrace();SE.printStackTrace();System.exit(1);

    }}

  • Cliente datagramagtry {byte a[] = new byte[100];DatagramPacket rP= new DatagramPacketDatagramPacket rP new DatagramPacket(a, a.length);

    rS.receive(rP);byte d[] = rP.getData();

    } catch(IOException e) {e.printStackTrace(); }

  • Multicast Javatry {

    I tAddInetAddress grupo = InetAddress.getByName(args[1]);MulticastSocket s = new MulticastSocket(6789);MulticastSocket s = new MulticastSocket(6789);s.joinGroup(grupo);byte [] m = args[0].getBytes();byte [] m args[0].getBytes();DatagramPacket mensajeSalida = newDatagramPacket(m, m.length, grupo, 6789);s.send(mensajeSalida);

  • Multicast Java//conseguir mensajes de otros miembros del grupo

    byte []buffer = new byte[1000]; for(int i=0; i

  • Sockets Java• Algunos componentes gráficos como los

    JEditorPane pueden ver contenido Web agregandoJEditorPane pueden ver contenido Web agregandoun manejador de eventos.

    JEditorPane cont = new JEditorPane();cont.addHyperlinkListener(yp (

    new HyperlinkListener() {Public void hiperlinkUpdate(HyperlinkEvent evento)obtenerPágina(evento getUrl toString());obtenerPágina(evento.getUrl.toString());

    }

  • Sockets Javapublic void obtenerPagina(String ubi) {

    t {try {cont.setPage(ubi);cont setText(ubi);cont.setText(ubi);

    } catch(IOException e) {JOptionPane showMEssageDialog(this “Error alJOptionPane.showMEssageDialog(this, Error alrecuperar URL”, “URL incorrecto”,JOptionPane.ERROR_MESSAGE);}

    }

  • Sockets en Java• Se recomienda la utilización en las nuevas

    i d J d l fl j Obj tI tStversiones de Java de los flujos ObjectInputStreamy ObjectOutputStream, los cuales son serializables.

    • El cierre de los flujos debe hacerse en ordeninverso de cómo se crearoninverso de cómo se crearon.

    • Se pueden cambiar algunas opciones de• Se pueden cambiar algunas opciones deconfiguración como s.setSoTimeout(5000);//Tiempo de interrupción de lectura//Tiempo de interrupción de lectura.

  • Sockets Java• También se recomienda el uso de un objeto

    PrintWriter para manejar de mejor forma laescritura a través de un socket.

    PrintWriter escritor = newPrintWriter escritor newPrintWriter(socket.getOutputSream());

    escritor println(“Mensaje: ” +mensaje);escritor.println( Mensaje: +mensaje);escritor.flush();

  • Sockets Java• Las nuevas versiones de Java permiten la

    tili ación de sockets sin bloq eo Unutilización de sockets sin bloqueo. Unservidor sin bloqueo permite atenderdiversos clientes de manera simultánea sindiversos clientes de manera simultánea sintener la necesidad de crear un subprocesopara atenderlo.para atenderlo.

    • La tecnología sin bloqueos se implementa• La tecnología sin bloqueos se implementapor medio de SelectableChannel y objetosSelector, ambos usan java.nio.channels;Selector, ambos usan java.nio.channels;

  • Sockets Java• SelectableChannel representa un canal de

    i ió d d i i t icomunicación que puede administrar varioscanales de E/S en forma simultánea.

    • Selector es un multiplexor de objetosSelectableChannel permite comprobar los canalesSelectableChannel, permite comprobar los canaleslistos de manera simultánea.

    • SeverSocketChannel es idéntico a ServerSocketimplementando el modo sin bloqueoimplementando el modo sin bloqueo.

  • Sockets Java• También se puede utilizar un objeto Scanner para

    leer desde un socketleer desde un socket.

    Socket s = new Socket(“time-A timefreq bldrdoc gov”Socket s = new Socket( time A.timefreq.bldrdoc.gov ,13);

    InputStream e = s.getInputStream();p g p ();Scanner in = new Scanner(e);

    while(in.hasNextLine()) {String l =in.nextLine(); System.out.println(l);

    }

  • Sockets Java• Java dispone de otras APIs para servicios de

    red muy comunes como correo electrónico,Web, etc. Ocupando paquetes comojavax.mail.*

    • Existen otras tecnologías como los Servlets(HttpServlets), Applets y otras tecnologías de(HttpServlets), Applets y otras tecnologías deobjetos distribuidas.

  • WinSocks• Son la implementación de los sockets de

    Berkele para Windo s Se manejan mBerkeley para Windows. Se manejan muysimilar. Se ocupa la biblioteca winsock.lib ylas DLLs winsock dll y wsock32 dlllas DLLs winsock.dll y wsock32.dll

    SOCKET s socket(AF INETSOCKET s = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

    if (s == INVALID_SOCKET) /*Error*/

  • WinSocksHOSTENT *h =

    gethostb name(“ itmorelia ed m ”)gethostbyname(“www.itmorelia.edu.mx”);

    SOCKADDR_IN ser;memset(&ser, 0, sizeof(SOCKADDR_IN));ser.sin_family = AF_INET;ser.sin port = htons(80);_p ( );ser.sin_addr = *((INADDR_IN *) h-

    >h addr list[0]);_ _ [ ]);

  • WinSocksif(connect(s, (SOCKADDR *) &ser, sizeof(ser))

    SOCKET ERROR) /*Err*/== SOCKET_ERROR) /*Err*/

    send(s, &buf, tam, 0);

    closesocket(s);

    • Existen otras APIs de nivel más alto comoWinInet (Windows Internet Service)( )

  • WinSocks• Afortunadamente se pueden programar

    sockets en Windows con un nivel deabstracción más alto utilizando por ejemploel MFC (Microsoft Solution Framework).

    • Existe la clase CSocket y CAsyncSocketpara comunicaciones síncronas y asíncronaspara comunicaciones síncronas y asíncronasrespectivamente. En general se utilizaCAsyncSocket.CAsyncSocket.

  • WinSocks• Algunos métodos de estas clases son:

    Accept(); OnAccept();Bind();Close(); OnClose();Connect(); OnConnect();(); ();GetSockOpt(); SetSockOpt();Listen();Listen();Receive(); OnReceive(); ReceiveFrom();Send(); OnSend(); SendTo();Send(); OnSend(); SendTo();Shutdown();

  • Sockets J2MEConnection web = Connector.open

    (“http://www.itmorelia.edu.mx”);

    Connection miSocket = Connector.open(“socket://192.168.1.1:52100”);( socket://192.168.1.1:52100 );

    Connection serial = Connector openConnection serial = Connector.open(“comm:0;baudrate=9000”);

  • Sockets J2MEHttpConnection conn = (Httpconnection)

    Connector.open(“http://itmorelia.edu.mx”);

    conn.setRequestMethod(HttpConnection.post);(HttpConnection.post);

    conn setRequestProperty (“User Agent”conn.setRequestProperty (“User-Agent”,“GoogleBot”);

  • Sockets J2MEif (conn.getResponseCode()==

    HttpConnection HTTP OK) {HttpConnection.HTTP_OK) {DataInputStream res = new DataInputStream

    (conn.openInputStream);byte[] datos = new byte [c.getLength()];res.readFully();res close();res.close();

    }else {else {

    //Error}}

  • Sockets C#• La conexión puede ser síncrona y asíncrona.

    using System.Net.Sockets;

    Socket con = new Socket((Address.Family.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

    IPAddress dir = IPAddress.parse(“127.0.0.1”);p ( );

  • Sockets C#• IPEndPoint ip = new IPEndPoint(dir, 8090);

    • con.Bind(ip);con.Bind(ip);• con.Listen(1);

    • con.Accept();• con.BeginAccept(new

    AsyncCallback(onAccept()), con);

  • Sockets C#• Existen objetos ya predefinidos para

    conexión:

    WebRequest req = WebRequest.Create(URI)WebResponse resp = req GetResponse();WebResponse resp = req.GetResponse();Stream f = res.GetResponseStream();StreamReader leer = new StreamReader(f);string cad = leer.ReadToEnd();

  • Sockets C#• Existen otras clases auxiliares:

    TcpListener ser = new TcpListener(8000);TcpListener ser new TcpListener(8000);ser.Start();

    TcpClient cli = new TcpClient();Cli.Connect(new IPEndPoint(serIP, 8000));

  • Sockets• Estados de una conexión:

    • Establecida (Enviando, Recibiendo,Establecida (Enviando, Recibiendo,Encolada, Esperando)

    • Desconexión

  • 3.3.2 RPC• Las llamadas a procedimientos remotos

    (RPC) fue el primer intento por obtener unmiddleware para la construcción de sistemasdistribuidos.

    • Su funcionamiento se basa en la arquitecturacliente/servidor siendo totalmentecliente/servidor siendo totalmentetransparente para el usuario.

  • RPC• El problema del manejo de procesos

    distribuidos con sockets radica en que sebasa en el flujo de E/S, haciendo losprogramas más difíciles de estructurar.

    • En 1984 Birelly y Nelson idearon el modelode RPC a semejanza del llamado dede RPC a semejanza del llamado deprocedimientos locales.

  • RPC• El nivel de transparencia en RPC es muy alto

    ya que el usuario no tiene que ver condetalles de conexión.

    • La simplicidad de toda esta heterogeneidadLa simplicidad de toda esta heterogeneidaden el llamado a un procedimiento remoto esrealizado por los stubs (resguardos) tanto enrealizado por los stubs (resguardos) tanto enel cliente como en el servidor.

  • RPC• Para la transferencia de datos entre los

    stubs, se necesita de un proceso de empacardesempacar los parámetros y resultados.Dicho proceso recibe el nombre demarshalling.

    • Los stubs se comunican con los núcleos deLos stubs se comunican con los núcleos decada proceso logrando una transparenciamuy alta.muy alta.

  • RPC• La secuencia de mensajes RPC es la

    siguiente:siguiente:

    1.El procedimiento cliente llama al stub delcliente de la manera usual.

    2.El stub del cliente construye un mensaje yhace un señalamiento al núcleo.

    3.El núcleo envía el mensaje al núcleo remoto.

  • RPC4. El núcleo remoto proporciona el mensaje al

    stub del servidor.5. El stub del servidor desempaca los

    parámetros y llama al servidor.6. El servidor realiza el trabajo y regresa el6. El servidor realiza el trabajo y regresa el

    resultado al stub.7 El stub del servidor empaca el resultado en7. El stub del servidor empaca el resultado en

    un mensaje y hace un señalamiento alnúcleonúcleo.

  • RPC8. El núcleo remoto envía el mensaje al núcleo

    del cliente.9. El núcleo del cliente da el mensaje al stubj

    del cliente.10.El stub desempaca el resultado y lo regresa10.El stub desempaca el resultado y lo regresa

    al cliente.

    • El manejo de los datos se hace a través deXDR (eXternal Data Representation)XDR (eXternal Data Representation).

  • RPC• Para el envío de datos se utiliza la siguiente

    forma canónica: Complemento a 2 losenteros, ASCII caracteres, 0 (falso) y 1verdadero, formato IEEE decimales, todoguardado como little endian.

    • En la práctica RPC no es lo mismo que unEn la práctica RPC no es lo mismo que unprocedimiento local a la hora de revisar losmecanismos de fallas.mecanismos de fallas.

  • RPC• La semántica de fallas de RPC es la

    siguiente:siguiente:

    1.El cliente no puede localizar al servidor.2.Se pierde el mensaje de solicitud del cliente

    al servidor3.Se pierde el mensaje de respuestas del3.Se pierde el mensaje de respuestas del

    servidor al cliente.4 El servidor falla antes de recibir una solicitud4.El servidor falla antes de recibir una solicitud.

  • RPC5. El cliente falla después de enviar una

    solicitudsolicitud.

    • En general existen diversasimplementaciones de RPC, siendo las másextendidas sobre TCP/IP, la cual tiene lossiguientes puntos a favor:

    • El protocolo ya ha sido diseñado lo queEl protocolo ya ha sido diseñado, lo queahorra trabajo considerable.

  • RPC• Se dispone de muchas implementaciones.

    Esta disponible en casi c alq ier sistema• Esta disponible en casi cualquier sistemaUnix.

    • Tanto TCP como UDP están soportados pormuchas redes.

    • Las implementaciones más evolucionadas deLas implementaciones más evolucionadas deRPC incluye la de Sun ONC (Open NetworkComputing) y DCE (Distributed ComputingComputing) y DCE (Distributed ComputingEnvironmet).

  • RPC• RPC está desarrollado en C, pero algunas

    versiones permiten programar en otroslenguajes como Fortran. Lasimplementaciones más actuales trabajansobre XML formando los XML-RPC.

    • Para la conexión entre un cliente y unPara la conexión entre un cliente y unservidor utilizando RPC se siguen dos pasos:localizar la máquina servidor, y localizar ellocalizar la máquina servidor, y localizar elproceso en esa máquina.

  • RPC• Para encontrar dichos servicios se necesita

    de un demonio RPC que se encuentremonitoreando todos los procesos remotos,dicho proceso se llama portmap , el cualescucha en el puerto 111.

    • Muchos servicios de red utilizan RPC paraMuchos servicios de red utilizan RPC parafuncionar, entre ellos NFS, el cual es unsistema de archivos distribuidos.sistema de archivos distribuidos.

  • RPC• Un programa en RPC se crea a través de un

    lenguaje de definición de interfaces (IDL por suslenguaje de definición de interfaces (IDL por sussiglas en Inglés). Tiene la extension .X

    program RAND_PROG {version RAND VER {version RAND_VER {

    void INICIALIZA_RANDOM(long) =1;doble OBTEN SIG RANDOM(void) = 2;_ _ ( ) ;

    } =1; /*No. de version*/} = 0x31111111; /*No. de programa*/} p g

  • RPC• rpcgen -c -a rand.x

    • rand server.c servidorrand_server.c servidor• rand_svc.c stub del servidor (no se modifica)

    rand h cabeceras• rand.h cabeceras• rand_clnt.c stub del cliente (no se modifica)• rand_client.c cliente• rand xdr.c manejo de estructurasrand_xdr.c manejo de estructuras

  • RPC• 00000000-1FFFFFFF Definidos por sun• 20000000-2FFFFFFF Definidos por el

    usuario• 40000000-5FFFFFFF Transitorios• 60000000-FFFFFFFF Reservados para usos• 60000000-FFFFFFFF Reservados para usos

    futuros

    • rpcinfo -s• portmap

  • RPCconst MAX = 100;typedef int Longitud;

    struct argumentos {float salario;float salario;

    Longitud tam;};

    • Sólo se puede recibir y enviar un parámetro.

  • RPC• Existen nuevas propuestas para mejorar el

    desempeño de RPC como RPC2 quemaneja UDP. También se han diseñadomecanismos como MultiRPC para el manejode RPCs en paralelos. Existen otrasalternativas como LRPC (RPC ligeros) quese basan en optimizaciones de la copia dedatos y de la planificación de los hilos.

    • RPC está definido en el RFC 1831.

  • 3.3.3 RMI• La invocación de métodos remotos es la versión

    i t d bj t d l fil fí RPCorientada a objetos de la filosofía RPC.

    L li d J d b h d• Los programas realizados en Java deben heredarde la clase remote.

    • A la hora de ejecutar se deben indicar las políticasde seguridad Esto se hace a través del parámetrode seguridad. Esto se hace a través del parámetro-D de java

  • RMIjava -Djava.security.policy=politica prg

    • Los archivos de stub se generan con elLos archivos de stub se generan con elcomando rmic -d . Prg

    • El primer paso consiste en inicializar elrmiregistry (similar al portmapper en RPC)rmiregistry (similar al portmapper en RPC)

  • RMI• Al proxy en el lado cliente se le llama stub,

    mientrás que en el servidor se le llamamientrás que en el servidor se le llamaskeleton.

    • Se cuenta con la primitiva invoke(objeto,método, param_entrada, param_salida);

    • Se necesita de un proceso enlazador(binder) que una a un cliente con el objeto(binder) que una a un cliente con el objetoremoto.

  • RMIimport java.rmi.*;Import java.util.Vector;

    public interface Forma extends Remote {int dameVersion() throws RemoteException;int dameVersion() throws RemoteException;GraphicObject dameTodoEstado() throwsRemoteException;

    }

  • RMIpublic interface ListaForma extends Remote {Forma nuevaForma(GraphicObject g) throwsRemoteException;

    Vector todasFormas() throwsRemoteException;RemoteException;

    int dameVersion() throws ReomteException;}}

  • RMI//Sirviente ListaFormimport java.rmi.*;import java.rmi.server.UnicastRemoteObject;import java.rmi.server.UnicastRemoteObject;Iimport java.util.Vector;public class SirvienteListaForma extendspublic class SirvienteListaForma extends

    UnicastRemoteObject implementsListaForma {ListaForma {

    private Vector laLista;private int version;

  • RMIpublic SirvienteListaForma() thorwsRemoteException {;}p {;}

    public Forma nuevaForma(GraphicObject g)thorws RemoteException {thorws RemoteException {version++;F Si i t F ( i )Forma s = new SirvienteForma(g, version);laLista.addElement(s);return s; //implementar los demás métodos

    }}}

  • RMI• Para acceder al enlazador (RMIRegistry) se

    utilizan métodos de la clase Naming,utilizando las siguiente URI:

    • rmi://nombrecompu:puerto/nombreObjetormi://nombrecompu:puerto/nombreObjeto

    Los clientes deben hacer consultas (lookup)• Los clientes deben hacer consultas (lookup)a computadoras concretas. Otros métodosson: rebind() bind() unbind() y list()son: rebind(), bind(), unbind() y list().

  • RMI//Programa servidorpublic class ServidorListaForma {public void main(String args[]){public void main(String args[]){

    System.setSecurityManager(newRMISecurityManager());RMISecurityManager());try {

    ListaForma unaListaForma = newSirvienteListaForma();

  • RMINaming.rebind(“Lista Forma”, unaListaForma);

    System out println(“Servidor de ListaFormSystem.out.println( Servidor de ListaFormListo”);} t h (E ti ) {} catch (Exception e) {System.out.println(“Error: ”

    +e.getMessage());}}

    }}}

  • RMI//Clienteimport java.rmi.*;import java.rmi.server.*;import java.rmi.server. ;import java.util.Vector;public class ClienteListaForma {public class ClienteListaForma {public static void main(String args[]) {

    System.setSecurityManager(newRMISecurityManager());ListaForma unaListaForma = null;

  • RMItry {

    unaListaForma = (ListaForma)unaListaForma (ListaForma)Naming.lookup(//jcolivares.ListaForma);

    Vector sLista =Vector sLista =unaListaForma.todasFormas();} t h(R t E ti ) {} catch(RemoteException e) {System.out.println(e.getMessage()); }catch (Exception e) { ;}}}

    }

  • RMI• El marshalling se hace en formato Big-endian.

    • Jerarquía de clases en RMI:• Object --> RemoteObject (Remote) -->

    RemoteStub, RemoteServer(U i tR t Obj t)(UnicastRemoteObject)

    El l l h l RMI l 1099• El puerto por el cual escucha el RMI es el 1099(rmi://localhost:1099/Objeto)

  • RMI• Ejemplo de archivo de política de seguridad:

    grant {permission java.net.SocketPermission“*:1024-65535”, “connect”;permission java.io.FilePermission“directorio”, “read”;permission java.security.AllPermission;

    };};

  • 3.3.4 CORBA• Common Object Request Broker Architecture

    • Es un middleware para la construcción desistemas distribuidos utilizando el paradigmade programación orientada a objetos.

    • Una de las principales ventajas de CORBAUna de las principales ventajas de CORBAes que cada uno de los componentes deCORBA se pueden implementar en una granCORBA se pueden implementar en una granvariedad de lenguajes.

  • CORBA//Ejemplo de IDL en CORBAstruct Persona {s uc e so a {

    string nombre;long año;long año;

    };interface ListaPersonas {void añadePersona(in Persona p);( p);long damePersona(in string nombre, out

    Persona p);Persona p);};

  • CORBA• CORBA maneja un modelo asíncrono de

    comunicación, aunque también se puedemanejar un esquema de polling.

    • CORBA utiliza muchas tecnologíasCORBA utiliza muchas tecnologíasestandarizadas como IOR (InteroperableObject Reference), IIOP(Internet Inter ORBObject Reference), IIOP(Internet Inter ORBProtocol), ORB (Object Request BrokerArchitecture), entre otras.Architecture), entre otras.

  • CORBA• CORBA es una arquitectura genérica, de tal

    forma que otras tecnologías de objetos comoRMI se pueden ejecutar a través de IIOP.

    • CORBA está basado en una arquitectura deCORBA está basado en una arquitectura decuatro capas con proxys en el lado cliente yservidor.servidor.

  • CORBA• Para realizar objetos remotos en Java se utiliza el

    Java IDL el cual está incluido en las diferentesJava IDL, el cual está incluido en las diferentesversiones de JDK.

    • Las interfaces de los objetos remotos se hacen através del IDL de CORBA.

    interface Produto {string getDescripcion();

    }

  • CORBA• El compilador de IDL a Java se llama idlj o

    idltojava en versiones antiguas:

    • idlj Producto.idl

    • public interface Producto extendsorg omg CORBA Objectorg.omg.CORBA.Object,org.omg.CORBA.portable.IDLEntity

  • CORBA• Los parámetros de los métodos pueden ser

    in o t ino t Los parámetros in son porin, out, inout. Los parámetros in son porvalor, out referencia, inout referencia convalor inicialvalor inicial.

    En Java no existen las referencias por lo que• En Java no existen las referencias por lo quese simulan (clases holder).

    • IDL no soporta sobrecarga de métodos.

  • CORBA• La palabra clave atrribute de IDL hace

    referencia a métodos set getreferencia a métodos set y get

    module Aplicación {interface producto {attribute string isbn;

    };};interface Almacen { …};

    };};

  • CORBA• Al ejecutar idlj Producto.idl se crean:

    • Producto.java //definición interfazProducto.java //definición interfaz• ProductoHolder.java //clase contenedor

    parametros outparametros out• ProductHelper.java // Clase auxiliar• _ProductStub.java //Stub con el ORB

  • CORBA• El mismo ILDL se puede compilar en C++

    haciendo uso de la herramienta omniORB, elcual se ejecuta: omniidl –bcxx Producto.idl

    • El cual genera:El cual genera:• Producto.hh: Producto, Producto_Helper, y

    POA ProductoPOA_Producto• ProductoSK.cc implementación

  • CORBA• Para ejecutar el servicio de nombres se corre

    el programa tnameserv (depreciado) o elorbd con el parámetro –ORBInitialPort 2809

    import org.omg. CosNaming.*;import org.omg. CosNaming. ;import org.omg.CORBA.*;public class EntCliente {public class EntCliente {public static void main(String args[]) {try {

  • CORBAORB orb = ORB.init(args, null);

    CORBA Obj torg.omg.CORBA.Object n =orb.resolve_initial_references(“NameService”));

    NamingContext contexto =NamingContextHelper.narrow(n);

    NameComponent[] ruta = { newNameComponent(“principal” “Context”) newNameComponent( principal , Context ), newNameComponent(“Objeto”, “Object”)};

  • CORBAorg.omg.CORBA.Object obj =

    contexto.resolve(ruta);Obj o = ObjHelper.narrow(obj);j j ( j)System.out.println(o.getenv(“PATH”));} catch (Exception e) {} catch (Exception e) {

    e.printStackTrace();}

    }}

  • CORBA• Para implementar servidor CORBA en java

    se debe ejecutar idlj –fall archivo.idl

    import org.omg.CosNaming.*;import org omg CORBA *;import org.omg.CORBA. ;import org.omg.PortableServer.*;public class SysPropImpl extends

    SysPropPOA {public String getProperty(String clave) {

  • CORBAreturn System.getProperty(clave);

    }}}public class ServidorPropSis {public static void main(String args[]) {public static void main(String args[]) {try {ORB orb = ORB.init(args, null);POA poaraiz = (POA)POA poaraiz (POA)

    orb.resolve_initial_references(“RootPOA”);

  • CORBApoaraiz.the_POAManager().activate();SysPropImpl impl = new SysPropImpl();org.omg.CORBA.Object ref =org.omg.CORBA.Object refpoa.raiz.servant_to_reference(impl);

    org omg CORBA Object objContDenom =org.omg.CORBA.Object objContDenom =orb.resolve_initial_references(“NameService”););

    NamingContext contexto =NamingContextHelper narrow(objContDenomNamingContextHelper.narrow(objContDenom);

  • CORBANameComponent[] ruta = { newNameComponent(“SysProp”, “Object”)};Contexto.rebind(ruta, ref);( )orb.run();} catch (Exception e) {} catch (Exception e) {e.printStackTrace(System.out);

    }}

    }

  • 3.3.5 Servicios Web• Los servicios Web van de la mano de las

    tecnologías XML.

    • XML nos sirve para estandarizar elmarshalling de los datos.marshalling de los datos.

    Utilizar la Web nos permite tener un puerto• Utilizar la Web nos permite tener un puertono bloqueando por Firewall

  • Servicios Web• Son la invocación de código remoto

    utilizando protocolos estandarizadosutilizando protocolos estandarizados.

    • En conclusión, realizan la misma función quelos sockets, RPC, RMI, Corba y demástecnologías distribuidas.

    • Se puede ver a los servicios Web como unaanalogía de un procedimiento almacenadoanalogía de un procedimiento almacenadoen una base de datos.

  • Servicios Web• Un servicio Web no es un XML RPC como

    tal, se diferencia en la forma en que trabajan.

    • Los servicios Web forman la base de laarquitectura orientada a servicios (SOA)arquitectura orientada a servicios (SOA)

    Los servicio Web utilizan generalmente el• Los servicio Web utilizan generalmente elmétodo POST de HTTP para enviar los datosde la invocación del serviciode la invocación del servicio.

  • Servicios Web• Los datos viajan envueltos en un protocolo llamado

    SOAP (Si l Obj t A P t l) h lSOAP (Simple Object Access Protcol) que hace elmarshalling de los datos.

    • Una de las principales características que tienenlos servicios Web radica en su ubicuidad ya quelos servicios Web radica en su ubicuidad, ya quepueden ser accedidos desde cualquier sitio,utilizando inclusive cualquier otro protocolo deq ptransporte SMTP, FTP, etc.

  • Servicios Web• Los servicios Web necesitan ser descritos (saber

    á t ib d l ) d lque parámetros reciben, devuelven) para poderlosutilizar en diversos clientes. Esta descripción serealiza a través de WSDL (Web Service Definitionrealiza a través de WSDL (Web Service DefinitionLanguage).

    • Generalmente esas descripciones los clientes lasconocen o bien, puede descubrirlas haciendo uso, pde UDDI (Universal Description, Discovery andIntegration).

  • Servicios Web• La UDDI no es otra cosa que un repositorio

    en donde se almacenan servicios Web quepueden ser invocados por diversos clientes.

    • Muchas empresas ofrecen servicios WebMuchas empresas ofrecen servicios Webcomo amazon, google,http://www.xmethods.comhttp://www.xmethods.com

  • Servicios Web• Ejemplo de archivo WSDL de amazon

    • operation name AuthorSearchRequest /• message= typens:AuthorSearchRequest />• message=“typens:AuthorSearchResponse”>• ….

  • Servicios WebLos tipos de datos se definen en otra parte

  • Servicios Web• Cuando se traduce a Java queda:

    public class AuthorRequest {public class AuthorRequest {public AuthorRequest(String author, String

    page String mode String tag String sortpage, String mode, String tag, String sort,String locale, String word, String price) {…}

    public String getAuthor() { }public String getAuthor() {…}public String getPage() {…} ….}

  • Servicios WebPara ejecutar el servicio se utiliza:

    AmazonSearchPort puerto = (AmazonSearchPort)((newAmazonSearchService_Impl().getAmazonSearchPort());ort());

    AuthorRequest solicitud = new AuthorRequest(name,“1” books “” “lite” “” token “” “” “”);1 , books, , lite , , token, , , );

    ProductInfo res=puerto autorSearchRequest(solicitud);puerto.autorSearchRequest(solicitud);

  • Servicios Web• Se ocupa en las versiones viejas el JWSDP

    (Java Web Service Developer Pack)

    • Se necesita un archivo config.xml

  • Servicios Web•

    • wscompile –import config xml• wscompile –import config.xml• wscompile –gen –keep config.xml

  • 3.3.6 Otras tecnologías distribuidasdistribuidas

    • Entre algunas otras tecnologías distribuidasse encuentra DCOM (Distributed Componet(Object Model) un modelo de programacióndistribuida usado por Microsoft.

    • La versión actual de DCOM recibe el nombre• La versión actual de DCOM recibe el nombrede .NET Remoting Services.

  • Otras tecnologías distribuidasg• La finalidad de DCOM es poder realizar

    módulo disponibles en lenguajes como VB yVC desde cualquier entorno.

    • Otros ejemplos de tecnologías distribuidasOtros ejemplos de tecnologías distribuidasson los agentes móviles como JADE, elcódigo móvil como los Applets, los ActiveX,código móvil como los Applets, los ActiveX,entre otros.

  • Referencias• Liberty, Jesse, Horvarth, David (200).

    Aprendiendo C++ para Linux en 21 Días.México, Prentice Hall.

    • Márquez, Francisco (1994). UnixMárquez, Francisco (1994). UnixProgramación Avanzada. Estados Unidos,Addison-Wesley.Addison Wesley.

  • Referencias• Colouris, George, Dollimore, Jean, Kindberg,

    Tim (2001). Sistemas Distribuidos Conceptosy Diseño. 3a. Edición. España, PearsonAddison-Wesley.

    • Horstmann, Cay, Cornell, Gary (2006). CoreJava 2 Volumen II CarácterísticasJava 2 Volumen II CarácterísticasAvanzadas. España, Perason Prentice Hall.

  • Referencias• Deitel, Harvey, Deitel, Paul (2004). Java

    Como Programar. Quinta Edición. México,Pearson Prentice Hall.

    • Márquez, Francisco (2004). UNIXMárquez, Francisco (2004). UNIXProgramación Avanzada. Tercera edición,México, Alfaomega Ra-Ma.México, Alfaomega Ra Ma.

  • Referencias• Froufe, Agustín, Jorge, Patricia (2004). J2ME Java

    2 Mi Editi M l d i t t i l2 Micro Edition Manual de usuario y tutorial.México, Alfaomega.

    • Firtman, Maximiliano (2004). Programación decelulares con Java Argentina MP Edicionescelulares con Java. Argentina, MP Ediciones.

    • Ruíz Diego (2005) C# La guía total del• Ruíz, Diego (2005). C# La guía total delprogramador. Argentina, MP Ediciones.

  • Referencias• Tanenbaum, Andrew (2002). Redes de

    computadoras. Cuarta edición. México,Pearson.

    • Wigley, Andy, Wheelwright, Stephen (2003).Wigley, Andy, Wheelwright, Stephen (2003).Microsoft .NET Compact Framework.Estados Unidos, Microsoft Press.Estados Unidos, Microsoft Press.

  • Referencias• Makofsky, Steve (2004). Pocket PC Network

    Programming. Estados Unidos, Addison-Wesley.

    • Wall, Kurt (2000). Programación en Linux.Wall, Kurt (2000). Programación en Linux.Perú, Prentice Hall.

    • Gregory, Kate (1999). Microsoft Visual C++6 España Prentice Hall Que6. España, Prentice-Hall Que.

  • Referencias• Tanenbaum, Andrew (1996). Sistemas

    Operativos Distribuidos. México, PrenticeHall.

    • Tanenbaum, Andrew, Van Steen, MaartenTanenbaum, Andrew, Van Steen, Maarten(2006). Distributed Systems Principles andParadigms. Estados Unidos, PearsonParadigms. Estados Unidos, PearsonPrentice Hall.

  • Referencias• Vázquez, Adolfo (2002). XML. México,

    Alfaomega Ra-Ma.

  • ¿Preguntas?¿ g