Sistemas Operacionais: Sistemas Distribuídos e Programação em Redes de Computadores Dierone Cesar Foltran Junior dcfoltran at yahoo.com
Sistemas Distribuídos Sistemas Computacionais Distribuídos Lamport: É um sistema que impede você de obter qualquer serviço quando uma máquina que você nem imagina que exista falhe!
Sistemas Distribuídos Sistemas Computacionais Distribuídos Tanenbaum + van Renesse: Aparenta ser um sistema centralizado mas na realidade o S.O. executa em múltiplos e independentes processadores.
Sistemas Distribuídos Sistemas Computacionais Distribuídos Tanenbaum + van Renesse: Aparenta ser um sistema centralizado mas na realidade o S.O. executa em múltiplos e independentes processadores. Conceito Chave Transparência o uso de múltiplos processadores deve ser invisível ao usuário.
Sistemas Distribuídos Evolução Histórica: 5 Fases: décadas de 50, 60, 70, 80 e 90: 50 uso exclusivo - monousuário - alto custo
Sistemas Distribuídos Evolução Histórica: 5 Fases: décadas de 50, 60, 70, 80 e 90: 50 uso exclusivo - monousuário - alto custo 60 processamento em lote (em batch) Evolução das memórias: espaço suficiente para acomodar o S.O. e programa de aplicação; Máxima utilização da máquina
Sistemas Distribuídos Evolução Histórica: 5 Fases: décadas de 50, 60, 70, 80 e 90: 50 uso exclusivo - monousuário - alto custo 60 processamento em lote (em batch) 70 multiusuário-compartilhamento da máquina (time sharing) Ciclo de máquina se tornou mais barato (máquinas mais velozes / preço menor por ciclo). Programadores tornaram-se mais produtivos.
Sistemas Distribuídos Evolução Histórica: 5 Fases: décadas de 50, 60, 70, 80 e 90: 50 uso exclusivo - monousuário - alto custo 60 processamento em lote (em batch) 70 multiusuário-compartilhamento da máquina (time sharing) 80 computação pessoal e S.D. Tecnologia de VLSI e LAN tornaram os S.D. viáveis
Sistemas Distribuídos Evolução Histórica: 5 Fases: décadas de 50, 60, 70, 80 e 90: 50 uso exclusivo - monousuário - alto custo 60 processamento em lote (em batch) 70 multiusuário-compartilhamento da máquina (time sharing) 80 computação pessoal e S.D. 90 computação pessoal, S.D. e Internet sedimentação dos S.D; proliferação acelerada da Internet; computação paralela sobre plataformas distribuídas; integração de ambientes computacionais.
Sistemas Distribuídos Evolução Histórica: 5 Fases: décadas de 50, 60, 70, 80 e 90: 50 uso exclusivo - monousuário - alto custo 60 processamento em lote (em batch) 70 multiusuário-compartilhamento da máquina (time sharing) 80 computação pessoal e S.D. 90 computação pessoal, S.D. e Internet 2000 globalização, computação ubíqua,... Sistemas distribuídos globais; Máquinas paralelas virtuais globais; Wireless e distribuição em tempo real do processamento.
Sistemas Distribuídos Motivação: aplicações especiais: requerem alto grau de interação com os usuários (aplicações gráficas); minicomputadores: passam a ser usados como máquina pessoal (monousuário); redes locais de computadores: retorno da conectividade; servidores: algums equipamentos transformados para desempenhar tarefa específica; custo: obter desempenho esperado de um único recurso pode ser muito caro com a tecnologia disponível no momento;; desempenho: vários fatores a mais alteram o desempenho (cuidado!).
Sistemas Distribuídos Modelos Arquiteturais: Aspectos físicos Aspectos lógicos
Sistemas Distribuídos Modelos Arquiteturais: Estações de Trabalho - Servidores Cliente-servidor Usuário estação de trabalho Servidores - serviços especializados
Sistemas Distribuídos Modelos Arquiteturais: Banco de Processadores Cliente-servidor Usuário terminais Processadores formam um banco Login associa processador a terminal Servidores serviços especiais
Programação Concorrente Máquinas von Neumann Programação Seqüencial Um processo por vez; Gargalo de von Neumann Baixo desempenho; Serialização de problemas paralelos. Solução: Computação Paralela Arquiteturas Paralelas: vários processadores/memórias trabalhando em uma mesma aplicação; Programação Concorrente: inciar/finalizar, coordenar e comunicar Diversas instruções executadas em paralelo para resolver problemas complexos mais eficientemente;
Programação Concorrente Execução Seqüencial: Várias instruções sendo executadas uma após a outra. Execução Concorrente: Várias instruções sendo executadas concorrentemente; Único processador: há um pseudo-paralelismo; Em arquiteturas paralelas (vários processadores) têm-se:. Execução Paralela: na computação paralela há vários processos executando em diferentes processadores e trabalhando juntos em um único problema;
Programação Concorrente Arquiteturas Paralelas Objetivo principal: Acelerar o processamento Há diferentes soluções: Organizações de propósito geral Organizações orientadas a aplicações
Programação Concorrente Classificação de Flynn
Programação Concorrente SISD Single Instruction Single Data
Programação Concorrente SIMD Single Instruction Multiple Data
Programação Concorrente MISD Multiple Instruction Single Data
Programação Concorrente MIMD Multiple Instruction Multiple Data
Redes de Computadores Exemplo de protocolo: TCP/IP Padrão amplamente utilizado Origem na ARPANET Protocolo base da Internet
Redes de Computadores Redes de Alta Velocidade Qualidade de Serviço (QoS) Evolução das redes convencionais Fibras óticas Protocolos especiais
Redes de Computadores Redes modernas Integração de: Dados Voz Imagens
Programação com sockets
Protocolos da Internet HTTP FTP... DNS RPC... Aplicação Usuário TCP UDP Transporte Núcleo do SO ICMP IP IGMP Rede ARP Hardware Interface RARP Enlace
Identificação de aplicações Como cada máquina é identificada unicamente na Internet? Como a entidade de rede (IP) identifica para qual protocolo de transporte está sendo utilizado? Como a entidade de transporte identifica qual aplicação está sendo utilizada? Um cliente pode abrir várias conexões com o mesmo servidor (ex. páginas web). Como o cliente sabe para qual programa enviar os pacotes?
Identificação de aplicações porta 20345 porta 20348 TCP porta 15398 porta 10340 UDP porta 6970 protocolo = 6 protocolo = 17 ssh.cin.ufpe.br 150.161.2.106 procololo = 6 porta = 22 Internet host-0-13.re.apartnet.br.inter.net 200.199.75.13 www.uol.com.br 200.221.8.18 procololo = 6 porta = 80 www.bbc.co.uk 212.58.224.61 protocolo = 17 porta = 44585 servidor DNS 200.185.56.49 protocol = 17 porta = 53
Programação na Internet Sockets RPC Estilo: envia/recebe (send/receive) Característica: eficiente Chamada remota de procedimento Transparência e facilidade de programação Objetos distribuídos Transparência, facilidade e todos os benefícios da programação orientada a objetos Execução mais lenta Exemplos: DCOM CORBA Java RMI etc.
Unix BSD Sockets Interface padrão para comunicação entre processos em redes TCP/IP Nasceu com o Unix de Berkeley Os projetistas tentaram usar ao máximo as chamadas de sistema do Unix Implementada hoje em vários SOs Programar com sockets pode ser visto como desenvolver um protocolo de aplicação
Berkeley Sockets
Berkeley Sockets
Sockets - visão conceitual
Tipos de sockets Serviço com conexão Implementa um stream de dados (SOCK_STREAM) Protocolo TCP (tipicamente) Serviço sem conexão Implementa um serviço de datagramas (SOCK_DGRAM) Protocolo UDP (tipicamente) Acessa diretamente a camada de rede (SOCK_RAW) Serviço de baixo nível Protocolo IP (tipicamente
Principais funções da API socket connect write read close bind listen accept Cria um novo descritor para comunicação Iniciar conexão com servidor Escreve dados em uma conexão Lê dados de uma conexão Fecha a conexão Atribui um endereço IP e uma porta a um socket Coloca o socket em modo passivo, para escutar portas Bloqueia o servidor até chegada de requisição de conexão recvfrom Recebe um datagrama e guarda o endereço do emissor Envia um datagrama especificando o endereço sendto
Serviço com Conexão (TCP) Servidor socket () bind () listen () accept () bloqueado read () Estabelecimento de conexão Dados (pedido) Cliente socket () connect () write () write () close () Dados resposta) read () close ()
Serviço sem Conexão (UDP) Servidor socket () bind () recvfrom () bloqueado Cliente socket () Dados (pedido) sendto () sendto () close () Dados resposta) recvfrom () close ()
Estrutura Típica de um Servidor
Números de portas 1-255 reservadas para serviços padrão portas bem conhecidas 256-1023 reservado para serviços Unix 1-1023 Somente podem ser usadas por usuários privilegiados (super-usuário) 1024-4999 Usadas por processos de sistema e de usuário 5000- Usadas somente por processos de usuário
Sockets em Java Java modernizou a API para trabalhar com sockets O programador não precisa chamar todas as funções, algumas chamadas são automáticas Exemplos Socket: equivalente a socket e bind ServerSocket: equivalente a socket, bind e listen Sockets são implementados no pacote java.net A transmissão e o envio de dados são feitos através de classes do pacote java.io de maneira semelhante à escrita e leitura em arquivos Classes DataInputStream, DataOutputStream, etc.,
import java.net.*; import java.io.*; public class SimpleJavaClient { public static void main(string[] args) { try { Socket s = new Socket("127.0.0.1", 9999); InputStream i = s.getinputstream(); OutputStream o = s.getoutputstream(); String str; do { byte[] line = new byte[100]; System.in.read(line); o.write(line); } } i.read(line); str = new String(line); System.out.println(str.trim()); } while (!str.trim().equals("bye") ); s.close(); } catch (Exception err) { System.err.println(err); }
import java.io.*; import java.net.*; public class SimpleJavaServer { public static void main(string[] args) { try { ServerSocket s = new ServerSocket(9999); String str; while (true) { Socket c = s.accept(); InputStream i = c.getinputstream(); OutputStream o = c.getoutputstream(); do { byte[] line = new byte[100]; i.read(line); o.write(line); str = new String(line); } while (!str.trim().equals("bye") ); c.close(); } } catch (Exception err){ System.err.println(err); } } }
Sockets em C/C++ C é a linguagem básica para programação com sockets De maneira diferente de Java, programar com sockets em C/C++ envolve utilizar todas as chamadas da API
#include... #include <sys/socket.h> int main(int argc, char **argv) { int s; struct sockaddr_in dest; char msg_write[100], msg_read[100]; s = socket(af_inet, SOCK_STREAM, 0)); } bzero(&dest, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_port = htons(9999); inet_aton( 127.0.0.1, &dest.sin_addr.s_addr); connect(s, (struct sockaddr*)&dest, sizeof(dest)); do { scanf("%s",msg_write); write (s, msg_write, strlen(msg_write)+1); read (s, msg_read, MAXBUF); } while (strcmp(msg_read,"bye")); close(s);
#include... #include <sys/socket.h> int main(int argc, char **argv) { int s, client_s; struct sockaddr_in self, client; int addrlen = sizeof(client); char msg_write[100], msg_read[100]; s = socket(af_inet, SOCK_STREAM, 0); bzero(&self, sizeof(self)); self.sin_family = AF_INET; self.sin_port = htons(9999); self.sin_addr.s_addr = INADDR_ANY; } bind(s, (struct sockaddr*)&self, sizeof(self)); listen(s, 5); while (1) { client_s = accept(s, (struct sockaddr*)&client, &addrlen); do { read (client_s, msg_read, MAXBUF); write (client_s, msg_read, strlen(msg_read)+1); } while (strcmp(msg_read,"bye")); close(client_s); }
Sockets sem Conexão (Java) Cliente:» socket = new DatagramSocket( );» message = new DatagramPacket(msg,length,Addr,Port);» reply = new DatagramPacket( new byte[100], 100 );» socket.send( message );» socket.receive( reply );» socket.close(); Servidor:» socket = new DatagramSocket(porta);» socket.receive( message );» socket.send( message );
Sockets sem Conexão (C) Cliente:» s = socket(af_inet, SOCK_DGRAM, 0);» sendto(s, msg, length, flags, destaddr, addrlen);» recvfrom(s, msg, length, flags, fromaddr, addrlen); Servidor:» s = socket(af_inet, SOCK_DGRAM, 0);» bind(s, dest, sizeof(dest));» recvfrom(s, msg, length, flags, fromaddr, addrlen);» sendto(s, msg, length, flags, destaddr, addrlen);