Baixe o app para aproveitar ainda mais
Prévia do material em texto
CAPITULO 1 Principais Desafios em SD ● Heterogeneidade: A internet permite aos usuários acessarem serviços e executarem aplicativos por meio de um conjunto heterogêneo de computadores e redes. A heterogeneidade (isto é, variedade e diferença) se aplica aos seguintes aspectos: ○ redes ○ hardware de computador ○ SOs ○ linguagens de programação ○ implementações de diferentes desenvolvedores ● Abertura (openness): Capacidade de o sistema ser extensível, quer em hardware quer em software. Novos componentes devem poder ser adicionados sem por em causa o funcionamento dos já existentes, e poder comunicar com eles. Para isso é importante que sejam conhecidas as interfaces dos novos componentes através da publicação da sua documentação e utilizar protocolos. ● Segurança: A segurança de recursos de informação tem três componentes: confidencialidade ( proteção contra exposiçõa para pessoas não autorizadas), integridade (proteção contra alteração ou dano) e disponibilidade (proteção contra interferência com os meios de acesso aos recursos). ○ Ataque de negação de serviço: ocorre quando um usuário interrompe um serviço por algum motivo. Isso pode ser conseguido bombardeando o serviço com um número tão grande de pedidos sem sentido, que os usuários não são capazes de usálo. ● Escalabilidade: Um sistema é descrito como escalável se permanece eficiente quando há um aumento significativo no número de recursos e no número de usuários. ○ É necessário desenhar o software de forma a que o aumento de utilizações não exija grandes alterações, evitar algoritmos, serviços e estruturas de dados centralizados, controlar o aumento de custos devido à disponibilização de mais recursos, controlar a perda de performance e evitar o transbordo de certos limites de recursos. ● Tratamento de falhas: As falhas em um SD são parciais isto é, alguns componentes falham, enquanto outros continuam funcionando. Portanto, o tratamento de falhas é particularmente difícil. Seguem as técnicas comuns: ○ Detecção de falhas: algumas falhas podem ser detectadas. Por exemplo, somas de verificação podem ser usadas para detectar dados danificados em uma mensagem ou em um arquivo. ○ Mascaramento de falhas: algumas falhas detectadas podem ser ocultas ou se tornar menos sérias. Exemplo de ocultação de falhas: ■ mensagens podem ser retransmitidas quando não chegam; ■ dados de arquivos podem ser gravados em dois discos, para que, se um estiver danificado, o outro ainda possa estar correto. ○ Tolerância a falhas: a maioria dos serviços na Internet apresenta falhas não seria pratico tentar detectar e mascarar tudo que possa ocorrer em uma rede tão grande, com tantos componentes. Seus clientes podem ser projetados de forma a tolerar falhas. por exemplo: ■ quando um navegador não consegue contatar um servidor web, ele não faz o usuário esperar indefinidamente, enquanto continua tentando ele informa o usuário sobre o problema, deixandoo livre para tentar novamente. ○ Recuperação de falhas: a recuperação envolve projetar software de modo que o estado dos dados permanentes possa ser recuperado ou retrocedido, após a falha de um servidor. Em geral, as computações realizadas por alguns programas ficarão incompletas quando ocorrer uma falha e os dados permanentes que eles atualizam podem não estar em um estados consistente. ○ Redundância: os serviços podem se tornar tolerantes a falhas com o uso de componentes redundantes. Considere os exemplos a seguir: ■ Sempre deve haver pelo menos duas rotas diferentes entre dois roteadores quaisquer na Internet. ■ No Domain Name System, toda tabela de correspondência de nomes é replicada em pelo menos dois servidores diferentes. ■ Um banco de dados pode ser replicado em vários servidores, para garantir que os dados permaneçam acessíveis após a falha de qualquer servidor. Os servidores podem ser projetados de forma a detectar falhas em seus pares: quando uma falha é detectada em um servidor, os clientes são redirecionados para os servidores restantes. ● Concorrência: os vários utilizadores utilizam o sistema em simultâneo (é necessário coordenar o acesso aos recursos partilhados) ● Transparência: O sistema deve ser visto como um todo e não como uma coleção de componentes distribuídos. ○ Transparência de Acesso: permite que o acesso a recursos locais e a recursos remotos seja feito através das mesmas operações (i.é, usando a mesma interface). ○ Localização: permite que os recursos possam ser acedidos sem o conhecimento da sua localização. (ex. Programas de correio electrónico) ○ Concorrência: permite que os vários clientes de um componente não necessitem de ter em conta o acesso concorrente ao componente. ○ Replicação: permite que os clientes de um componente não se apercebam se existe replicação e estão a usar uma réplica e não o original; a utilização de várias instâncias de um componente pode ocorrer por razões de desempenho ou de fiabilidade; os utilizadores do componente não necessitem de saber que o componente possa ser replicado. ○ Falhas: permite que o sistema funcione na presença de falhas de hardware ou software sem que utilizadores e programadores saibam como as falhas foram ultrapassadas. (por ex. um sistema de email pode retransmitir uma mensagem até que a mesma seja entregue com sucesso) ○ Migração: permite que um recurso possa mudar de localização sem que isso afecte a sua utilização. (ex. Telemóveis em movimento) ○ Desempenho: permite que o sistema seja reconfigurado para melhorar o seu desempenho sem que os utilizadores se apercebam. ○ Escalabilidade: permite que o sistema seja expandido sem que os utilizadores se apercebam de como isso foi conseguido. CAPITULO 2 Modelos: Descrição abastrata e simplificada de aspectos relevantes relacionados ao design de um sistema distribuído ● Modelos Físicos ● Modelos Arquiteturais: Um modelo arquitetural de um sistema distribuído é a estrutura do sistema em termos de localização das suas diferentes partes, do papel que cada parte desempenha e como se interrelacionam. ● Modelos Fundamentais: Os sistemas distribuídos podem ainda ser analizados segundo 3 aspectos transversais a todos os sistemas: ○ Modelo de Interação( ou de sincronismo): ○ Modelo de Falhas (ou Avarias) ○ Medolo de Segurança Modelo de interação: Interação é a ação (comunicação e sincronização) entre as partes para realizar um qualquer trabalho. É afetada por dois aspectos: ➔ Performance dos canais de comunicação: A comunicação em uma rede de computadores tem as seguintes características de desempeno relacionadas à latência, largura de banda e jitter: ◆ Latência : Intervalo de tempo que medeia entre o início da transmissão de uma mensagem por um processo e o início da sua recepção pelo outro processo. A latência inclui: ● O tempo que o primeiro bit de um conjunto de bits transmitido em uma rede leva para chegar ao seu destino. Por exemplo, a latência da transmissão de uma mensagem por meio de um enlace de satélite é o tempo necessário para que um sinal de rádio vá até o satélite e retorne a terra para seu destinatário. ● O atraso no acesso à rede, que aumenta significativamente quando a rede está muito carregada. Por exemplo, para transmissão Ethernet, a estação remetente espera que a rede esteja livre de tráfego para poder enviar sua mensagem. ● O tempo de processamento gasto pelos serviços de comunicação do sistema operacional nos processos de envio e recepção, que varia de acordo com a carga momentânea dos computadores. ◆ Largura de banda: É o volume total de informações que pode ser transmitido em determinado momento. Quando um grande número de comunicações usa a mesma rede, elascompartilham a largura de banda disponível. ◆ Jitter: É a variação no tempo exigida para distribuir uma série de mensagens. O Jitter é crucial para dados multimídia. Por exemplo, se amostras consecutivas de dados de áudio são reproduzidas com diferentes intervalos de tempo, o som resultante será bastante distorcido. ➔ Inexistência de um tempo global; Cada computador possui seu próprio relógio interno, o qual pode ser usado pelos processos locais para obter o valor atual da hora. Mesmo que dois processos leiam seus relógios locais simultâneamente esses podem fornecer valores diferentes. ◆ Taxa de desvio do relógio (Drift): se refere à quantidade relativa pela qual um relógio de computador difere de um relógio de referência perfeito ● Os drifts de dois relógios distintos são também distintos, o que significa que entre eles o tempo será sempre divergente. ◆ Uma solução passa por obter o tempo fornecido por GPS – Global Positioning System, e enviar aos participantes do sistema distribuído. Problema: Delays no envio dessa mensagem!!! ➔ Duas variantes do modelo de interação: Em um sistema distribuído é muito difícil estabelecer limites para o tempo que leva a execução dos processos, para a troca de mensagens ou para o desvio do relógio. Dois pontos de vistas opostos fornecem modelos simples; o primeiro é fortemente baseado na idéia de tempo, o segundo não. ◆ Sistemas distribuídos síncronos: ● o tempo para executar cada etapa de um processo tem limites inferior e superior conhecidos; ● cada mensagem transmitida em um canal é recebida dentro de um tempo limitado, conhecido; ● cada processo tem um relógio local cuja taxa de desvio do tempo real tem um limite conhecido Dessa forma, é possível estimar prováveis limites superior para o tempo de execução de um processo, para o atraso das mensagens e para as taxas de desvio do relógio em um SD. Os SDs síncronos podem ser construídos, desde que se garanta que os processos sejam executados de forma a respeitar as restrições temporais impostas. ➔ Sistemas distribuídos assíncronos: Um SD assíncrono é aquele em que não existem considerações sobre: ◆ as velocidades de execução de processos por exemplo, uma etapa do processo pode levar apenas um picossegundo e outra, um século; tudo que pode ser dito é que cada etapa pode demorar um tempo arbitrariamente longo; ◆ os atrasos na transmissão das msnssagens por exemplo, uma mensagem do processo A para o processo B pode ser enviada em um tempo insignificante e outra pode demorar vários anos. Em outras palavras, uma mensagem pode ser recebida após um tempo arbitrariamente long; ◆ as taxas de desvio do relógio novamente, a taxa de desvio de um relógio é arbitrária. O modelo assíncrono não faz nenhuma consideração sobre os intervalos de tempo envolvidos em qualquer tipo de execução ➔ Modelo de Falhas: Uma falha é qualquer alteração do comportamento do sistema em relação ao esperado, isto é, em relação à sua especificação. As falhas podem atingir os processos ou os canais de comunicação. ◆ Tipos de falhas ● Falhas por Omissão; ● Falhas arbitrárias; ● Falhas em temporização; Falha por Omissão: As falhas por omissão se referem aos casos em que um processo ou canal de comunicação deixa de executar as ações que deveria. ● Falhas por omissão de processo: a principal falha por omissão de um processo é quando ele entra em colapso, parando e não executando outro passo de seu programa. O colapso de um processo é chamado de parada por falha se outros processos puderem detectar, com certeza, a ocorrência dessa situação. Em um sistema síncrono, uma parada por falha ocorre quando timeouts são usados para determinar que certos processos deixaram de responder a mensagens sabidamente entregues. ● Falhas por omissão na comunicação: O canal de comunicação produz uma falha por omissão quando não concretiza a transferência de uma mensagem m do buffer de encio de um processo p para o buffer de recepção de um outro processo q. Isso é conhecido como “perda de mensagens” e geralmente é causado pela falta de espaço no buffer de recepção, ou pela mensagem ser descartada ao ser detectado que houve um erro durante sua transmissão. Falhas Arbitrárias: O termo falha arbitrária, ou bizantina, é usado para descrever a pior semântica de falha possível na qual qualquer tipode erro pode ocorrer. ● Uma falha arbitrária de um processo é aquela em que ele omite arbitrariamente passos desejados do processamento ou efetua processamento indesejado. Portanto, as falhas arbitrárias não podem ser detectadas verificandose se o processo responde às invocações, pois ele poderia omitir arbitrariamente a resposta. ● Os canais de comunicação podem sofrer falhas arbitrárias: por exemplom o conteúdo da mensagem pode ser corrompido, mensagens inexistentes podem ser enviadas ou mensgens reais podem ser entregues mais de uma vez. As falhas arbitrárias dos canais de comunicação são raras, pois o software de comunicação é capaz de reconhecelas e rejeitar as mensagens com problemas. Falhas de temporização: As falhas de temporização são aplcãveis aos SDs síncronos onde limites de tempo são estabelecidos para o tempo de execução do processo, para o tempo de entrega de mensagens e para a taxa de desvio do relógio. Em um SD assíncrono, um servidor sobrecarregado pode responder muito lentamente, mas não podemos dizer que ele apresenta uma falha de temporização, pois nenhuma garantia foi oferecida. Mascaramento de falhas: É possível construir serviços confiáveis a partir de componentes que exibem falhas. Por exemplo vários servidores que contêm réplicas dos dados podem continuar a fornecer um serviço quando um deles apresenta um defeito. Um serviço mascara uma falha ocultandoa completamente ou convertendoa em um tipo de falha mais aceitável. Confiabilidade da comunicação de um para um: O termo comunicação confiável é definido em termos de validade e integridade, como segue: ● validade: qualquer mensagem do buffer de envio é entregue ao buffer de recepção de seu destino, independentemente do tempo necessário para tal; ● integridade: a mensagem recebida é idêntica à enviada e nenhuma mensagem é entregue duas vezes. ○ São ameaças à integridade: Qualquer protocolo que retransmita mensagens, mas não rejeite uma mensagem que entregue duas vezes. Usuários malintencionados que podem injetar mensagens espúrias, reproduzir mensagens antigas ou falsificar mensagens. ➔ Modelo de Segurança: Proteção das entidades do sistema, processo/utilizador (“principal”). Direitos de acesso especificam que entidades podem aceder, e de que forma, a que recursos. Ex: Que entidade pode executar que operações num dado objeto. O servidor é responsável por verificar a identidade de quem (entidade) fez o pedido, e verificar se essa entidade tem direitos de acesso para realizar a operação pretendida. O cliente deverá verificar a identidade de quem lhe enviou a resposta, para ver se a resposta veio da entidade esperada. Ameaças: Supondo que existe um processo inimigo capaz de enviar qualquer mensagem para qualquer processo, interceptar (ler/copiar) qualquer mensagem trocada entre 2 processos. As ameaças de um inimigo em potencial são discutidas sob os títulos : Ameaças aos processos: um processo projetado para tratar de pedidos pode receber uma mensagem de qualquer outro processo no sistema distribuído e não ser capaz de determinar com certeza a identidade do remetente. IP inclui o endereço do computador origem da mensagem mas um processo inimigo pode forjar esse endereço. Um clientetambém não dispõe de métodos para validar as respostas de um servidor. Ameaças aos canais de comunicação: Um processo inimigo pode copiar, alterar ou unjetar mensagens na rede e em seus sistemas intermediários (roteadores por exemplo). Tais ataques representam uma ameaça à privacidade e à integridade das informações quando elas trafegam pela rede. Essas mensagens podem ser reveladas a terceiros. Negação de serviço: Esta é uma forma de ataque na qual o atacante interfere nas atividades dos usuários autorizados, fazendo inúmeras invocações sem sentido em serviços ou transmitindo mensagens incessantemente em uma rede para gerar uma sobrecarga dos recursos físicos (capacidade de processamento do servidor, largura de banda da rede, etc). Tais ataque normalmente são feitos com a intenção de retardar, ou impedir, as invocações válidas de outros usuários. Definição de canal seguro: Canal utilizado para comunicação entre dois processos com as seguintes características: Cada processo pode identificar com 100% de confiança a entidade responsável pela execução do outro processo; As mensagens que são transferidas de um processo a outro, são garantidas do pondo de vista da integridade e da privacidade; As mensagens tem garantia de não repetibilidade ou reenvio por ordem distinta (cada mensagem inclui um tempo físico ou lógico); Criptografia: Técnica de codificar o conteúdo de uma mensagem de forma a “esconder” o seu conteúdo. É necessário que ambos os processos possuam a chave de codificação / decodificação. Autencitação: Incluir na mensagem uma porção (encriptada) que contenha informação suficiente para identificar a entidade e verificar os seus direitos de acesso. CAPITULO 4 As características da comunicação entre processos Comunicação síncrona e assíncrona: Uma fila é associada a cada destino de mensagem. Os processos remetentes fazem as mensagens serem adicionadas em filas remotas e os processos destino removem mensagens de suas filas locais. A comunicação entre os processos remetente e destino pode ser síncrona ou assíncrona. Comunicação síncrona: Os processos remetente e destino são sincronizados a cada mensagem. Nesse caso, send e receive são operações que causam bloqueio. Quando um envio (send) é feito, o processo remetente (ou thread) é bloqueado até que a recepção (receive) correspondende seja realizada. Quando uma recepção é executada, o processo é bloqueado enquanto a mensagem não chegar. Comunicação assíncrona: O uso da operação send é não bloqueante, no sentido de que o processo remetente pode prosseguir assim que a msnsagem tenha sifo copiada para um buffer local, e a transmissão da mensagem ocorre em paralelo com o processo remetente. A operação receive pode ter variantes com e sem bloqueio. ● Variante não bloqueante: O processo destino prossegue sua execução após ter realizado a operação receive, a qual fornece um buffer para ser preenchido em background. Nesse caso, o processo deve receber separadamente uma notificação de que seu buffer possui dados a serem lidos, isso pode ser feito baseado em polling ou em interrupção. ● Variante Bloqueante: a recepção bloqueante pode ser executada por uma thread, enquanto outras threads do processo permanecem ativas; e a simplicidade de sincronização das threads destinos com a mensagem recebida é uma vantagem significativa. Destinos de mensagem: Uma porta local é um destino de mensagem dentro de um computador, especificado como um valor inteiro. Uma porta tem exatamente um destino, mas pode ter varios remetentes. Para proporcionar transparência de localização, podemos fazer uso das seguintes estratégias: ● Os programas clientes se referem aos serviços pelo nome e usam um servidor de nomes ou de associação (binder), para transformar seus nome em localizações de servidor no momento da execução. Isso permite que os serviços sejam movidos enquanto o sistema está em execução. ● O sistema operacional, fornece identificadores independentes da localização para os destinos de mensagem, mapeandoos em um endereço de nível mais baixo para elas serem entregues nas portas, o que possibilita a migração e a movimentação do serviço. Confiabilidade: Um serviço ponto a ponto pode ser descrito como confiável se houver garantia que as mensagens forem entregues, independente de um número razoável de pacotes que possam ter sido eliminados ou perdidos. Em contraste, um serviço de mensagem é não confiavel se não houver garantia de que as mensagens sejam entregues. Quanto à integridade, as mensagens devem chegar não corrompidas e sem duplicação. Ordenamento: Algumas aplicações exigem que as mensagens sejam entregues na ordem de emissão isto é, na ordem em que foram transmitidas pelo remetente. A entrega de mensagens fora de ordem é considerar uma falha por tais aplicações. Soquetes: As duas formas de comunicação (UDP e TCP) usam a abstração de soquete, um ponto de destino para a comunicação entre processos. A comunicação entre processos consiste em transmitir uma mensagem entre um soquete de um processo e um soquete de outro processo. Para que um processo receba mensagens, seu soquete deve estar vinculado a uma porta local e a um endereço IP do computador em que é executado. As mensagens enviadas a esse endereço IP e ao numero de porta, so podem ser recebidas por um processo cujo soquete esteja associado a esse IP e a esse número de porta. Um processo não pode compartilhar portas com outro processo no mesmo computador. Cada computador tem disponível 216 números de portas disponíveis Os processos multicast IP são uma exceção, pois eles compartilham portas. Entretanto , qualquer número de processos pode enviar mensagens para a mesma porta. Cara soquete é associado a um protocolo em particular. Comunicação por datagrama UDP: Um datagrama enviado pelo protocolo UDP é transmitido de um processo remetente para um processo destino sem a existência de confirmações ou novas tentativas de envio. Se ocorrer uma falha, a mensagem poderá não chegar. Um datagrama é transmitido entre processos quando um deles efetua um send e o outro um receive. Como é feita a troca de mensagem: Para enviar ou receber mensagens, um processo precisa primeiro criar uma associação entre um soquete com um endereço IP e com um aporta do host local. Um servidor associará seu soquete a uma porta de serviço uma que ele torna conhecida dos clientes para que eles possam enviar mensagens a ela. Um cliente vincula seu soquere a qualquer porta local livre. O método receive retorna, além da mensagem, o endereço IP e a porta do remetente permitindo que o destinatário envia uma resposta a este. Problemas: ● Tamanho da mensagem: o processo destino precisa especificar um vetor de bytes de um tamanho em particular para receber as mensagens. Se a mensagem for grande demais para esse vetor, ela será truncada na chegada. ● Bloqueio: Os soquetes fornecem operações send não bloqueantes e receive bloqueantes para cominicação por datagrama. A operação send retornaráquando tiver repassado a mensagem para as camadas UDP e IP, que são responsáveis por transmitila para seu destino. Se nenhum processo tiver um soquere associado à porta de destino, as mensagens seráo descartadas. (pag 130) ● Timeouts: a recdepção bloqueante é conveniente para uso por um servidor que esteja esperando para receber requisições de seus clientes. Em algumas situações não é adequado que um processo espere undefinidamente para receber algo, nesse caso, considerase um timeout. ● Recepção anonima: o método receive não especifica uma origem para as mensagens. A invocação ao método receive obtém uma mensagem endereçada para seu soquete, independente da origem. O métodoreceive retorna o endereço IP e a porta local do remetente, permitindo que o destinatário verifique de onde ela veio. Modelo de Falhas: O modelo de falhas pode ser usado em datagramas UDP, que sofrem das seguintes falhas: ● Falhas por omissão: Ocasionalmente, mensagens podem ser descartadas devido a erros de soma de verificação ou porque não há espaço disponível no buffer, na origem ou no destino. ● Falhas por ordenamento: ás vezes, as mensagens podem ser entregues em uma ordem diferente da que foram emitidas. Utilização do protocolo UDP: Para algumas aplicações, é aceitável usar um serviço que esteja exposto a falhas por omissão ocasionais. Por exemplo o Domain Naming Service DNS. As vezes, os datagramas UDP são uma escolha atraente, pois eles não sofrem sobrecargas necessárias a entrega de mensagens garantida. São elas: ● a necessidade de armazenar informações de estado na origem e no destino; ● a transmissão de mensagens extras; e ● a latencia do remetente. Comunicação por fluxo TCP: As seguintes características da rede são ocultadas pela abstração de fluxo (stream): ● Tamanho das mensagens: o aplicatico pode escolher o volume de dados que vai ser enviado ou recebido em um fluxo.A camada TCP decide o volume de dados a coletar, antes de transmitilos efetivamente como um ou mais pacotes IP. ● Mensagens perdidas: Se o remetente não receber uma confirmação dentro de um tempo limite, ele retransmite a mensagem. ● Controle de fluxo: o protocolo TCP tenta combinar a velocidade dos processos que lêem e escrevem em um fluxo. Se o processo que escreve (envia) for rapido demais para o que lê, então ele será bloqueado até que o leitor tenha consumido dados suficientes. ● Duplicação e ordenamento de mensagens: idenficadores de mensagem são associados a cada datagrama IP, o que permite ao destinatário detectar e rejeitar duplicatas ou reordenar as mensagens que chegam fora da ordem de emissão. ● Destinos de mensagens: dois processos que estão em comunicação estabelecem uma conexão antes de poderem se comunicar. O estabelecimento de uma conexão envolve uma requisição de connect, do cliente para o servidor, seguido de uma requisição de accept, do servidor para o cliente, antes que qualquer comunicação possa ocorrer. Em um modelo clienteservidor, isso causa uma sobrecarga considerável para cada requisiçãoresposta. (pag 135). Cliente: Cria um objecto do tipo Socket que tenta estabelecer uma ligação com uma porta de um servidor, numa máquina remota. Para estabelecer esta ligação é necessário indicar o endereço IP e a porta da máquina remota. Servidor: Cria um objecto do tipo “listening” socket associado ao porto servidor. Este socket possui um método que fica bloqueado até que receba um pedido de ligação ao porto correspondente. Quando chega o pedido de ligação, o servidor aceitaa instanciando um novo socket que, tal como o socket do cliente, tem duas streams associadas, uma para saída outra para entrada de dados. Problemas importantes relacionados à comunicação por fluxo: ● Correspondência de itens de dados: doi processos que estejam se comunicando precisam concordar ao conteúdo dos dados transmitidos por um fluxo. Por exemplo, se um processo envia um valot int seguido de um valor double, o outro lado deverá ler um valor int seguido de um valor double. Quando dois processos não cooperam corretamente no uso de um fluxo, o processo leitor pode causar erros ao interpretar os dados, ou ser bloqueado devido a dados insuficientes no fluxo. ● Bloqueio: os dados gravados em um fluxo são mantidos em uma fila no soquete de destino. Quando um processo tentar ler dados de um canal de entrada, obterá dados da fila ou será bloqueado até que dados se tornem disponíveis. O processo que escreve dados em um fluxo pode ser bloqueado pelo mecanismo de controle de fluxo TCP, caso o soquete no outro lado já esteja armazenando o volume máximo de dados permitido. ● Threads: quando um servidor aceita uma conexão, geralmente ele cria uma nova thread, para se comunicar com o novo cliente. ○ Vantagem em se usar uma thread separada para cada cliente é que o servidor pode bloquear quando estiver esperando por dados, sem atrasar os outros cliente. Modelo de falhas: Para satisfazer a propriedade da integridade da comunicação confiável, os fluxos TCP usam somas de verificação para detectar e rejeitar pacotes corrompidos, assim como números de sequência para detectar e rejeitar pacotes duplicados. Quando à propriedade da validade, os fluxos TCP usam timeout e retransmissões para tratar com pacotes perdidos. Portanto há garantia de que as mensagens sejam entregues, mesmo quando alguns dos pacotes das camadas inferiores são perdidos. Representação externa de dados e empacotamento: ● Representação externa de dados : Padrão aceito para representação de estruturas de dados e valores primitivos. ● Empacotamento (marshalling): é o procedimento de pegar um conjunto de itens de dados e montalos em uma forma conveniente para transmissão em uma mensagem. ● Desempacotamento (unmarshilling): é o procedimento inverso de desmontálos na chegada para produzir um conjunto de itens de dados equivalente no destino. Assim, o marshilling consiste na transformação de itens de dados estruturados e valores primitivos em uma representação externa de dados. Analogamente, o unmarshilling consiste na geração de valores primitivos a partir de sua representação externa de dados e na reconstrução das estruturas de dados. Comunicação clienteservidor: Projetada para suportar as funções e trocas de mensagem em interações clienteservidor típicas. Interações clienteservidor (send receive para datagramas UDP) ● as confirmações são redundantes, pois as requisições são seguidas pelas respostas; ● o estabelecimento de uma conexão envolve mensagens extras, além do par exigido para a requisição e sua resposta; ● o controle de fluxo é redundante para a maioria das invocações, que passam apenas pequenos argumentos e resultados. O protocolo requisiçãoresposta: Baseado em 3 primitivas de comunicação: ● doOperation:Usado pelos clientes para invocar operações remotas. Seus argumentos especificam o objeto remoto e o método a ser executado. Seu resultado é uma resposta RMI. ● getRequest: Usado por um processo servidor para ler as requisições de serviço.Quando o servidor tiver executado o método no objeto especificado, usará sendReply para enviar a mensagem de resposta para o cliente. O cliente, ao receber a mensagem resposta, fará com que o método doOperation original seja desbloqueado e a execução do programa cliente continue. Modelo de falhas do protocolo pedidoresposta: Se as três operações são implementadas sobre UDP, então sofrem do mesmo tipo de falhas de comunicação que aquele protocolo: . falhas de omissão . Mensagens não são garantidamente entregues por ordem. Além disso, podem ocorrer falhas no processo: assumemse “crash failures”, se o processo parar e permanece parado não produzindo valores arbitrários Timeouts: Para resolver o problema das mensagens perdidas, a doOperation permite definir um serviço de tempo, timeout. Após esgotar o timeout, a operação pode retornar com uma indicação de erro. Geralmente, em vez de retornar, reenvia a mensagem várias vezes para ter a certeza que o problema foi “o fim” do servidor e não mensagens perdidas. Perda da mensagem de resposta: Se a resposta se perdeu, o servidor ao receber novo pedido pode processar o método novamente (caso seja idempotente) e reenviar os resultados. Operações idempotentes: Têm o mesmo efeito se executadas uma ou mais vezes. Ex: Operação que adiciona um elemento a um conjunto.Contraexemplo: adicionar um montante a uma conta bancária Em vez de reexecutar o método, pode reenviar a mensagem, desde que esta fique armazenada num ficheiro que irá conter o registo do histórico do servidor. Problema: consumo de memória; Solução: o servidor ser capaz de identificar que o registro pode ser apagado do histórico, i.é, quando a resposta tiver sido recebida. Semânticas perante falhas: ● Maybe (talvez): perante perdas, não é repetido o pedido de invocação (em geral não é aceitável). ● Atleastonce (pelomenosumavez) : perante perdas ou atrasos na resposta, são reenviados pedidos de execução que não são reconhecidos como duplicados pelo servidor (só deve ser usado em operações idempotentes). ● Atmostonce (no máximoumavez) : Os possíveis reenvios de pedidos são reconhecidos como duplicados pelo servidor (é a semântica habitual dos sistemas de invocação remota) CAPITULO 5 Middleware: É o sofwater que fornece um modelo de programação acima dos blocos de construção básicos de processos e de passagem de mensagens. Um aspecto importante do middleware é a transparência da localização e a independência dos detalhes dos protocolos de comunicação, sistemas operacionais e hardware de computador. Algumas formas de middleware permitem que componentes distintos sejam escritos em diferentes linguagens de programação. Transparência de localização: na RPC, o cliente que chama um procedimento não pode identificar se ele é executado no mesmo processo ou em um outro processo, possivelmente em um computador diferente. O cliente também não precisa saber a localização do servidor. Protocolos de comunicação: os protocolos que suportam as abstrações de middleware são independentes dos protocolos de transporte subjacentes. Por exemplo, o protocolo requisiçãoresposta pode ser implementado sobre UDP ou sobre TCP. Hardware de computador: Usamse padrões de representação externa de dados no marshilling e unmarshilling de mensagens. Eles ocultam as diferenças devido às arquiteturas de hardware, como a ordem dos bytes. Sistemas Operacionais: as abstrações de mais alto nível fornecidas pela camada de middleware são independentes dos SOs subjacentes. Uso de varias linguagens de programação: Isso é obtido pelo uso de uma linguagem de definição de interface (IDL) para definir interfaces. Interfaces: Forma de organizar um programa como um conjunto de módulos que podem se comunicar. Uma interface é definida para cada módulo. A interface de um módulo especifica os procedimentos e as variáveis que podem ser acessadas a partir de outros módulos. Interfaces em sistemas distribuídos: Apenas os métodos são acessíveis através de interfaces. Interface remota: Cada objeto remoto tem uma interface remota que especifica quais dos seus métodos podem ser invocados remotamente. Interface de serviço: no modelo clienteservidor, cada servidor fornece um conjunto de procedimentos que estão disponíveis para uso pelos clientes. Por exemplo, um servidor de arquivos forneceria procedimentos para ler e gravar arquivos. O termo interface de serviço é usado para se referir à especificação dos procedimentos oferecidos por um servidor, definindo os tipos dos argumentos de entrada e saída de cada um dos procedimentos. O modelo de Objeto: ● Referencias de objeto: As referências de objeto são valores de primeira classe, significando que eles podem, por exemplo, ser atribuídos a variáveis, passados como argumentos e retornados como resultados de métodos. ● Interfaces: Uma interface também define os tipo que podem ser usados para declarar o tipo de variáveis, ou dos parâmetros, e valores de retorno dos métodos. Interfaces não tem construtores. ● Ações: Em um programa OO, a ação é iniciada por um objeto invocando um método em outro objeto. Uma invocação pode incluir informações adicionais (argumentos) necessárias para executar o método. Uma ação é um encadeamento de invocações relacionadas de métodos, cada uma com seu respectivo retorno. A ativação de um método pode ter 3 efeitos:, 1. o estado do receptor pode ser alterado; 2. um novo objeto pode ser instanciado; por exemplo, pelo uso de um construtor em JAVA ou C++; 3. outras invocações podem ocorrer nos métodos de outros objetos. ● Exceções: As exceções proporcionam uma maneira de tratar com condições de erro, sem complicar o código. Além disso, cada cabeçalho de método lista, explicitamente, como exceções as condições de erro que pode encontrar, permitindo que os usuários desse método as tratem adequadamente. ● Coleta de lixo: É necessário fornecer uma maneira de liberar o espaço em memória ocupado pelos objetos, quando eles não são mais necessários. Quando um objeto não está mais acessível, recupera o espaço em memória e o torna disponível para alocação por outros objetos. O modelo de Objetos distribuídos: Cada processo contém um conjunto de objetos, alguns dos quais podem receber invocações locais e remotas, enquanto outros objetos podem receber somente invocações locais. Referencia de objeto remoto: outros objetos podem invocar os métodos de um objeto remoto, se tiverem acesso à sua referência de objeto remoto. As referências de objeto remoto são análogas às locais, pois: 1. o objeto remoto que vai receber uma invocação a método remoto é especificado pelo incovador como uma referência de objeto remoto; e 2. as referências de objeto remoto podem ser passadas como argumentos e resultados de invocações a métodos remotos. Interface remota: todo objeto tem uma interface remota especificando qual de seus métodos pode ser invocado de forma remota. Objetos em outros processos só podem invocar métodos pertencentes à interface remota. Ações em um sistema de objeto distribuído: Assim como no caso não distribuído, uma ação é iniciada por uma invocação a método, a qual pode resultar em mais invocações a métodos em outros objetos. No caso distribuído, os objetos envolvidos em um encadeamento de invocações relacionadas podem estar localizados em diferentes processos ou em diferentes computadores. – requisição para executar alguma operação em um objeto remoto – obtenção de referências de objetos remotos – instanciação de objetos remotos (através de fábricas) Coleta de lixo em um sistema de objeto distribuído: A coleta de lixo distribuída geralmente é obtida pela cooperação entre o coletor de lixo local existente e um módulo adicionado que realiza uma forma de coleta de lixo distribuída, normalmente baseada em contagem de referência. – requer contagem de referências explícita – rastreamento de todas as referências trocadas – pouco eficiente ou difícil de ser implementada Exceções: A invocação a método remoto deve ser capaz de lançar exceções, como timeouts, causados pelo envio de mensagens, assim como aquelas ocorridas durante a execução do método invocado. erros de aplicação: gerados pela lógica do servidor – erros de sistema: gerados pelo middleware – conduzidos de volta ao cliente sob a forma de mensagens Representação de Referências de Objetos: ● Necessária quando objetos remotos são passados como parâmetro ● A referência é serializada (não o objeto) ● Contém toda informação necessária para identificar (e endereçar) um objeto unicamente no sistema distribuído. Semântica de invocação RMI: ● Semântica de invocação talvez: O método remoto pode ser executado uma vez ou não ser executado. A semântica talvez surge quando nenhuma das medidas de tolerância a falhas é aplicada. Tipos de falhas são: ○ Falha por omissão, se a mensagem de invocação ou de resultado for perdida ○ falhas por colapso, quando o servidor que contém o objeto remoto falha.Se a mensagem de resultado não tiver sido recebida após um dado tempo limite (timeout) e não houver novas tentativas, não haverá certeza se o método foi executado. Se a mensagem de invocação foi perdida, então o método não terá sido executado. Por outro lado, o método pode ter sido executado e a mensagem de resultado, perdida. Uma falha por colapso pode ocorrer antes ou depois do método ser executado. A semântica talvez é útil apenas para aplicações nas quais são aceitáveis invocações malsucedidas ocasionais. ● Semântica de invocação pelo menos uma vez: Com a semântica de invocação pelo menos uma vez, o invocador recebe um resultado quando o método foi executado pelo menos uma vez, ou recebe uma exceção, informando que nenhum resultado foi obtido. Mascara as falhas por omissão e pode sofrer os seguintes tipos de falhas: ○ falhas por colapso ○ falhas arbitrarias (bizantinas), nos casos em que a mensagem de invocação é retransmitida, o objeto pode recebêla e executar o método mais de uma vez possivelmente causando o armazenamento ou o retorno de valores errados. ● Semântica de invocação no máximo uma vez: com a semântica de invocação no máximo uma vez, ou o ativador recebe um resultado quando o método foi executado exatamente uma vez, ou em caso contrário, uma exceção. Transparência: Todas as etapas necessárias para empacotamento e trocas de mensagens são ocultadas do programador que faz uma chamada de procedimento remoto. Módulo de comunicação: O módulo de comunicação usa apenas os três primeiros elementos, os quais especificam o tipo de mensagem, sua requestId e a referência remota do objeto a ser invocado. O identificador de método, e todo o marshilling e unmarshilling, é de responsabilidade do software RMI. O módulo de comunicação no servidor seleciona o despachante para a classe do objeto a ser invocado, passando sua referência local, obtida a partir do módulo de referência remota através do identificador do objeto remoto dado pela mensagem de requisição. ● Cuida do protocolo de comunicação de mensagens entre cliente e servidor ● Implementa o protocolo requisiçãoeresposta ● Define os tipos de mensagens utilizados ● Provê a identificação das requisições ● Semântica de chamadas (ex.: atmostonce) ● Retransmissão e eliminação de duplicatas Módulo de referências remotas: É responsável pela transformação entre referências de objeto local e remoto e pela criação de referências de objeto remoto. O módulo de referência remota de cada processo contém um tabela de objetos remotos para registrar a correspondência entre as referências de objeto local desse processo e as referências de objeto remoto. A tabela inclui: ● Uma entrada para todos os objetos remotos mantidos pelo processo. ● Uma entrada para cada proxy local. ● Quando um objeto remoto precisa ser passado como argumento ou resultado pela primeira vez, o módulo de referência remota cria uma referência de objeto remoto, a qual adiciona em sua tabela. ● Quando uma referência de objeto remoto chega em uma mensagem de requisição ou resposta, é solicitada ao módulo de referência remota de objeto local, a qual pode se referir a um proxy ou a um objeto remoto. No caso da referência de objeto remoto não estar na tabela, o RMI cria um novo proxy e pede ao módulo de referência remota para adicionalo na tabela. Serventes: Um servente é uma instância de uma classe que fornece o corpo de um objeto remoto. É o servente que trata as requisições remotas repassadas pelo esqueleto correspondente. Os serventes são partes integrantes do processo servidor. Eles são criados quando os objetos remotos são instanciados e permanecem em uso até não serem mais necessários, sendo finalmente excluídos. O software RMI: É uma camada de software middleware entre os objetos do aplicativo e os módulos de comunicação e de referência remota. ● Proxy: A função de um proxy é tornar a invocação a método remoto transparente para os clientes, comportandose como um objeto local para o invocador; mas, em vez de executar uma invocação local, ele encaminha uma mensagem para um objeto remoto. Ele oculta os detalhes de referência de objeto remoto, do marshilling de requisições e do unmarshilling de respostas, e do envio e recepção de mensagens do cliente. ● Despachante: um servidor tem um despachante e um esqueleto para cada classe que representa um objeto remoto. O despachante e o proxy usam o mesmo methodId para os métodos da interface remota. Funcionamento: O servidor tem um despachante e um esqueleto pada a classe de um objeto remoto. O despachante recebe a mensagem de requisição do módulo de comunicação e utiliza o methodId para selecionar o método apropriado no esqueleto, repassando a mensagem de requisição. ● Esqueleto: a classe de um objeto remoto tem um esqueleto, o qual implementa os métodos da interface remota, mas de uma forma diferente dos métodos implementados no servente que personifica o objeto remoto. Um método de esqueleto desempacota os argumentos na mensagem de requisição e invoca o resultado, junto com as exceções, em uma mensagem de resposta que é enviada para o método do proxy que fez a requisição. O vinculador (binder) : Um vinculador é um serviço separado que mantém uma tabela contendo mapeamentos dos nomes textuais para referências de objeto remoto. Ele é usado pelos servidores para registrar seus objetos remotos pelo nome e pelos clientes, para pesquisalos. Proxy dinâmico: – genérico, independente de interface – utiliza uma definição de interface acessível dinamicamente para formatar as requisições ● repositório de interfaces – útil quando não se conhece a interface em tempo de programação ● Skeleton dinâmico – permite receber chamadas destinadas a “qualquer” tipo de objeto/interface – útil na construção de servidores “genéricos” Progamas clientes e servidores: O programa servidor contem as classes para os despachantes e esqueletos, junto com as implementações das classes de todos os serventes que suporta. Contém uma sessão de inicialização que é responsável por criar e inicializar pelo menos um dos serventes que fazem parte do servidor. Mais serventes podem ser criados em resposta à requisições dos clientes. O programa cliente conterá as classes dos proxies de todos os objetos remotos que ativará. Ele pode usar um vinculador para pesquisar referências de objeto remoto. Trheads no servidor: Para evitar que a execução de uma invocação atrase a execução de outra, geralmente os servidores criam uma thread para cada invocação remota. Ativação de objetos: consiste na criação de um objeto ativo a partir do objeto passivo correspondente, pela criação de uma nova instância de sua classe e pela inicialização de suas variáveis de instância a partir do estado armazenado. Os objetos passivos podem ser ativados por demanda; por exemplo, quando eles precisam ser invocados por outros objetos. Repositório de objetos persistentes: Um objeto que mantém seu estado entre invocações é chamado de objeto persistente. Geralmente os objetos persistentes, são gerenciados por repositórios de objetos persistentes, que guardam seus estados em uma forma empacotada no disco. Coleta de lixo distribuída: O objetivo do coletor distribuído é garantir que, se uma referência local ou remota para um objeto ainda for mantida em algum lugar, em um conjunto de objetos distribuídos, então o próprio objeto continuará a existir; mas assim que não houver mais nenhuma referência para ele, esse objeto será coletado e a memória por ele utilizada será recuperada.(PAG 181) Chamada de procedimento remoto: Uma chamada de procedimento remoto é muito parecida com uma invocação a método remoto, poisum processo cliente chama um procedimento que está sendo executado em um processo servidor. O software RPC não se preocupa com objetos e referências de objeto. O cliente que acessa um serviço inclui um procedimento stub para cada procedimento da interface de serviço. Stub: É semelhante ao proxy. Ele se comporta como um procedimento local para o cliente, mas em vez de executar a chamada, ele empacota o identificador de procedimento e os argumentos em uma mensagem de requisição e a envia para o servidor por meio de seu módulo de comunicação. Quando a mensagem chega ele desempacota os resultados. Interfaces: ● Provêem acesso às características externamente visíveis de um objeto ou módulo – em geral: métodos e variáveis ● Papel fundamental no encapsulamento ● Em sistemas distribuídos: apenas os métodos são acessíveis através de interfaces ● Passagem de parâmetros: copyrestore – parâmetros de entrada e saída – ponteiros não são permitidos – objetos como parâmetros: referência de objeto RMIregistry: é o vinculador da RMI Java. Uma instancia de RMIresgistry deve ser executada em cada computador servidor que contenha objetos remotos. Ele mantém uma tabela mapeando nomes textuais no estilo URLs, em referência para objetos remotos contidos nesse computador.
Compartilhar