48
Sistemas Operacionais: Sistemas Operacionais: Dierone Cesar Foltran Junior Dierone Cesar Foltran Junior dcfoltran at yahoo.com dcfoltran at yahoo.com Sistemas Distribuídos e Programação em Redes de Computadores

Sistemas Distribuídos, Programação Concorrente e Redes ...dierone/so_2015/S28_A.T28.1_17.11.2015... · “É um sistema que impede você de obter qualquer ... “Aparenta ser um

  • Upload
    hatruc

  • View
    212

  • Download
    0

Embed Size (px)

Citation preview

Sistemas Operacionais:Sistemas Operacionais:

Dierone Cesar Foltran JuniorDierone Cesar Foltran Juniordcfoltran at yahoo.comdcfoltran at yahoo.com

Sistemas Distribuídos e Programação em Redes de

Computadores

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 Programação com socketssockets

Protocolos da Internet

ARP HardwareInterface RARP

ICMP IP IGMP

UDPTCP

FTPHTTP RPCDNS... ...

Enlace

Rede

Transporte

Aplicação

UsuárioNúcleo do SO

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

Internet

TCP

www.uol.com.br200.221.8.18procololo = 6

porta = 80

host-0-13.re.apartnet.br.inter.net200.199.75.13

ssh.cin.ufpe.br150.161.2.106procololo = 6

porta = 22

porta15398

porta20348

porta20345

protocolo = 6

servidor DNS200.185.56.49protocol = 17

porta = 53

UDP

porta10340

protocolo = 17

www.bbc.co.uk212.58.224.61protocolo = 17porta = 44585

porta6970

Programação na Internet Sockets

− Estilo: envia/recebe (send/receive)− Característica: eficiente

RPC − 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çãodesenvolver um protocolo de aplicação

Berkeley Sockets

Berkeley Sockets

Sockets - visão conceitual

Tipos de sockets Serviço com conexão

− Implementa um streamstream 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 APIsocket Cria um novo descritor para comunicação

connect Iniciar conexão com servidor

write Escreve dados em uma conexão

read Lê dados de uma conexão

close Fecha a conexão

bind Atribui um endereço IP e uma porta a um socket

listen Coloca o socket em modo passivo, para “escutar” portas

accept Bloqueia o servidor até chegada de requisição de conexão

recvfrom Recebe um datagrama e guarda o endereço do emissor

sendto Envia um datagrama especificando o endereço

Serviço com Conexão (TCP)

close ()

listen ()

bind ()

socket ()

accept ()

read ()

write ()

Servidor

socket ()

Cliente

connect ()bloqueado Estabelecimento de conexão

write ()

read ()

close ()

Dados (pedido)

Dados resposta)

Serviço sem Conexão (UDP)

sendto ()

bind ()

socket ()

recvfrom ()

Servidor

socket ()

Cliente

bloqueado

sendto ()

recvfrom ()

Dados (pedido)

Dados resposta)

close ()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 desistema e de usuário

5000- Usadas somente por processosde 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 socketsocket e bindbind− ServerSocket: equivalente a socketsocket, bindbind e listenlisten

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 DataInputStreamDataInputStream, DataOutputStreamDataOutputStream, etc.,

import java.net.*;import java.io.*;public class SimpleJavaClient {

public static void main(String[] args) {try {

SocketSocket s = new SocketSocket("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.writewrite(line);i.readread(line);str = new String(line);System.out.println(str.trim());

} while ( !str.trim().equals("bye") );s.closeclose();

}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 ServerSocketServerSocket(9999);String str;while (true) {

SocketSocket c = s.acceptaccept();InputStream i = c.getInputStream();OutputStream o = c.getOutputStream();do {

byte[] line = new byte[100];i.readread(line);o.writewrite(line);str = new String(line);

} while ( !str.trim().equals("bye") );c.closeclose();

}}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 = socketsocket(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);connectconnect(s, (struct sockaddr*)&dest, sizeof(dest));do {

scanf("%s",msg_write); writewrite (s, msg_write, strlen(msg_write)+1); readread (s, msg_read, MAXBUF);

} while (strcmp(msg_read,"bye")); closeclose(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 = socketsocket(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;bindbind(s, (struct sockaddr*)&self, sizeof(self));listenlisten(s, 5);while (1) {

client_s = acceptaccept(s, (struct sockaddr*)&client, &addrlen);do {

readread (client_s, msg_read, MAXBUF); writewrite (client_s, msg_read, strlen(msg_read)+1);

} while (strcmp(msg_read,"bye")); closeclose(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);