O documento discute modelos para projeto de sistemas distribuídos, incluindo modelos físicos, arquiteturais e fundamentais. Os modelos físicos descrevem as gerações de sistemas distribuídos e hardware envolvido. Os modelos arquiteturais discutem entidades de software, paradigmas de comunicação e estilos arquiteturais. Os modelos fundamentais abordam estratégias para coordenação, segurança e dependabilidade.
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
Capítulo 2 - Sistemas Distribuídos - Coulouris
1. 1
SMD0050 - SISTEMAS
DISTRIBUÍDOS
- Capítulo 2
•Prof. Dr. Windson Viana de Carvalho
•Créditos : 64h
•Prática e Teórica
2. 2
Modelagem e projeto de um sistema
distribuído
• Muitos desafios a serem suplantados
• Projetar um SD em três perspectivas
• Modelos Físicos
• Hardware envolvido (rede e dispositivos)
• Modelos Arquiteturais
• Camadas de software e distribuição entre as entidades
envolvidas
• Modelos Fundamentais
• Quais estratégias serão utilizadas para garantir a
coordenação, a segurança e dependabilidade do sistema
distribuído?
3. 3
Modelos Físicos
• Três Gerações de Sistemas distribuídos
• Fase I : Acesso Remoto e Compartilhamento de
recursos
• Fase II: Sistemas baseados na Internet
• Fase III: Sistemas contemporâneos em larga
escala com grande heterogeneidade de acesso
• Sistema de Terceira Geração podem ser
vistos como Sistemas de Sistemas ou
Sistemas Complexos
5. 5
Modelos Arquiteturais
• Organização ou estrutura que responde às
seguintes questões
• Quais são entidades (software) e seus papéis
na execução das tarefas do sistema
distribuído?
• Como essas entidades irão se conectar e qual
paradigma de comunicação será utilizado?
• Onde as entidades estarão fisicamente
localizadas?
6. 6
Modelos Arquiteturais
• Quais são entidades comunicantes em um
SD?
• Processos
• Entidade de software comunicante
• Pode conter subprocessos (Threads)
• Nós físicos
• Sensores, sistemas de automação
• Do ponto de vista de desenvolvimento de um SD
• Objetos
• Componentes
• Serviços
7. 7
Modelos Arquiteturais
• Como essas entidades irão se conectar e qual
paradigma de comunicação será utilizado?
• A resposta está muitas vezes relacionada a tecnologia de
desenvolvimento utilizada
• Comunicação entre processos
• Invocação remota
• Comunicação indireta
8. 8
Comunicação entre processos
• A forma mais simples é uso de APIs para acessar a
camada de sockets do sistema operacional
• Problemas inerentes a desconexões, não presença e protocolo de
troca de informação ficam a cargo do programador
• Modelos de conexão atrelados ao protocolo de transporte
• Socket TCP, socket UDP
• Uso de Multicast ou Unicast
• Suporte a modelo com conexão permanente e
manutenção de estado de conexão
• Protocolos de troca de mensagens
• Separadores
• Serialização e deserialização
• XML, JSON
9. 9
Exemplo de Serialização em Java
class Nodo implements Serializable {
Vector filhos; Nodo pai; String nome;
public Nodo(String s) {
filhos = new Vector(5); nome = s; }
public void addFilho(Nodo n) {
Filhos.addElement(n); n.pai = this; }
}
10. 10
Exemplo de Serialização em Java
cliente = new Socket(host, port);
Nodo top = new Nodo("topo");
top.addFilho(new Nodo("filho1"));
top.addFilho(new Nodo("filho2"));
ObjectOutput out = new
ObjectOutputStream(cliente.getOutputStream());
out.writeObject(top);
out.flush();
11. 11
Exemplo de Serialização em Java
Cliente - Socket
cliente = new Socket(host, port);
Nodo top = new Nodo("topo");
top.addFilho(new Nodo("filho1"));
top.addFilho(new Nodo("filho2"));
ObjectOutput out = new
ObjectOutputStream(cliente.getOutputStream());
out.writeObject(top);
out.flush();
12. 12
Exemplo de Serialização em Java
Servidor - Socket
socket = server.accept();
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
Nodo n = (Nodo)in.readObject();
n.addFilho(new Nodo("servidor"));
out.writeObject(n);
out.flush();
13. 13
Invocação remota
• Framework de mais alto nível disponível pelo Sistema
Operacional ou middleware para facilitar a comunicação
entre processos
• Protocolos do tipo requisição-resposta
• Remote Procedure Call (RPC)
• Remote Method Invocation (RMI)
15. 15
Desvantagens da Invocação
remota
• Um acoplamento entre as partes comunicantes ainda é
grande
• Conhecimento de quem está comunicando
• Ambos conectados ao mesmo tempo
• Pode oferecer transparência de localização e acesso usando
descoberta de serviços
16. 16
Comunicação indireta
• Menor acoplamento entre os sistemas
• Promove os desacoplamentos espacial e temporal
• Sem a necessidade de conhecimento da localização e com quem
está se comunicando
• Sem a necessidade de os comunicantes estarem conectados ao
mesmo
• Exemplos
• Sistemas baseados em eventos (Event-based ou Publish-
Subscribers)
• Fila de Mensagens
• Espaço de Tuplas
• Memória Compartilhada e Distribuída
29. Programação de socket
usando TCP
Serviço TCP: transferência confiável de bytes de um
processo para outro
controlado pelo
controlado pelo processo desenvolvedor
desenvolvedor processo
da aplicação
da aplicação socket socket
TCP com TCP com controlado
controlado
buffers, pelo sistema
pelo sistema buffers, Internet variáveis operacional
operacional variáveis
hospedeiro hospedeiro
ou servidor ou servidor
30. Programação
de socket com TCP
cliente deve contactar servidor • quando contactado pelo cliente,
• processo servidor primeiro deve servidor TCP cria novo socket
estar rodando para processo servidor se
• servidor deve ter criado socket comunicar com cliente
(porta) que aceita contato do • permite que servidor fale com
cliente múltiplos clientes
• números de porta de origem
cliente contacta servidor:
usados para distinguir clientes
• criando socket TCP local ao
(mais no Cap. 3)
cliente
• especificando endereço IP, #
ponto de vista da aplicação
porta do processo servidor
TCP oferece transferência
• quando cliente cria socket:
de bytes confiável, em ordem
cliente TCP estabelece conexão (“pipe”) entre cliente e servidor
com servidor TCP
31. Interação de socket
cliente/servidor: TCP
servidor (rodando em hostid) Cliente
cria socket,
porta = x, para
requisição que chega:
welcomeSocket =
ServerSocket()
estabelecimento cria socket,
espera requisição
da conexão que chega da conexão TCP conexão com hostid, porta = x
clientSocket =
connectionSocket =
Socket()
welcomeSocket.accept()
envia requisição usando
lê requisição de clientSocket
connectionSocket
escrever resposta em
connectionSocket lê resposta de
clientSocket
fecha
connectionSocket fecha
clientSocket
32. Programação de socket
com TCP
Exemplo de apl. cliente-servidor:
1) cliente lê linha da entrada padrão
(cadeia inFromUser), envia ao
servidor via socket (cadeia
outToServer)
2) servidor lê linha do socket
3) servidor converte linha para
maiúsculas, envia de volta ao cliente
4) cliente lê, imprime linha modificada do
socket (cadeia inFromServer)
33. Exemplo: cliente Java (TCP)
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[ ]) throws Exception
{
String sentence;
String modifiedSentence;
cria cadeia
BufferedReader inFromUser =
de entrada
new BufferedReader(new InputStreamReader(System.in));
cria socket
cliente, conexão Socket clientSocket = new Socket("hostname", 6789);
com servidor
cria cadeia de DataOutputStream outToServer =
saída conectada new DataOutputStream(clientSocket.getOutputStream());
ao socket
34. cria cadeia de BufferedReader inFromServer =
entrada conectada new BufferedReader(new
ao socket InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
envia linha outToServer.writeBytes(sentence + 'n');
ao servidor
modifiedSentence = inFromServer.readLine();
lê linha
do servidor
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
}
35. Exemplo: servidor Java (TCP)
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception
{
String clientSentence;
cria socket de String capitalizedSentence;
apresentação na
ServerSocket welcomeSocket = new ServerSocket(6789);
porta 6789
while(true) {
espera no socket
de apresentação pelo Socket connectionSocket = welcomeSocket.accept();
contato do cliente
BufferedReader inFromClient =
cria cadeia de new BufferedReader(new
entrada, conectada InputStreamReader(connectionSocket.getInputStream()));
ao socket
36. cria cadeia de
saída, conectada DataOutputStream outToClient =
ao socket new DataOutputStream(connectionSocket.getOutputStream());
lê linha
do socket clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + 'n';
escreve linha
outToClient.writeBytes(capitalizedSentence);
no socket
}
}
} fim do loop while,
retorna e espera outra
conexão do cliente