O que exatamente é computação distribuída? [fechadas]


14

O que exatamente constitui a computação distribuída e como ela difere da computação paralela / simultânea?

O uso de mutexes e semáforos em vários segmentos paralelos tentando sincronizar para acessar um recurso constitui um problema no domínio da computação distribuída?

Respostas:


8

O que exatamente constitui a computação distribuída?

A computação distribuída é uma coleção inerentemente paralela de elementos de processamento que se comunicam entre si para resolver um ou mais problemas. Esses elementos de processamento são suficientemente separados um do outro para que não seja prático criar um tecido de mensagens confiável e oportuno entre eles e, portanto, torna-se impossível que exista um conhecimento global do estado do sistema. Particularidades de mensagens com sistemas distribuídos são que as mensagens irá se perder, vai ficar ilegível, vai chegar atrasado - soluções neste espaço tem que levar isso em conta. Assim, a programação distribuída trata de lidar com redes e mensagens, paralelismo e falta de informação global.

O método mais fácil de solucionar os problemas é tornar um único elemento de processamento especial, ou seja, autoritário para uma informação específica. Em seguida, os outros elementos podem consultá-lo sempre, ou armazenar em cache as informações e esperar que elas não desatualizem (já que não podem contar com informações sobre alterações). Essa é a arquitetura clássica de cliente / servidor.

A computação na Internet é computação distribuída, mas sem a capacidade de controlar o que a maioria dos nós distribuídos realmente faz.

Os vários encadeamentos paralelos que tentam sincronizar para acessar um recurso constituem um problema no domínio da computação distribuída?

Eles constituem uma solução possível que é útil na criação do modelo cliente / servidor, mas a um custo de um aumento potencialmente dramático na contenção de recursos. Para leituras, isso não é muito importante (desde que haja hardware suficiente), mas para gravações, é realmente um grande problema.

O que você tenta evitar, porém, são bloqueios distribuídos. A falta de mensagens oportunas e confiáveis ​​mata absolutamente os protocolos de decisão distribuídos, a menos que você use algo como o protocolo Paxos , mas há muitas ressalvas. O problema fundamental da computação distribuída é que "coisas ruins acontecem com as mensagens". Protocolos de nível relativamente baixo, como o TCP, diminuem os problemas, mas você ainda pode se soltar bastante.


6

Vários threads paralelos que tentam sincronizar para acessar um recurso constituem um problema no domínio da computação distribuída?

Eles funcionam se esses threads estiverem em execução em máquinas diferentes ou mesmo se estiverem em execução na mesma máquina, mas em processos diferentes.


1
Threads rodando em máquinas diferentes basicamente não podem ser sincronizados da maneira tradicional de mutexes e semáforos.
Jan Hudec

@JanHudec Acho que esse foi o ponto da pergunta do entrevistador. Sem instruções atômicas de teste e configuração, comparação e troca ou memória compartilhada, a computação distribuída precisa contar com mensagens entre máquinas para sincronização. Felizmente, existem algoritmos que fazem isso.
Caleb

Não concordo com o "felizmente". Os algoritmos são complicados e não são tolerantes a falhas, portanto devem ser evitados.
Jan Hudec

5

A computação distribuída é um sistema de computação cujo processamento ocorre em computadores diferentes (ou seja, em um sistema distribuído). Os programas individuais se comunicam por meio de uma série de canais de comunicação. Esses canais geralmente são conexões de rede (soquetes TCP, por exemplo), mas geralmente usam outros protocolos e dispositivos de comunicação (como DeviceNET, BACNet, SECS-2, Modbus, etc.) ou até mesmo protocolos personalizados para um dispositivo específico.

Os sistemas distribuídos são geralmente muito mais complicados do que os sistemas projetados para serem executados em um único computador. Além dos problemas de simultaneidade e bloqueio de recursos com os quais os aplicativos multiencadeados precisam lidar, os sistemas distribuídos precisam lidar com falhas de comunicação e processamento de falhas de nós. Transações (e reversão) que exigem vários processadores para realizar também podem ser complicadas.

Os sistemas distribuídos assumem várias formas e atualmente são usados ​​em muitas aplicações. Aplicativos da Web são sistemas distribuídos. Um sistema N-Nivelado geralmente possui pelo menos N processadores diferentes (com aplicativos diferentes). Os sistemas distribuídos também são usados ​​em muitos sistemas de automação de fábrica.

O artigo sobre computação distribuída na Wikipedia vale uma leitura.

Em resposta à sua pergunta sobre se um aplicativo com vários threads constitui um aplicativo distribuído - se os threads estiverem em execução em um único computador, o sistema não será distribuído. Ele precisa resolver alguns dos problemas inerentes aos sistemas distribuídos, mas não todos.


3

Estritamente falando, "computação distribuída" é qualquer solução que envolva o processamento de uma única transação / solicitação / cálculo em mais de um computador.

Você também encontrará o termo "Sistemas Distribuídos", que é um termo genérico para Windows, Unix e outros servidores de sistemas pequenos que seriam implantados originalmente fora do data center central. Embora seja mais normal que esses sistemas sejam implantados no data center hoje em dia, o prazo permaneceu.


3

Para responder à sua pergunta geral sobre o que constitui a computação distribuída, eu recomendaria o artigo Uma nota sobre computação distribuída de Ann Wollrath, Geoff Wyant, Jim Waldo e Samuel C. Kendall . Ele cobre o histórico recente de sistemas distribuídos e suas falhas e propõe que a computação distribuída requer pensar de maneira diferente sobre os problemas envolvidos.

Embora nem os mutexes nem os semáforos sejam mencionados no documento, ele fornece informações valiosas sobre a engenharia adequada de um sistema de software distribuído.

Quanto ao motivo pelo qual seu entrevistador perguntou sobre mutexes e semáforos, eu concordo com o @Caleb:

Eles funcionam se esses threads estiverem em execução em máquinas diferentes ou mesmo se estiverem em execução na mesma máquina, mas em processos diferentes.

A única coisa que eu acrescentaria é que os mutexes e semáforos são primitivos de bloqueio de baixo nível que permitem distribuir o trabalho em vários dispositivos de computação, e sua operação é (geralmente) vital para o sucesso do aplicativo. Obviamente, isso depende do idioma e da tecnologia usada. Se você estiver usando Erlang ou Scala, provavelmente usará a simultaneidade baseada em modelo do Actor, em vez da simultaneidade tradicional baseada em bloqueio.


2

A palavra diz tudo. Você deve executar algumas operações de computação e, se puder distribuir partes dessa computação, de modo que cada computação funcione independentemente da outra e, quando tudo estiver pronto, você combina o resultado de cada computação para obter a resposta da computação principal. O exemplo seria: Map-Reduce


1

Tivemos um curso sobre "sistemas distribuídos" e, embora eu não me lembro exatamente da definição, foi na linha de:

  1. pode ser executado em vários nós separados que se comunicam via mensagens (não é possível compartilhar memória)
  2. objetos podem ser migrados entre nós
  3. os objetos mantêm sua identidade quando migrados e podem ser endereçados de forma transparente quando migrados
  4. objetos não dependem do nó que os criou
  5. o sistema pode lidar com a adição e remoção de nós

(Eu acredito que havia mais um pouco e não tenho certeza sobre o último ponto)

Agora, no curso, aprendemos como implementar transações distribuídas e bloqueio distribuído. A lição é que o bloqueio distribuído é basicamente implementado usando transações distribuídas, o que é inversamente comparado ao que você faz localmente, e que inerentemente não é tolerante a falhas, o que acaba com o objetivo de ter o sistema distribuído em primeiro lugar.

Edit: Essa definição é para "sistema distribuído" no sentido estrito do sistema operacional ou sistema de banco de dados e, em oposição ao sistema meramente cliente-servidor. Qualquer coisa que satisfaça a primeira condição pode ser chamada distribuída em alguns contextos.

Coincidentemente, a definição corresponde à diferença entre sistemas de controle de versão distribuídos e tradicionais, todos os quais são pelo menos cliente-servidor e geralmente também são replicados.


Esse é um estilo muito particular de computação distribuída. Existem outros, e a única coisa que eles realmente compartilham é o primeiro ponto. Mensagens são críticas, as outras ... nem tanto.
Donal Fellows

1
@DonalFellows: Bem, este é um sistema distribuído , no sentido de sistema operacional ou de banco de dados. Lá, a migração e a tolerância a falhas são os principais pontos para fazê-las. "Computação" distribuída é qualquer coisa executada em vários nós.
Jan Hudec

Bem, nesse caso, deveria ter coberto o negócio de chegar a uma decisão. Isso é difícil em um sistema distribuído. (Além disso, a maioria dos trabalhos acadêmicos que eu vi sobre o tema fazer suposições totalmente irrealistas sobre a topologia gráfico subjacente, dando conclusões válidas, mas inúteis.)
Donal Fellows

@DonalFellows: O curso, claro, cobriu o negócio de tomar decisões e toda essa arbitragem e dividir as coisas cerebrais (não muito profundamente, era apenas de nível introdutório). Mas isso não está definindo a propriedade do sistema distribuído. É apenas um obstáculo que você precisa pular se quiser criar um.
Jan Hudec

0

Computação distribuída, o termo "não comercialização" para computação corporativa, que você pode ouvir muito mais na vida real. No entanto, a ideia geral, conforme apontada por outros, é "você está usando mais de um computador para fazer o trabalho"

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.