Escolar Documentos
Profissional Documentos
Cultura Documentos
CAPÍTULO 4 – COMUNICAÇÃO
Slides cedidos pela professora Aline
Nascimento e do livro texto
COMUNICAÇÃO ENTRE PROCESSOS
Fundamentos
Comunicação Multicast
COMUNICAÇÃO ENTRE PROCESSOS
Soma de verificação
Transmissão confiável
Orientado a Conexão
Sem conexão
Comunicação Persistente
Comunicação Transiente
Comunicação Síncrona
Desvantagens
Principais dificuldades:
Qualquer uma das duas máquinas pode falhar e cada uma das
possíveis falhas causa problemas diferentes
count = read(fd,buf,nbytes)
Onde:
fd é um inteiro
para um arquivo
buf é um vetor
de caracteres
nbytes um inteiro
que informa quantos
bytes devem ser lidos
CHAMADA DE PROCEDIMENTO
CONVENCIONAL
Por Valor
Por Referência
Stub do cliente
Stub do servidor
CHAMADA DE PROCEDIMENTO REMOTO
Stub do cliente
Stub do servidor
STUB DO CLIENTE
STUB DO SERVIDOR
class DBList:
def append(self, data):
self.value = self.value + [data]
return self
class Client:
def append(self, data, dbList):
msglst = (APPEND, data, dbList) # message payload
self.chan.sendTo(self.server, msglst) # send msg to server
msgrcv = self.chan.recvFrom(self.server) # wait for response
return msgrcv[1] # pass it to caller
class Server:
def append(self, data, dbList):
return dbList.append(data)
def run(self):
while True:
msgreq = self.chan.recvFromAny() # wait for any request
client = msgreq[0] # see who is the caller
msgrpc = msgreq[1] # fetch call & parameters
if APPEND == msgrpc[0]: # check what is being requested
result = self.append(msgrpc[1], msgrpc[2]) # do local call
self.chan.sendTo([client],result) # return response
RPC – PASSAGEM DE PARÂMETROS
import channel, pickle
class Client:
def append(self, data, dbList):
msglst = (APPEND, data, dbList) # message payload
msgsnd = pickle.dumps(msglst) # wrap call
self.chan.sendTo(self.server, msgsnd) # send request to server
msgrcv = self.chan.recvFrom(self.server) # wait for response
retval = pickle.loads(msgrcv[1]) # unwrap return value
return retval # pass it to caller
class Server:
def run(self):
while True:
msgreq = self.chan.recvFromAny() # wait for any request
client = msgreq[0] # see who is the caller
msgrpc = pickle.loads(msgreq[1]) # unwrap the call
if APPEND == msgrpc[0]: # check what is being requested
result = self.append(msgrpc[1], msgrpc[2]) # do local call
msgres = pickle.dumps(result) # wrap the result
self.chan.sendTo([client],msgres) # send response
RPC – PASSAGEM DE PARÂMETROS -
VALOR
Problemas:
Ordenação de bytes
RPC – PASSAGEM DE PARÂMETROS -
REFERÊNCIA
Solução:
Copiar o vetor para a mensagem e enviar ao servidor
O stub do servidor pode chamar o servidor com um ponteiro para
este vetor
Modificação feita pelo servidor é armazenada diretamente no vetor
que está no stub
Ao enviar o vetor de volta ao stub do cliente, o vetor é copiado de
volta ao cliente
Se os stubs souberem se o buffer é um parâmetro de entrada ou
um parâmetro de saída, uma das cópias pode ser eliminada
CHAMADA DE PROCEDIMENTO REMOTO
Resumindo: