Você está na página 1de 32

Comunicao entre Processos

Comunicao
memria compartilhada troca de mensagens
base de comunicao em sistemas distribudos

Mensagens bsicas
send (destino, msg) receive (origem, mensagem)
questes
semntica de operaes especificao de origem e destino formato de mensagem

envio sncrono e assncrono


envio assncrono: execuo procede imediatamente
tempo

B A send (B, ) receive (A, )

bufferizao concorrncia determinismo

envio sncrono: execuo s procede quando destinatrio recebe msg


tempo

send (B, ) receive (A, )

recebimento sncrono e assncrono


recebimento sncrono
alternativa tradicional execuo procede quando h algo a tratar alternativa de recebimento com timeout

bloqueios
recebimento com bloqueio leva suspenso de uma linha de execuo

uma soluo paliatica o polling por mensagens

alternativas ao bloqueio
futuros: sobreposio de computao e comunicao
ligado ao conceito de RPC

orientao a eventos - recebimento implcito


podemos chamar de recebimento assncrono

persistncia
mensagens permanecem disponveis independentemente do tempo de vida dos processos origem e destino;
muitas vezes sistemas com persistncia associados a modelos onde no h especificao de origem e destino

envio e recebimento
sincronizao em diferentes pontos da interao
origem

destino

formato de mensagens
valores com tipos
canais declarados chamadas remotas

sequncias de bytes
interpretao por conta do programa

problemas de converso de formatos


bibliotecas de converso p/ formato padro

especicao de pares
identificao de processos
volatilidade e especificidade de endereos locais de processos servios de nomes caixas de correio ou canais

arquiteturas de sistemas
(paradigmas, padres, ) necessidade de organizar a comunicao para entender o programa distribudos arquiteturas:
centralizadas: cliente-servidor decentralizadas: p2p. filtros, ...

Cliente-Servidor
Modelo mais usado para aplicaes distribudas no paralelas; Um processo servidor est sempre a espera de comunicao; O processo cliente tem a iniciativa de comear a comunicao quando deseja algum servio.

cliente

pedido resposta servidor

cliente

cliente

cliente

cliente

O Modelo ClienteServidor
CLIENTE 1

Funcionamento:
SERVIDOR (passivo)
requisio de cliente Bloqueado termina servio Atendendo iniciar

Requisita servio Aguardando atendimento

mensagens

Sendo servido

Requisita servio Aguardando atendimento

rede CLIENTE 2

Sendo servido

cliente-servidor
servidores clssicos: arquivos, impresso, BD, ... servidor como executor de chamadas
servios/funes: criptografa, filtra, autentica, ... outros: paralelismo SPMD

diviso de papis (cliente ou servidor) no rgida

aplicaes com n camadas


cada camada intermediria atua como cliente e servidora exemplo clssico: aplicaes web
interface usurio processamento dados

clientes magros e gordos


maior processamento do lado do cliente ou do servidor?
configurao de mquinas estado da rede

adaptao dinmica?

modelos de servidores
servidores iterativos servidores concorrentes
multiprocesso
(ou multithread)

monoprocesso
atendimento a vrios clientes misturado em uma linha de execuo

sist. msgs p/ cliente/serv


exemplo: tcp protocolo construdo para comunicao entre cliente e servidor

exemplo: BSD Sockets


comunicao entre processos
API para troca de mensagens com vrios protocolos histrico: desenvolvimento de interface para TPC/IP no Unix BSD

idia manter interface de entrada e sada O socket identificado por um inteiro chamado descritor do socket descritor_do_socket = socket()

TCP/IP
transferncia de streams de bytes suporte a modelos cliente-servidor TCP/IP estabelece abstrao chamada porta
exemplo de caixa de correio!!

programando com sockets


socket para tcp:
espera uma conexo inicia uma conexo

socket passivo: espera por uma conexo (usado por servidores) socket ativo: inicia uma conexo (usado pelos clientes) complexidade: parmetros que o programador pode/tem que configurar

programando com sockets


alguns parmetros:
transferncia de:
stream (TCP) datagrama (UDP)

endereo remoto:
especfico (geralmente usado pelo cliente) inespecfico (geralmente usado pelo servidor)

Chamadas da API socket


socket( ) -> cria um socket usado para comunicao e retorna um descritor connect( ) -> depois de criar um socket um cliente chama connect para estabelecer uma conexo com um servidor, usando o descritor do socket write( ) -> para enviar dados atravs de uma conexo TCP read( ) -> para receber dados atravs de uma conexo TCP close( ) -> para desalocar o socket. bind( ) -> usado por servidores para especificar uma porta na qual ele ir esperar conexes. listen( ) -> servidores chamam o listen para colocar o socket no modo passivo e torn-lo disponvel para aceitar conexes accept( ) -> depois que um servidor chama socket para criar um socket, bind para especificar seu endereo e listen para coloc-lo no modo passivo, ele deve chamar o accept para pegar a primeira solicitao de conexo na fila.

exemplo do uso de sockets


SERVIDOR socket bind listen accept bloqueia at chegar uma conexo do cliente read write close dados conexo estabelecida dados write read CLIENTE socket connect

close

Cdigo 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 endereo 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; servidor if (( filho_pid = fork()) < 0) erro; else if (filho_pid == 0) { /* processo filho */ close(sockfd); /* fecha o socket original */ str_echo(newsockfd); /* processa a solicitao */ exit(); } close(newsockfd); /* processo pai */ } }

concorrente

Cdigo 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 endereo 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 solicitao */ close(sockfd); exit(); } }

Endereamento
O socket oferece uma estrutura diferente para cada protocolo onde o programador especifica os detalhes de endereamento
Para o protocolo TCP/IP a estrutura sockaddr_in especifica o formato de endereo struct sockaddr_in { u_short sin_family; /* tipo de endereo */ u_short sin_port; /* nmero da porta */ u_long sin_addr; /* endereo IP */ }

Denindo o endereo de um servidor


struct sockaddr_in { u_short sin_family; /* tipo de endereo */ u_short sin_port; /* nmero da porta */ u_long sin_addr; /* endereo 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)

Portas
mecanismo de especficos: associao a processos

o processo solicita uma porta especfica (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

sockets em Lua
biblioteca LuaSocket
uso de facilidades Lua para criao 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]])

Trabalho 1
contruo de cliente-servidor com algumas estruturas alternativas anlise de desempenho:
throughput tempo mdio de atendimento tempo mximo de atendimento

Você também pode gostar