Buscar

Unidade 02

Prévia do material em texto

25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 1/30
SISTEMAS DISTRIBUÍDOSSISTEMAS DISTRIBUÍDOS
COMUNICAÇÃO ENTRECOMUNICAÇÃO ENTRE
PROCESSOSPROCESSOS
Autor: Dr. S idartha Azevedo
Revisor : L izandro de Souza
I N I C I A R
1.00
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 2/30
introdução
Introdução
Caro(a) aluno(a), nesta unidade você vai aprender o que são os sockets e como
eles são utilizados na comunicação entre processos. Você vai aprender
algumas primitivas dos soquetes (do inglês, sockets), como o send() e o
receive().
Além disso, você vai ver exemplos práticos com o uso dos sockets, utilizando a
linguagem de programação Java. Ademais, para possibilitar a comunicação
correta entre os processos, é necessário entender os mecanismos de garantia
do sincronismo entre as máquinas, visto que elas se comunicam por uma
rede de dados.
Por �m, você vai entender o que é uma chamada remota de procedimento e
como esse conceito é importante nos sistemas distribuídos.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 3/30
Caro(a) aluno(a), antes de falarmos dos sockets, é importante relembrar
alguns conceitos importantes sobre os protocolos de comunicação. Os
protocolos de comunicação de�nem estratégias que devem ser seguidas para
garantir o bom funcionamento e alcance dos benefícios oferecidos pela
implementação do protocolo. A seguir, iremos falar sobre os dois principais
protocolos: Transmission Control Protocol (TCP) e User Datagram Protocol (UDP)
(COULOURIS, DOLLIMORE; KINDBERG, 2013).
O protocolo TCP é utilizado em conjunto com o Internet Protocol (IP), sendo
nomeado geralmente como TCP/IP. Esse protocolo é responsável por levar a
mensagem do emissor até o receptor e garantir que a mensagem foi entregue
de forma total. Os sistemas webs utilizam esse protocolo quando é necessário
enviar dados onde não se pode ter falta desses dados, em que a corretude é
mais importante do que a velocidade de entrega.
O protocolo TCP/IP pode dividir o dado a ser enviado (se for muito grande) em
pequenos pacotes, que são enviados de forma individual e organizados no
destino para formar a mensagem original. O TCP/IP garante que todos esses
SocketsSockets
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 4/30
pequenos pacotes irão chegar ao receptor e então serão combinados na
ordem correta.
Diversos tipos de sistemas utilizam o TCP/IP, por exemplo: acesso aos sites na
Internet, uso do e-mail, acesso ao aplicativo do banco, transferência de
arquivos, dentre outros.
Por possuir o benefício da entrega correta dos pacotes enviados e da garantia
de que todos os pacotes serão entregues, esse protocolo pode sofrer alguns
atrasos. Por exemplo, se um pacote for perdido durante o seu envio, é
necessário esperar até que seja veri�cado que ele foi perdido e então o
cliente envia uma mensagem ao servidor avisando que não recebeu
determinado pacote. Logo após, o servidor reenvia somente aquele dado
perdido e espera a con�rmação de recebimento pelo cliente (COULOURIS;
DOLLIMORE; KINDBERG, 2013).
Ainda de acordo com Coulouris, Dollimore e Kindberg (2013), o protocolo UDP
também é utilizado em conjunto com o IP. Esse protocolo caracteriza-se
principalmente por não ser orientado à conexão, ou seja, não há um vínculo
forte entre o emissor e o receptor. Vamos entender melhor com o exemplo a
seguir.
Imagine que queremos enviar uma mensagem que está dividida em cinco
pacotes. Essa divisão é necessária por restrições da rede, em que há um
tamanho máximo do pacote, e, se a mensagem ultrapassar esse limite, deve
ser quebrada em pedaços menores para obedecer ao critério. Usando o
protocolo UDP, os cinco pacotes são enviados de forma sequencial, sem a
garantia de que serão entregues ou se chegarão ao destino na ordem correta.
Pode ocorrer de haver um erro na rede ou que um determinado pacote utilize
outro caminho para chegar até o destino, podendo ser o primeiro a ser
enviado, mas o último a chegar no destino. Esse protocolo é ágil, pois não
utiliza tempo com o reenvio de pacotes ou espera da con�rmação do
destinatário dizendo que recebeu o pacote (utilizado no TCP).
As principais diferenças entre o protocolo TCP e o UDP estão ilustradas no
quadro a seguir.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 5/30
Quadro 2.1 - Comparativo entre TCP e UDP 
Fonte: Adaptado de Coulouris, Dollimore e Kindberg (2013) e Tanenbaum (2007).
Um dos principais usos do protocolo UDP é o streaming de vídeos na Internet,
em que a rapidez de chegada é mais importante do que a con�abilidade no
envio. Por exemplo, em cada segundo de vídeo temos aproximadamente 30
imagens, e, se uma dessas imagens se perder, a falha pode não ser
perceptível ao olho humano que está assistindo ao vídeo. No entanto, se o
vídeo parar e esperar que o pacote com aquela imagem chegue, é mais
prejudicial do que descartar essa imagem/pacote faltante.
A seguir, vamos entender alguns conceitos importantes sobre os sockets e as
primitivas de comunicação.
De�inição e Primitivas
TCP UDP
Con�ável, garante a entrega dos
pacotes na ordem correta.
Não con�ável, não garante a
entrega de todos os pacotes
enviados nem da ordem de
recebimento.
Orientado à conexão, mantém
uma conexão única e �xa o
tempo para envio dos pacotes.
Não é orientado à conexão, envia
os pacotes para o IP de destino e
não se compromete com um
canal de comunicação �xo.
Uso do reconhecimento do
recebimento dos pacotes,
informando ao servidor a cada
pacote que é recebido com
sucesso.
Não possui mecanismos de
reconhecimento de recebimento
dos pacotes.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 6/30
A interface sockets é utilizada para permitir a comunicação entre os sistemas
dentro da rede. Para realizar a comunicação, podemos implementar as
interfaces sockets em diversas linguagens, mas, para os nossos exemplos,
iremos utilizar a linguagem Java por motivos de facilidade de entendimento.
Primeiro, precisamos ter um servidor Java que irá responder as requisições
dos clientes. Após isso, vamos implementar o lado do cliente, que irá enviar
requisições ao servidor e aguardar a resposta.
Para haver comunicação entre os processos, também chamada de
comunicação interprocessos, faz-se necessário o uso de um mecanismo de
transporte das informações, possibilitando que o cliente acesse dados,
recursos ou serviços em um servidor remoto.
O mecanismo mais utilizado é o socket, o qual é a maneira mais e�caz de usar
as funcionalidades dos protocolos de comunicação TCP/IP. Lembre-se de que
os mecanismos dos sockets são gerenciados na camada de transporte. Para
usar os conceitos de sockets, pode-se usar interfaces de programação, por
exemplo o WinSock para o Windows ou a interface sockets do Unix.
Durante a comunicação, o socket é o ponto �nal da comunicação, por
exemplo, se um cliente deseja se comunicar com um servidor, o ponto inicial
no cliente será o socket do cliente e o ponto �nal do lado do servidor será o
socket do servidor. Cada socket possui endereço local e endereço global,
sendo: o endereço local é o número da porta que permite o tráfego de dados
na camada de transporte dentro da máquina local; e o endereço global é o
nome da máquina que armazena o socket, por exemplo o endereço IP ou
localhost.
Para identi�car uma conexão entre dois pontos, usamos a tupla <IP,PORTA>.
Imagine que um cliente de IP = 192.168.0.100 quer se comunicar com o
servidor de IP 10.5.6.88. O cliente precisa enviar uma mensagem ao sistema
operacional utilizando aAPI WinSock do Windows para ter acesso a uma porta
do sistema operacional: AbrirSocket(888), em que 888 é a porta local do
socket. Para iniciar a comunicação com o servidor, o cliente deve enviar uma
requisição contendo o IP e a porta do servidor: <10.5.6.88;566>, em que 566 é
a porta no servidor. Para receber a requisição, é necessário que o servidor
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 7/30
esteja esperando uma conexão, ou seja, esteja ouvindo a rede naquela porta
especi�ca (a 566).
A API Socket (ORACLE, 2020, on-line) possui alguns métodos padrões. Vamos
entendê-los a seguir.
Bind 
○ Associa o número da porta a um socket. 
○ Função utilizada apenas pelo servidor, uma vez que associa um
determinado endereço IP e porta TCP ou UDP para o processo
servidor. 
○ Exemplo: bind(socket, localaddr, addrlen) 
        ■ socket: socket associado para ser registrado. 
        ■ localaddr: endereço local para vincular o socket. 
        ■ addrlen: valor inteiro que determina o tamanho do endereço
em bytes.
Listen: 
○ Indica ao sistema operacional para colocar o socket em modo de
espera (passivo) para aguardar conexões de clientes. 
○ Exemplo: listen(socket, queue) 
               ■ socket: socket que �cará em modo passivo aguardando por
conexões. 
        ■ queue: tamanho máximo da �la de conexões que serão aceitas
pelo socket.
Accept: 
○Cria um novo socket a partir do estabelecimento de uma conexão
para iniciar a comunicação (leitura e escrita). 
○ Exemplo: newsock = accept(socket, addr, addrlen)
Read: 
○ Lê o conteúdo do bu�er associado ao socket. 
○ Exemplo: read(socket, bu�er, length)
Write: 
○ Escreve dados em um bu�er associado ao socket. 
○ Exemplo: write(socket, bu�er, length)
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 8/30
Close: 
○ Informa ao sistema operacional para fechar um socket. 
○ Exemplo: close(socket)
Chamada gethostbyname(endereço): 
○ Extrai o endereço IP a partir do nome de um servidor.
Chamada getprotobyname(protocolo): 
○ Extrai o código correspondente ao protocolo a partir de uma string.
A seguir, você vai aprender um pouco mais com exemplos aplicados em
sistemas do cotidiano e usando o modelo cliente-servidor.
Exemplos com Cliente e Servidor
Aluno(a), veremos que a �gura a seguir ilustra uma comunicação entre dois
elementos, um cliente e um servidor. O cliente, localizado no lado esquerdo
da �gura, possui o endereço IP = 138.37.94.248, enquanto o servidor, no
canto direito da �gura, possui o endereço IP = 138.37.88.249. Note que tanto
o cliente quanto o servidor possuem um socket, o qual é responsável por
encaminhar as mensagens (também chamados de pacotes) para a porta
reservada para a comunicação (note que tanto o cliente quanto o servidor
possuem diversas portas).
Figura 2.1 - Sockets e portas 
Fonte: Coulouris, Dollimore e Kindberg (2013, p. 149).
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&PA… 9/30
Em resumo, o processo que executa dentro da máquina cliente é responsável
por realizar o processamento, preparar a mensagem e encaminhar pelo
socket até a porta reservada; após isso, a mensagem é enviada pela rede
(podendo usar diversos meios físicos como Internet sem �o ou cabeada) e, ao
chegar na porta do servidor, é encaminhada para o socket responsável por
aquela porta que está associada a outro processo que executa dentro do
servidor reservado para tratar aquela requisição.
praticar
Vamos Praticar
Os sockets possibilitam um canal de comunicação entre computadores, permitindo
que um processo associado a uma máquina localizada em uma rede possa se
comunicar com outro processo localizado em outra máquina em uma rede
diferente.
De acordo com os conceitos sobre os sockets, qual a principal responsabilidade da
primitiva bind()?
a) Indica ao sistema operacional para colocar o socket em modo de espera (passivo) para
aguardar conexões de clientes.
b) Cria um novo socket a partir do estabelecimento de uma conexão para iniciar a comunicação
(leitura e escrita).
c) Lê o conteúdo do buffer associado ao socket.
d) Associa o número da porta a um socket.
e) Escreve dados em um buffer associado ao socket.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 10/30
Aluno(a), agora que vimos a importância, utilidade e algumas primitivas do
uso dos sockets, vamos entender melhor como é a implementação de um
sistema distribuído que utiliza sockets para se comunicar. Nos exemplos a
seguir, iremos utilizar a linguagem Java, uma das mais lembradas na
construção da comunicação por sockets para os sistemas distribuídos.
Implementação Utilizando Sockets
Para fazer uso dos sockets TCP/IP, é necessário importar as seguintes
bibliotecas na classe Java (ORACLE, 2020, on-line):
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket.
A classe do lado do servidor pode ser de�nida como o exemplo a seguir: 
SocketsSockets
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 11/30
No exemplo acima, note que primeiro criamos um objeto do tipo
ServerSocket e especi�camos a porta na qual esse processo vai se comunicar
dentro do sistema operacional. Utilizamos a porta 60000. Após isso, exibimos
uma mensagem no console da IDE de programação para avisar que o servidor
está em execução.
Lembre-se de que o servidor se mantém em execução de forma in�nita, como
vimos anteriormente. Utilizamos um laço while in�nito para possibilitar o
servidor estar sempre atento para o recebimento de novas requisições do
cliente. Ao chamar o método ouvinte.accept(), o nosso sistema estará
bloqueado até que uma nova requisição seja recebida, ou seja, não haverá
execução das linhas de código seguinte enquanto não tivermos uma
requisição (chamamos de método bloqueante).
Quando um cliente enviar uma requisição ao servidor, será utilizado o
método socket.getOutputStream() para receber o �uxo de dados que foi
enviado pelo cliente, estabelecendo o canal de comunicação e possibilitando a
troca de dados. Por �m, escrevemos no canal de comunicação a mensagem
que será enviada de volta ao cliente com o comando saida.println(), onde
saída é o nosso objeto proveniente do ouvinte.accept().
saiba mais
Saiba mais
Algumas portas são reservadas, ou seja, exclusivas para determinadas aplicações,
geralmente com números mais baixos, como os valores entre 1 e 2000. Para não
cometer um erro, sempre use portas altas, como as do exemplo a seguir. Se a
porta estiver em uso, você receberá uma mensagem de erro no momento da
execução do seu servidor. Além disso, também é possível consultar as portas em
uso utilizando o prompt de comando do Windows ou a shell do Linux (IANA,
2020).
ACESSAR
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 12/30
A seguir, está um exemplo da classe que deve executar no computador do
cliente que irá se comunicar com o servidor especi�cado logo acima.
Note que especi�camos o IP como sendo: 127.0.0.1. Esse IP corresponde à
máquina local onde está executando. No nosso exemplo, servidor e cliente
estão executando na mesma máquina.
Ao utilizar a rede aberta, é só trocar o IP pelo número correto. Lembre-se de
que a porta utilizada tanto no servidor quanto no cliente deve ser a mesma;
caso contrário, não haverá comunicação. A variável do tipo scanner contém os
métodos necessários para a leitura dos dados no canal de comunicação
criado pelo socket, utilizando o TCP/IP.
O exemplo acima é bem simples, poiso nosso servidor somente consegue
atender um cliente por vez, o que é inviável em sistemas comerciais. Para
estender o exemplo acima, iremos modi�car a classe Servidor para atender a
vários clientes de forma simultânea com o uso de threads do Java. Observe o
código Java a seguir:
Na função main do nosso servidor, de�nimos que o número máximo de
clientes aceitos de forma simultânea será de 100 clientes. Após isso, o
servidor �ca executando de forma inde�nida, esperando requisições dos
saiba mais
Saiba mais
No Java, é possível utilizar a declaração var ao invés de especi�car o tipo da
variável de forma explícita, atribuindo o tipo correto durante a execução do
código. Essa técnica permite que o programador não perca tempo com detalhes
técnicos e possa se concentrar no desenvolvimento da lógica de negócios da
aplicação (OPENJDK, 2018, on-line).
ACESSAR
https://openjdk.java.net/projects/amber/LVTIFAQ.html
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 13/30
clientes. Ao chegar uma requisição, uma nova thread é criada e o trabalho que
será feito é redirecionado para outra thread. Esse procedimento permite que
o servidor não �que bloqueado enquanto não terminar de responder ao
primeiro cliente.
Dentro da ThreadDespachante, são criadas variáveis para enviar e receber
dados (entrada e saída). Sempre que houver alguma mensagem a ser
recebida, ela é processada e enviada para a saída do canal, usando a variável
saída.
Ao �nal da ThreadDespachante, é preciso fechar a comunicação que foi
aberta para poder liberar os recursos que estão sendo utilizados para manter
o canal de comunicação com o cliente. Se esse procedimento de socket.close()
não for realizado, chegará um momento em que não será mais possível
receber pedidos, pois todos os recursos do servidor estarão ocupados com
canais ociosos, sem uso.
praticar
Vamos Praticar
A sincronização é um problema recorrente aos sistemas distribuídos, alvo de
diversas pesquisas em todo o mundo. Dado esse problema da não sincronização
nos sistemas distribuídos, é necessário que haja ações para que se garanta a
possibilidade de comunicação entre os computadores da rede mesmo em situações
adversas. Para que o servidor possa receber uma requisição de um cliente, é
necessário que:
a) Utilize o modelo cliente-servidor.
b) Use a API sockets para Windows.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 14/30
c) Use threads masters em cada requisição.
d) Implemente um loop infinito para poder receber a requisição que vai chegar do cliente.
e) Use a arquitetura peer-to-peer para possibilitar o uso da API sockets.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 15/30
Estudante, antes de falarmos da sincronização em sistemas distribuídos, é
necessário entender melhor os conceitos relacionados a seguir. Os relógios
físicos nos computadores são usados para sincronizar a comunicação entre
os componentes e utilizam um cristal que oscila a uma frequência constante
sob certa tensão. Cada conjunto de ciclos é convertido para software e
atualiza o relógio relativo da máquina. Essas marcações estão suscetíveis a
atrasos com o passar do tempo, sendo necessário haver ajustes de tempos
em tempos.
Quando se realiza a comunicação em sistemas distribuídos, cada sistema
individual possui seu relógio e o utiliza para marcar a troca de mensagens. A
partir do momento em que não utilizam o mesmo tempo para se
comunicarem, há problemas de sincronismo. Um exemplo de problema é a
compilação por meio do comando MAKE no sistema operacional Linux: o
comando MAKE lê todos os arquivos fontes (.c) e os arquivos objetos (.o). Se o
arquivo (.o) for mais velho que o arquivo (.c), não será preciso recompilar o
código (TANENBAUM, 2007).
Sincronização e Coordenação emSincronização e Coordenação em
Sistemas DistribuídosSistemas Distribuídos
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 16/30
Veja o exemplo: uma máquina compila o arquivo fonte localmente no tempo
2144; após isso, uma outra máquina, com um tempo diferente, faz uma
alteração no arquivo fonte e registra a alteração com tempo 2143. Ao
executar o comando MAKE, ele verá que o arquivo objeto é mais velho que o
fonte, logo, já foi compilado e não precisará ser feito novamente, o que é um
erro grave. 
Uma forma de sincronizar os relógios é fazendo uso do Universal Coordinated
Time (UTC) em todas as máquinas do sistema distribuído. Uma abordagem é
que todas as máquinas da rede devem consultar um servidor único, chamado
de servidor de tempo que possui acesso ao WWV (uma estação que informa o
tempo de forma precisa). Porém, o tempo do atraso da comunicação acaba
fazendo com que o tempo consultado já esteja desatualizado quando
retornado ao servidor de tempo. Além disso, o problema é agravado se
houver deslocamentos de tempo. As máquinas não precisam conhecer
exatamente o tempo “correto”, desde que utilizem a mesma sequência
cronológica.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 17/30
Outra abordagem é fazer o uso de estratos, em que algumas máquinas
possuem seus relógios atualizados e as máquinas com estratos mais baixos
devem atualizar seus relógios de acordo com as máquinas de estrato mais
alto. Nessa abordagem, deve-se atentar ao problema de nunca atrasar os
relógios, sempre os adiantando para não gerar alguns dos problemas vistos
anteriormente.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 18/30
A seguir, você vai entender mais sobre alguns algoritmos que auxiliam na
garantia de sincronismos entre as máquinas nos sistemas distribuídos.
De�inição e Exemplos
Algoritmo de Berkeley: na ausência de WWV, um daemon periodicamente
consulta as máquinas, faz a média dos tempos e sugere que a máquina
adiante ou atrase seus relógios. Não é essencial que esteja com a hora real
exata, mas que trabalhe com o mesmo tempo.
Sincronização em redes sem �o: esse tipo de estrutura sofre com grandes
atrasos na comunicação e alto consumo de energia, por conta da
comunicação. Nessa abordagem, não há nós sensores que são usados como
servidores de tempo, e o tempo real não é tão importante, mas a
sincronização é essencial. Além disso, a sincronização em broadcast por
referência é feita através de nós que enviam seus tempos em broadcast,
calculam as distâncias entre os nós, estimam o valor do tempo gasto na
comunicação e atualizam o relógio.
Relógios lógicos: nesse tipo de abordagem, o tempo real não é crucial. São
criados relógios lógicos que garantem a ordem correta das execuções,
embora não possuam a hora real. Uma das principais abordagens de relógios
lógicos é a proposta por Lamport.
Algoritmo de Lamport: é mais importante a ordem dos eventos do que a
sincronização com o tempo real. Os sistemas devem apresentar uma
concordância nas ordens das execuções, embora não possuam atualização do
tempo real. Lamport de�niu que os sistemas devem concordar na ordem de
execução das operações, se a → b, “a” acontece antes de “b” e b → c, então a
→ c.
O algoritmo corrige o tempo da mensagem e aumenta em 1 ciclo de clock
quando essa mensagem chega ao destinatário que tem um tempo anterior ao
da mensagem. Exemplo: P1, P2 e P3 são máquinas que possuem seus
relógios distintos. Segundo as regras de transição de Lamport, se uma
mensagem sai de P3 com tempo 60 e chega no P2, onde esse tem tempo 48,
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 19/30
não é aceitável. O tempo deve ser maior que 60, então o algoritmoajusta o
relógio de P2 de acordo com o tempo de P3+1.
praticar
Vamos Praticar
Os sistemas distribuídos se comunicam através da rede de dados e, muitas vezes,
não se conhecem. Para prover uma comunicação correta, é necessário que eles
utilizem protocolos bem de�nidos (geralmente públicos) e que possuam
mecanismos de sincronização de dados e de protocolos. Em relação à sincronização
em sistemas distribuídos, assinale a alternativa correta.
a) Os sistemas distribuídos devem utilizar sempre o tempo exato em relação aos homens.
b) Os sistemas distribuídos devem utilizar sockets para sincronizar os tempos.
c) O tempo nos relógios dos sistemas distribuídos são definidos na fabricação dos componentes.
d) Os relógios dos sistemas distribuídos devem compartilhar o mesmo tempo.
e) Deve-se utilizar um servidor WWV para roteador as mensagens pelos sockets.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 20/30
Nesta seção, você vai aprender sobre as chamadas remotas de procedimento.
De forma resumida, é o procedimento de invocar um método de forma
remota, ou seja, um cliente chama um método em um servidor usando a
rede. Porém, lembre-se de que a chamada remota de procedimentos não se
restringe ao uso da arquitetura cliente-servidor.
De�inição e Exemplos
Antes de falarmos de invocação remota, vamos relembrar como acontece
uma invocação de método de forma local, em um programa qualquer. Na
chamada de procedimento convencional, há a passagem por valor ou
referência da variável. Veja um exemplo da invocação do método read():
read(fd, buf, nbytes), onde fd é um inteiro que indica um arquivo, buf é o
vetor onde os dados são lidos e o nbytes informa quantos bytes devem ser
lidos.
A ideia da chamada remota de procedimento é fazer com que uma chamada
remota seja o mais perto possível de uma chamada local. Ou seja, deve-se
Chamada Remota deChamada Remota de
Procedimento (RPC)Procedimento (RPC)
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 21/30
abstrair a informação de chamada remota para o invocador do método. Em
um sistema local, a chamada read() pede que o sistema operacional lhe
forneça dados. Já na chamada remota, o read() é substituído por uma
extensão da função, que, ao invés de pedir os dados ao sistema operacional,
pede que envie a mensagem empacotada pela função, usando a rede.
Dando continuidade, geralmente após fazer uso do método read() se usa o
método receive(), que é bloqueante. O método receive() é usado para captar
os dados que estão sendo enviados para um determinado processo. As
chamadas são convertidas em chamadas locais no servidor e tudo é
transparente, tanto para o cliente quanto para o servidor. A versão
modi�cada do read() é chamada de apêndice de cliente e apêndice de
servidor. Veja um exemplo a seguir.
A �gura anterior ilustra um exemplo de uma chamada remota a partir de um
cliente para um servidor. Primeiro, o processo cliente está fazendo algum
processamento e necessita requisitar uma funcionalidade (método) presente
em um servidor, localizado �sicamente distante do requisitante. Dentro do
código do cliente, há abstrações para que o programador não perceba que
está invocando um método remoto, sendo a chamada remota similar a uma
chamada de um método local. Após isso, um pacote é enviado pela rede com
a requisição para o servidor. Esse recebe e processa a mensagem, executa o
procedimento desejado pelo cliente e então retorna a resposta (saída do
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 22/30
método) para o cliente, �nalizando a interação. Em complemento, chamada
remota de procedimento é uma forma genérica de descrever a troca de
mensagens entre processos em sistemas distribuídos.
Arquitetura
A arquitetura de uma chamada remota de procedimento de�ne como deve
ocorrer a comunicação e de�ne os principais elementos que compõem essa
chamada. A �gura a seguir ilustra uma arquitetura geral para a chamada
remota de procedimentos.
A chamada remota de procedimentos geralmente segue a sequência a seguir:
1. A aplicação cliente necessita de alguma informação/processamento a
ser realizada fora da máquina local.
2. A necessidade é convertida em uma requisição que é empacotada
em uma mensagem que vai ser transferida pela rede.
3. A mensagem é enviada pela rede e transportada até o destino.
4. A camada de transporte no servidor é responsável por receber a
mensagem e encaminhar para o processo adequado, referenciado
pelo <IP e porta>.
5. A mensagem é traduzida para entidades locais do servidor (por
exemplo, classes Java).
Figura 2.4 - Arquitetura geral para chamada remota de procedimentos 
Fonte: Microsoft (2018, on-line).
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 23/30
6. A mensagem é entregue ao processo responsável por realizar a
requisição.
7. A resposta do servidor passa pelas etapas de conversão,
empacotamento e envio pela rede.
8. A resposta é recebida pelo servidor, convertida e entregue ao
processo cliente.
praticar
Vamos Praticar
A chamada remota de procedimentos é uma atividade comum no desenvolvimento
e uso de sistemas distribuídos. A chamada remota permite que processos locais
acessem funcionalidades ou dados em máquinas diferentes, geralmente usando
uma rede de dados, como a Internet.
Sobre as chamadas remotas de procedimento, assinale a alternativa correta.
a) A chamada remota de procedimento sempre irá retornar a resposta que o cliente deseja.
b) A arquitetura de chamada remota de procedimentos sempre é baseada na arquitetura cliente-
servidor.
c) Não há distinção entre a arquitetura cliente-servidor e chamada remota de procedimentos.
d) A chamada remota de procedimento sempre irá retornar uma resposta.
e) O envio da requisição remota deve usar o protocolo UDP.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 24/30
indicações
Material Complementar
LIVRO
Sistemas distribuídos: conceitos e projeto
George Coulouris, Jean Dollimore e Tim Kindberg
Editora: Bookman
ISBN: 0321263545
Comentário: No material indicado, você vai aprender
sobre o algoritmo de Lamport, o qual descreve como
deve ser feita a comunicação entre dois sistemas
distribuídos para permitir o sincronismo correto entre
as partes comunicantes. Mais informações podem ser
consultadas na p. 608 do livro de Coulouris, Dollimore e
Kindberg.
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 25/30
FILME
Blade Runner (The Final Cut)
Ano: 2007
Comentário: Esse �lme vai lhe ajudar a entender a
complexidade que existe em manter a comunicação
entre diversos sistemas em tempo real, sendo essa
di�culdade comum aos sistemas distribuídos. Além
disso, você vai perceber como era a tecnologia
concebida anos atrás e a que temos hoje, as
semelhanças e diferenças.
T R A I L E R
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 26/30
conclusão
Conclusão
Nesta unidade, você analisou os conceitos básicos sobre os sockets e
aprendeu que há duas primitivas principais: o send() e o receive(), usados
para enviar e receber dados, permitindo que processos distintos se
comuniquem utilizando uma rede de dados.
Também foi visto um exemplo de código em Java ilustrando a comunicação
entre dois processos: um cliente e um servidor, usando sockets. E como um
servidor pode tratar diversas requisições de diferentes clientes usando
threads. Além disso, entendemos como funciona o sincronismo de relógios
nos sistemas distribuídos, necessário para a comunicação. Por�m, foi
exempli�cado o que é uma chamada remota de procedimento e como ela
pode ser usada de forma transparente para os programadores em sistemas
distribuídos.
referências
Referências Bibliográ�cas
BLADE RUNNER (The Final Cut) (Legendado).   2017. 1 vídeo (117 min.).
Disponível em: https://www.youtube.com/watch?v=pgqcLyZeA8U. Acesso em:
22 jan. 2020.
https://www.youtube.com/watch?v=pgqcLyZeA8U
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 27/30
COULOURIS, G.; DOLLIMORE, J.; KINDBERG, T. Sistemas distribuídos:
conceitos e projeto [recurso eletrônico, Minha Biblioteca]. São Paulo,
Bookman, 2013.
IANA. Service Name and Transport Protocol Port Number Registry, 17 jan.
2020. Disponível em: https://www.iana.org/assignments/service-names-port-
numbers/service-names-port-numbers.xhtml. Acesso em: 21 jan. 2020.
MICROSOFT. How RPC Works, 30 maio 2018. Disponível em:
https://docs.microsoft.com/en-us/windows/win32/rpc/how-rpc-works. Acesso
em: 21 jan. 2020.
NIST. Radio Station WWV, 15 nov. 2019. Disponível em:
https://www.nist.gov/pml/time-and-frequency-division/radio-stations/wwv.
Acesso em: 21 jan. 2020.
OPENJDK. Local variables, 2018. Disponível em:
https://openjdk.java.net/projects/amber/LVTIFAQ.html. Acesso em: 21 jan.
2020.
ORACLE. Java: Class Socket. Disponível em:
https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html. Acesso em:
21 jan. 2020.
TANENBAUM, A. S. Sistemas distribuídos: princípios e práticas [recurso
eletrônico, Biblioteca Virtual]. São Paulo: Pearson Prentice Hall, 2007.
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
https://docs.microsoft.com/en-us/windows/win32/rpc/how-rpc-works
https://www.nist.gov/pml/time-and-frequency-division/radio-stations/wwv
https://openjdk.java.net/projects/amber/LVTIFAQ.html
https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 28/30
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 29/30
25/05/2021 Ead.br
https://unp.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_704931_1&P… 30/30

Outros materiais