Programação Distribuída: Características, Vantagens e Desvantagens

Classificado em Computação

Escrito em em português com um tamanho de 12,07 KB.

Programação distribuída: desenvolvimento e execução de sistemas

que executam de forma concorrente e descentralizada em um ou mais computadores. Um dos maiores exemplos da atualidade são os mineradores de bitcoins, é praticamente impossível rodá-los em apenas um computador, devido ao poder de processamento necessário, aí, entra a programação distribuída, descentralizando em mais computadores conseguindo suprir a demanda de processamento.


Aspectos: Hardware -> autonomia/independência.

Software -> Sistema Único.


Características: hardware autônomo, software cria abstrações

vendo-os como um sistema unico; Execução concorrente. Compartilhamento de recursos. Troca de mensagens. Inexistência de relógico global. Falhas independentes. Componentes e recursos redundantes.


Vantagens:

Maior velocidade (por ter execuções concorrentes e compartilhamento de recursos).

Confiabilidade: Por ter redundância.

Compartilhamento de dados: Por ter recursos compartilhados.


Desvantagens:

Depuração mais complicada: por ter vários sistemas, é necessário saber onde exatamente está o erro/problema e isso torna-se mais difícil.

Desenvolvimento e gerenciamento mais complexo: por ser vários sistemas, obviamente seu desenvolvimento e gerenciamento é mais complexo.

Dificuldade na segurança: difícil garantir que todos os end-points estejam seguros.


Heterogeneidade: Diferentes hardwares, diferentes SOs, diferentes dados.

Solução -> middleware.

Padronização/Abertura: Padrões abertos com especificação e documentação. Solução -> independêcia de fornecedor.

Segurança: Preciso garantir confidencialidade, integridade e disponibilidade. Solução -> soluções de criptografia.

Escalabilidade: O sistema deve funcionar sem problemas, independente do número de usuários, dados recursos. Solução -> usar estruturas de dados adequadas.

Tratamento de Falhas: Manter o sistema disponível sob qualquer circunstância. Solução -> redundância.

Concorrência: Processo natural de um SD que para que funcione, deve ter a exclusão mútua no acesso a recursos compartilhados.

Transparência: Esconder a separação física dos componentes a fim de parecer um sistema único. Ex: para transparência de concorrência -> exclusão mútua.


Middleware: camada entre o SO e as aplicações que mascara a heterogeneidade

e provê um modelo mais conveniente de programação. Ex: Sun RPC, RMI, etc.


Stateless: Significa que o estado do serviço não é levado em consideração entre duas conexões remotas.

Cada requisição carrega suas próprias credenciais, não há necessidade de estabelecer/fechar conexões, é simples, queda de servidor não afeta clientes.


Stateful: Requisições são orientadas à conexão, isto é, cada requisição está orientada à alterações feitas previamente.

Servidores mantém informações prévias, problemas com quedas de servidores/clients.


Flynn:

SISD -> Um único fluxo de instruções sobre um único fluxo de dados. Ex: Von Neumann

MISD -> Múltiplas P (unidades de processamento) com suas C (unidade de controle) recebendo fluxo diferente de dados. As Ps executam diferentes instruções sobre o mesmo fluxo de dados. Ex: Systolic Array.

SIMD -> Processamento feito por 1 P e 1 C. Mesma instrução é enviada para diversas Ps. As Ps funcionam em paralelo e uma única instrução é executada sobre diferentes dados. SIMD exploram paralelismo de dados. Ex: Máquinas Vetoriais.

MIMD -> Cada C recebe 1 fluxo de instruções e repassa para P para que seja executado sobre seu fluxo. Cada P executa seu próprio programa sobre seus próprios dados. Maior flexibilidade e paralelismo de processos. Ex: Servidores dual, quad, etc.


Memória Distribuída: Implementada com vários módulos, módulo próximo do processador.

Memória Centralizada: Encontra-se à mesma distância de todos processadores.


Memória Compartilhada: Único espaço de endereçamento usado para comunicação entre processadores, processos acessam variáveis compartilhadas.

Load/Store.

Memória Não-Compartilhada: Múltiplos espaços de enderaçamento privados. Comunicação com troca de mensagens. Send/Receive.


Multiprocessadores: Máquina paralela feita a partir de processadores convencionais.

Todos P acessam memórias compartilhadas através de uma rede de interconexão. Possui apenas um espaço de endereçamento. Load/Store.


UMA: Memória centralizada, latência de acesso igual à todas as memórias, barramento é usado para comunicação.

NUMA: Memória distribuída, endereço de endereçamento único, acesso não uniforme, distância variável, tempo de acesso à memória local baixo e menor que às demais.


Multicomputadores: são construídos a partir da replicação de TODA a arquitetura convencial e não só dos processadores.

São compostos por 'armários' compostos por dezenas de 'gavetas' onde cada uma possui diversos processadores. Processadores possuem memória local de acesso restrito. Comunicação feita por troca de mensagens.


NoRMA: Replicação inteira da arquitetura que faz com que cada nó só consiga alcançar sua memória local.


Comunicação entre processos.


Memória Compartilhada: os processos compartilham variáveis e trocam informações através do uso delas.

Sem Memória Compartilhada: os processos compartilham informações através de troca de mensagens. S.O responsável pelo mecanismo de comunicação entre os processos.


Para um sistema conseguir realizar a troca de mensagens é preciso que ele tenha:


Simplicidade: construção de novas operações que operem com existentes para maior simplificação.

Semântica uniforme: comunicação local e remota através de funções o mais próximas possíveis.

Eficiência: reduzir o número de mensagens à menor quantidade possível.

Confiabilidade: garantir a entrega da mensagem.

Flexibilidade: possibilidade de usar só a funcionalidade requerida.

Segurança: suporte à autenticação, privacidade.

Portabilidade: disponibilidade de IPC em plataformas heterogêneas.


Na sincronização de mensagens, haverá dois tipos, síncrona e assíncrona:

Quando send e receive são bloqueantes, chamamos de síncrona.

Caso contrário, chamamos de assíncrona.


Com receive bloqueantes, o processo receptor fica bloqueado até a chegada da mensagem. O problema disso é ficar bloqueado para sempre em caso de time-out.


No endereçamento, há dois tipos, explícito e implícito.

No explícito, o processo com o qual se quer comunicar é explicitamente identificado.

No implícito, o processo com o qual se quer comunicar não é identificado. Ex: envio para qualquer receiver que desempenho uma função/serviço.


No explícito, o sender identifica o receiver e o receiver identifica o sender.

No implícito, o sender identifica o receiver e o receiver recebe de qualquer sender.


Para identificar um processo é necessário usar dois métodos, o transparente e o não transparente.


Transparente: identificador do processo não deve ter embutida informação de localização do processo. Há a necessidade de realizar a tradução de nomes.

Não transparente: especifica o identificador da máquina. Um dos problemas pode ser se o processo migrar/mover-se, gerando overhead.


Bufferização: Está relacionado com o sincronismo da comunicação.


Null Buffer: não há espaço temporário para armazenar a mensagem. Usado apenas para comunicação síncrona.

Single Message Buffer: para comunicação síncrona. a ideia é manter a mensagem pronta para uso no local de destino.

Unbounded-capacity buffer: para comunicação assíncrona. o enviador não espera receptor. Impossível na prática.

Finite-bound buffer: É necessário uma estratégia para buffer overflow.


Problema: execução de um pedido/request no destinatário não tem sucesso.

Há três estratégias para isso: four-message, three-message, two-message.


Modelo Cliente/Servidor

Cliente: Faz a requisição.

Servidor: Recebe a requisição.


Para qualquer comunicação, um dos lados deve iniciar a comunicação e esperar indefinidamente que o outro lado responda.


Modelo P2P


São sistemas distribuídos no qual os membros da rede são iguais em funcionalidade.

Permitem que os pares compartilhem recursos diretamente, sem haver intermediários.


Os sistemas P2P devem suportar os seguintes requisitos:


Comunicação direta entre pares, nós com conectividade variável, nós com autonomia parcial, escalabilidade.


Ex: Skype, Napster, Torrent.


Arquitetura Centralizada: utiliza um servidor central para controle da rede e publicação da pesquisa de conteúdo.

Acesso feito diretamente pelos peers, o problema principal é ter um ponto único de falha. Ex: Napster


Arquitetura Descentralizada: todos os peers possuem funcionalidade equivalente.

Todos os nós possuem papel equivalente, gera alto tráfego na rede, desempenho ruim das pesquisas. Ex: JxTA

Arquitetura Híbrida: alguns peers especiais, chamados supernós/supernodos, possuem papel diferenciado na rede. Eles permitem o ingresso de nós na rede, podendo gerenciá-los, indexá-los e etc. Após localizado, um recurso pode ser obtido a partir da interação direta entre nós. A falha de um supernó pode ser tolerada, elegendo dinamicamente outro nó.


O principal objetivo da comunicação em grupo é o envio da mensagem para um grupo de processos através de uma única ação.

Os grupos devem ser dinâmicos e a mensagem é recebida por cada um de seus membros.


One-to-many: também chamado de multicast.

Grupo aberto: qualquer processo pode mandar mensagens para o grupo de todo.

Grupo fechado: somente membros do grupo podem mandar mensagens para o grupo.

Multicast é normalmente assíncrono.

Buferizada: mensagem armazenada para o processo receptor.

Não-buferizada: mensagem chega e processo receptor não está pronto. SO descarta a mensagem.

Comunicação indireta.

Semântica de envio: send-to-all: copia da mensagem mandada para cada processo do grupo. bullet-board: mensagem endereçada a um canal, processos receptores pegam a mensagem do canal.


Ex: achar servidor oferecendo um tipo determinado de serviço.


Many-to-one:

Recepção seletiva: recebedor controla dinamicamente de quem quer receber.

Recepção não seletiva: recebedor quer receber de qualquer um do grupo.


Many-to-many:

Possui entrega ordenada de mensagens. A ordenação possui serialização das mensagens.

Em one-to-many temos que sequenciar multicasts, em many-to-one temos que ordenar de maneira simples, em many-to-many são vários enviadores e vários recebedores, podendo variar no atraso visto que depende da posição dos mesmos.


IP Multicast: É uma comunicação one-to-many não confiável, ela é considerada não confiável porque não há a garantia de entrega das mensagens.

não há como garantir que um pacote atinja todos os usuários de um grupo multicast. O JGroups pode resolver esse problema, ele é um framework para comunicação em um grupo confiável, ele irá agir como um manipulador para um determinado grupo, podendo, dessa maneira, garantir a entrega das mensagens.

Entradas relacionadas: