Comunicação
Parte I
• A maior parte destas notas de aula são baseadas nos slides do professor Dr. Ying Lu, da Disciplina de Sistemas Operacionais Distribuídos (CSCE455/855), do Departamento de Ciência da Computação e Engenharia, da Universidade de Nebraska Lincoln. • Os slides originais foram traduzidos do inglês para porguês, com algumas modificações e incrementos, em alguns casos.
Créditos:
Protocolos em Camadas (1)
Protcolos de Middleware
Um modelo de referência adaptado para
comunicação em rede.
●
Assuma que você esteja desenvolvendo uma
aplicação clienteservidor:
■ Como possibilitar a comunição dos dois processos (cliente e servidor) localizados em duas máquinas, comunicaremse entre si? ◆ Programação socket: utilizando funções como connect(sd, (struct sockaddr *)&sin, sizeof(sin)), write(sd, buf, strlen(buf)), etc.Comunicação ClienteServidor
Chamada Remota de Procedimento (RPC)
• Evitar a troca explicita de mensagens entre processos • A idéia básica é permitir um processo em um máquina chamar procedimentos em uma máquina remota – Fazer uma chamada remota parecer uma chamda local • Artigo original sobre RPC: – A. Birrell, B Nelson, “Implementing Remote Procedure Calls”, ACM Symposium on Operating System Principles, 1984Chamada Convencional de Procedimtno
(a) Passagem de parâmetro em um procedimento local: a pilha antes da chamada para leitura. (b) A pilha enquanto a chamada
Stubs Cliente e Servidor
Passos de uma RPC
1. O procedimento do cliente chama o stub do cliente de maneira normal 2. O stub do cliente constrói a mensagem e chama o SO local 3. O SO do cliente envia a mensagem para o SO remoto 4. O SO remoto repassa a mensagem para o stub do servidor 5. O stub do servidor desempacota os parâmetros e chamda o servidor 6. O servidor realiza o trabalho e retorna o resultado ao stub 7. O stub do servidor empacota os dados em uma mensagem e chama o SO local 8. O SO do servidor envia a mensagem para o SO do cliente 9. O SO do cliente entrega a mensagem para o stub do cliente 10. O stub desempacota o resultado e retorna para o clientePassando Parâmetros por Valor (1)
Passos envolvidos na computação remota através de RPC 28
Passando Parâmetros por Valor (3)
a) Mensagem original em um Pentium
Passando Parâmetros por Valor (3)
a) Mensagem original em um Pentium
b) Mensagem após recebida em um SPARC
c) A mensagem após ser invertida. O números pequenos nas caixas indicam o endereço de cada byte.
Passando Parâmetros por Referência
– Exemplo: call foo( int, int * ) or read(fd, buf, nbytes) – Chamada por copia/restauração – O arcaico “problema do ponteiro” • Lista lincada • Grafo complexo a b a’ b’foo(a, &b ) Call foo(a, &b’ )
Copy value a and contents of loc b
into a’ and loc b’
Return Copy contents of loc b’
into b
Marshalling
Valores precisam passar pela rede
Os formatos de máquina diferem
– Ordem de byte inteiro • littleendian ou bigendian – Formato de ponto flutuante • IEEE 754 ou nãoMarshalling
− transferindo estruturas de dados utilizadas em chamadas de procedimento remoto de um espaço de endereçamento para outro. Definição de um “formato de rede”, por exemplo, seguindo o padrão XDR (eXternal Data Representation)RPC: o mecanismo básico
Client routines Client stub RPC runtime Network routinesSource: R. Stevens, Unix Network Programming (IPC) Vol 2, 1998 Server routines Server stub RPC runtime Network routines Process
kernel Processkernel
Client process Server process • O cliente chamda um
procedimento local no stub cliente • O stub do cliente atua como um
proxy e marshalls a chamada e os argumentos.
• O stub cliente envia os dados para o sistema remoto (via TCP/UDP) • O stub do servidor unmarshalls a
chamada e os argumentos do cliente
• O stub do servidor chama o real procedimento no servidor
• O stub do servidor marshalls a resposta e envia ela de volta para o cliente 1 2 3 4 5 6
Exemplo 1: interface do servidor de relógio
struct time { int seconds; int minutes; int hours; int day; int month; int year; char timezone[4]; }int gettime(t); struct time *t; int settime(t); struct time *t;
Exemplo 1: stub cliente para settime
int settime(t); struct time *t; { char *p, message[32]; int stat; p = message; p = put_int(p, SETTIME); p = put_int(p, t>seconds); p = put_int(p, t>minutes); p = put_int(p, t>hours); p = put_int(p, t>day); p = put_int(p, t>month); p = put_int(p, t>year); p = put_string(p, t>timezone, 4); stat = do_operation(“time_server”, message, 32); if(stat == SUCCESS) get_int(message, &stat); return(stat); }
Exemplo 1: stub servidor (1)
void main_loop() { char *p, message[32]; int len, op_code; struct time t; for(;;) { len = receive_request(message, 32); if(len < 4) { /* error handling code */ } p = message; p = get_int(p, op_code); switch(op_code) { case SETTIME: if (len < 32) { /* error handling code */ } p = get_int(p, &t.seconds); p = get_int(p, &t.minutes); p = get_int(p, &t.hours); p = get_int(p, &t.day); p = get_int(p, &t.month); p = get_int(p, &t.year); p = get_string(p, &t.timezone, 4); len = settime(&t); put_int(message, len); len = 4; break; case GETTIME: /* code for unmarshalling and calling gettime */ } send_reply(message, len); } }Escrevendo um cliente
e um servidor (1)
Passos na escrita de um cliente e um servidor em
DCE RPC.
Escrevendo um cliente e um servidor (2)
Três arquivos de saída pelo compilador IDL:
✔Um arquivo de cabeçalho (ex.:
interface.h, em termos C)
✔O stub do cliente
✔O stub do servidor
Referenciando um cliente a um servidor (1)
•
O registro de um servidor torna possível ao
cliente localizar o servidor e criar uma
referência para ele.
•
A localização do servidor é realizada em
dois passos:
1.Localizar o nome da máquina do servidor. 2.Localizar o servidor na máquina.Binding a Client to a Server (2)
Exemplo: escrevendo um cliente e um servidor (1)
/* interface.x */
/* Example Interface Definition */
struct square_in { long arg; }; struct square_out { long result; }; program SQUARE_PROG { version SQUARE_VERS {
square_out SQUAREPROC( square_in ) = 1; /* Procedure number = 1 */ } = 1; /* Version number = 1 */
} = 0x31230000; /* program number */
Source: R. Stevens, Unix Network Programming (IPC) Vol 2, 1998
Exemplo: escrevendo um cliente e um servidor (2)
interface.x rpcgen
interface.h Client Main interface_clnt.c
(client stub) interface_xdr.c interface_svc.c (Server stub) Server.c Runtime lib Client Server
Source: R. Stevens, Unix Network Programming (IPC) Vol 2, 1998
Exemplo: escrevendo um cliente e um servidor
(mais em “UNIX Network Programming”)
●UNIX Network Programming, Volume 2, Second
Edition: Interprocess Communications, Prentice
Hall, 1999, ISBN 0130810819.
http://www.kohala.com/start/unpv22e/unpv22e.html
RPC assíncrona (1)
a) A interconexão entre um cliente e um servidor com RPC tradicional
b) A interação utilizando RPC assíncrona 212
RPC assíncrona (2)
Um cliente e um servidor interagindo através de duas RPCs assíncronas
LPC versus RPC
•
LPC: Local Procedure Call
•
RPC: Remote Procedure Call
•
Variáveis globais
•
Cliente e servidor falham independentemente
– RPC: requer código para lidar com as falhas do servidorQuando as coisas dão errado
• Semântica das chamadas remotas de procediemntos – Chamda local de procedimento: exatamente uma vez • Quantas vezes uma chamada remota de procedimento pode ser invocada? • Uma RPC pode ser chamada: – 0 vezes: o servidor para ou o processo servidor morre antes de executar o código do servidor – 1 vez: tudo funcionou corretamente – 1 ou mais vezes: excesso de latência ou perda da responsa do servidor e consequente retransmissão do cliente • Exatamente uma única vez pode ser difícil de atingir com RPCSemânticas RPC
•
A maioria dos sistemas RPC irá oferecer:
– semântica chamada ao menos uma única vez – ou semântica chamada no máximo uma vez•
Compreendendo a aplicação:
– Ilustre algumas aplicações que são “ao menos uma vez” adequadas? – Ilustre algumas aplicações que são “no máximo uma vez” adequadas?– funções idempotent: podem ser executadas