comunicação entre processos - departamento de informáticanoemi/sd-10/aula2.pdf · • connect( )...
TRANSCRIPT
![Page 1: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/1.jpg)
Comunicação entre Processos
![Page 2: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/2.jpg)
Comunicação
• memória compartilhada
• troca de mensagens – base de comunicação em sistemas
distribuídos
![Page 3: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/3.jpg)
Mensagens básicas
• send (destino, msg)
• receive (origem, mensagem)
– questões • semântica de operações • especificação de origem e destino • formato de mensagem
![Page 4: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/4.jpg)
envio síncrono e assíncrono
• envio assíncrono: execução procede imediatamente
• envio síncrono: execução só procede quando destinatário recebe msg
tempo
tempo
A
A
B
B
send (B, …)
send (B, …)
receive (A, …)
receive (A, …)
bufferização concorrência determinismo
![Page 5: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/5.jpg)
recebimento síncrono e assíncrono
• recebimento síncrono – alternativa tradicional – execução procede quando há algo a tratar – alternativa de recebimento com timeout…
![Page 6: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/6.jpg)
bloqueios
• recebimento com bloqueio leva à suspensão de uma linha de execução
• uma solução paliatica é o “polling” por mensagens
![Page 7: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/7.jpg)
alternativas ao bloqueio
• futuros: sobreposição de computação e comunicação – ligado ao conceito de RPC
• orientação a eventos - recebimento implícito
– podemos chamar de recebimento assíncrono
![Page 8: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/8.jpg)
persistência
• mensagens permanecem disponíveis independentemente do tempo de vida dos processos origem e destino; – muitas vezes sistemas com persistência
associados a modelos onde não há especificação de origem e destino
![Page 9: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/9.jpg)
• sincronização em diferentes pontos da interação origem
destino
envio e recebimento
![Page 10: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/10.jpg)
formato de mensagens
• valores com tipos – canais declarados – chamadas remotas…
• sequências de bytes – interpretação por conta do programa
• problemas de conversão de formatos – bibliotecas de conversão p/ formato padrão
![Page 11: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/11.jpg)
especificação de pares
• identificação de processos – volatilidade e especificidade de endereços
locais de processos – serviços de nomes – caixas de correio ou canais
![Page 12: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/12.jpg)
arquiteturas de sistemas
• (paradigmas, padrões, …) • necessidade de organizar a
comunicação para entender o programa distribuídos
• arquiteturas: – centralizadas: cliente-servidor – decentralizadas: p2p. filtros, ...
![Page 13: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/13.jpg)
Cliente-Servidor
• Modelo mais usado para aplicações distribuídas não paralelas;
• Um processo servidor está sempre a espera de comunicação;
• O processo cliente tem a iniciativa de começar a comunicação quando deseja algum serviço.
servidor
cliente
cliente cliente
cliente
cliente
pedido
resposta
}
![Page 14: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/14.jpg)
O Modelo Cliente-Servidor
• Funcionamento: CLIENTE 1
rede
mensagens
CLIENTE 2
SERVIDOR
iniciar Bloqueado Atendendo
requisição de cliente
(passivo)
termina serviço
Requisita serviço
Aguardando atendimento
Sendo servido
Requisita serviço
Aguardando atendimento
Sendo servido
![Page 15: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/15.jpg)
cliente-servidor
• servidores clássicos: arquivos, impressão, BD, ...
• servidor como executor de chamadas – serviços/funções: criptografa, filtra,
autentica, ... – outros: paralelismo SPMD
• divisão de papéis (cliente ou servidor) não é rígida
![Page 16: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/16.jpg)
aplicações com n camadas
• cada camada intermediária atua como cliente e servidora
• exemplo clássico: aplicações web – interface usuário – processamento – dados
![Page 17: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/17.jpg)
clientes magros e gordos
• maior processamento do lado do cliente ou do servidor? – configuração de máquinas – estado da rede
• adaptação dinâmica?
![Page 18: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/18.jpg)
modelos de servidores
• servidores iterativos • servidores concorrentes
– multiprocesso • (ou multithread)
– monoprocesso • atendimento a vários clientes “misturado” em
uma linha de execução
![Page 19: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/19.jpg)
sist. msgs p/ cliente/serv
• exemplo: tcp • protocolo construído para comunicação
entre cliente e servidor
![Page 20: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/20.jpg)
exemplo: BSD Sockets
• comunicação entre processos – API para troca de mensagens com vários protocolos – histórico: desenvolvimento de interface para TPC/IP no Unix
BSD
• idéia é manter interface de entrada e saída • O socket é identificado por um inteiro chamado
descritor do socket descritor_do_socket = socket()
![Page 21: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/21.jpg)
TCP/IP
• transferência de streams de bytes • suporte a modelos cliente-servidor • TCP/IP estabelece abstração chamada
porta – exemplo de caixa de correio!!
![Page 22: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/22.jpg)
programando com sockets
• socket para tcp: – espera uma conexão – inicia uma conexão
• socket passivo: espera por uma conexão (usado por servidores)
• socket ativo: inicia uma conexão (usado pelos clientes)
• complexidade: parâmetros que o programador pode/tem que configurar
![Page 23: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/23.jpg)
• alguns parâmetros:
– transferência de: • stream (TCP) • datagrama (UDP)
– endereço remoto: • específico (geralmente usado pelo cliente) • inespecífico (geralmente usado pelo servidor)
programando com sockets
![Page 24: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/24.jpg)
Chamadas da API socket
• socket( ) -> cria um socket usado para comunicação e retorna um descritor
• connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão com um servidor, usando o descritor do socket
• write( ) -> para enviar dados através de uma conexão TCP • read( ) -> para receber dados através de uma conexão TCP • close( ) -> para desalocar o socket. • bind( ) -> usado por servidores para especificar uma porta na qual ele irá
esperar conexões. • listen( ) -> servidores chamam o listen para colocar o socket no modo
passivo e torná-lo disponível para aceitar conexões • accept( ) -> depois que um servidor chama socket para criar um socket,
bind para especificar seu endereço e listen para colocá-lo no modo passivo, ele deve chamar o accept para pegar a primeira solicitação de conexão na fila.
![Page 25: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/25.jpg)
exemplo do uso de sockets SERVIDOR
socket
bind
listen
CLIENTE
socket
accept
connect
read
bloqueia até chegar uma conexão do cliente
dados
dados
write write
read
close
close
conexão estabelecida
![Page 26: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/26.jpg)
Código do Servidor usando o Protocolo TCP/IP
main(int argc, char *argv[]) { int sockfd, newsockfd, tam_cli, filho_pid;
struct sockaddr_in cli_addr, serv_addr; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) /* abre um socket TCP */ erro; /* Liga o processo servidor ao seu endereço local */ bzero((char *)&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(SERV_TCP_PORT); if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) erro; listen(sockfd, 5); for (;;) { newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &tam_cli); if (newsockfd <0) erro; if (( filho_pid = fork()) < 0) erro; else if (filho_pid == 0) { /* processo filho */ close(sockfd); /* fecha o socket original */ str_echo(newsockfd); /* processa a solicitação */ exit(); } close(newsockfd); /* processo pai */ }
}
⇐ servidor concorrente
![Page 27: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/27.jpg)
Código do Cliente usando o Protocolo TCP/IP
main(int argc, char *argv[]) { int sockfd;
struct sockaddr_in serv_addr; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) /* abre um socket TCP */ erro; /* Preenche a estrutura “serv_addr” com o endereço do servidor com o qual ele deseja se conectar*/ bzero((char *)&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR); serv_addr.sin_port = htons(SERV_TCP_PORT); if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) erro; str_cli(stdin, sockfd); /* envia a solicitação */ close(sockfd); exit(); }
}
![Page 28: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/28.jpg)
Endereçamento
• O socket oferece uma estrutura diferente para cada protocolo onde o programador especifica os detalhes de endereçamento – Para o protocolo TCP/IP a estrutura sockaddr_in
especifica o formato de endereço struct sockaddr_in {
u_short sin_family; /* tipo de endereço */ u_short sin_port; /* número da porta */ u_long sin_addr; /* endereço IP */ }
![Page 29: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/29.jpg)
Definindo o endereço de um servidor
struct sockaddr_in { u_short sin_family; /* tipo de endereço */ u_short sin_port; /* número da porta */ u_long sin_addr; /* endereço IP */ }
struct sockaddr_in serv_addr; bzero((char *)&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl (INADDR_ANY) serv_addr.sin_port = htons(“6644”)
![Page 30: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/30.jpg)
Portas
• mecanismo de associação a processos específicos: – o processo solicita uma porta específica
(tipicamente usado por servidores) – o sistema automaticamente atribui uma porta para
o processo (tipicamente usado por clientes) • o processo especifica porta = 0 antes de fazer a
chamada ao bind. O bind atribui uma porta automaticamente
![Page 31: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/31.jpg)
sockets em Lua
• biblioteca LuaSocket – uso de facilidades Lua para criação de interface
simplificada
– socket.tcp()
– master:bind(address, port) – master:listen(backlog)
– master:connect(address, port) – client:receive([pattern [, prefix]]) – client:send(data [, i [, j]])
![Page 32: Comunicação entre Processos - Departamento de Informáticanoemi/sd-10/aula2.pdf · • connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexão](https://reader034.vdocuments.pub/reader034/viewer/2022050221/5f66c5a5711684327b6282d3/html5/thumbnails/32.jpg)
Trabalho 1
• contrução de cliente-servidor com algumas estruturas alternativas
• análise de desempenho: – throughput – tempo médio de atendimento – tempo máximo de atendimento