Conforme apontado por @Raphael, a Computação Distribuída é um subconjunto da Computação Paralela; por sua vez, a computação paralela é um subconjunto da computação simultânea.
Simultaneidade refere-se ao compartilhamentode recursos no mesmo período de tempo. Por exemplo, vários processos compartilham a mesma CPU (ou núcleos da CPU) ou compartilham memória ou um dispositivo de E / S. Os sistemas operacionais gerenciam recursos compartilhados. Máquinas multiprocessadoras e sistemas distribuídos são arquiteturas nas quais o controle de simultaneidade desempenha um papel importante. A simultaneidade ocorre no nível do hardware e do software. Vários dispositivos operam ao mesmo tempo, os processadores têm paralelismo interno e trabalham com várias instruções simultaneamente, os sistemas têm múltiplos processadores e os sistemas interagem através da comunicação em rede. A simultaneidade ocorre no nível dos aplicativos no tratamento de sinais, na sobreposição de E / S e processamento, na comunicação e no compartilhamento de recursos entre processos ou entre threads no mesmo processo.
Dois processos (ou threads) em execução no mesmo sistema para que sua execução seja intercalada no tempo são simultâneos: processos (threads) estão compartilhando o recurso da CPU. Gosto da seguinte definição: dois processos (threads) em execução no mesmo sistema são simultâneos se e somente se o segundo processo (thread) iniciar a execução quando o primeiro processo (thread) ainda não tiver terminado sua execução.
A simultaneidade se torna paralelismo quando processos (ou threads) são executados em diferentes CPUs (ou núcleos da mesma CPU). O paralelismo neste caso não é "virtual", mas "real".
Quando essas CPUs pertencem à mesma máquina, nos referimos à computação como "paralela"; quando as CPUs pertencem a máquinas diferentes , podem ser distribuídas geograficamente, nos referimos à computação como "distribuída".
Portanto, a computação distribuída é um subconjunto da computação paralela, que é um subconjunto da computação simultânea.
Obviamente, é verdade que, em geral, a computação paralela e distribuída é considerada diferente. A computação paralela está relacionada a aplicativos fortemente acoplados e é usada para atingir um dos seguintes objetivos:
- Resolva problemas de computação intensiva mais rapidamente;
- Resolva problemas maiores na mesma quantidade de tempo;
- Resolva problemas do mesmo tamanho com maior precisão na mesma quantidade de tempo.
No passado, o primeiro objetivo era o principal motivo da computação paralela: acelerar a solução do problema. Neste momento, e quando possível, os cientistas usam principalmente computação paralela para alcançar tanto o segundo gol (por exemplo, eles estão dispostos a gastar a mesma quantidade de tempo eles passaram na resolução passado em paralelo um problema de tamanho para resolver agora um problema de tamanho ) ou o terceiro (ou seja, eles estão dispostos a gastar a mesma quantidade de tempo que passaram no passado resolvendo em paralelo um problema de tamanho para resolver agora um problema de tamanhox 5 x T x xTx5 xTxxmas com maior precisão usando um modelo muito mais complexo, mais equações, variáveis e restrições). A computação paralela pode usar memória compartilhada, passagem de mensagem ou ambas (por exemplo, intra-nó de memória compartilhada usando OpenMP, inter-nó de passagem de mensagem usando MPI); também pode usar aceleradores de GPUs. Como o aplicativo é executado em um supercomputador paralelo, geralmente não levamos em conta questões como falhas, partição de rede etc., pois a probabilidade desses eventos é, para fins práticos, próxima de zero. No entanto, grandes aplicativos paralelos, como simulações de mudanças climáticas, que podem durar vários meses, geralmente se preocupam com falhas e usam o mecanismo de verificação / reinício para evitar iniciar a simulação novamente desde o início, se surgir um problema.
A computação distribuída está relacionada a aplicativos fracamente acoplados, nos quais o objetivo (para supercomputação distribuída ) é resolver problemas muito grandes ou cuja execução pode ser dividida em diferentes componentes que podem se beneficiar da execução em diferentes arquiteturas. Existem vários modelos, incluindo cliente-servidor, ponto a ponto, etc. Os problemas que surgem na computação distribuída, como segurança, falhas, partição de rede etc., devem ser levados em consideração no tempo de design, pois nesse contexto as falhas são a regra e não é a exceção.
Finalmente, a computação em grade e em nuvem é um subconjunto da computação distribuída. O paradigma da computação em grade surgiu como um novo campo distinto da computação distribuída tradicional, devido ao seu foco no compartilhamento de recursos em larga escala e em aplicativos inovadores de alto desempenho. Os recursos compartilhados geralmente pertencem a vários domínios administrativos diferentes (as chamadas Organizações Virtuais ). A computação em grade, embora seja muito usada por cientistas na última década, é tradicionalmente difícil para usuários comuns. A computação em nuvem tenta preencher a lacuna, permitindo que usuários comuns explorem facilmente várias máquinas, localizadas no mesmo datacenter e não distribuídas geograficamente, por meio do uso de máquinas virtuaisque podem ser montados pelos usuários para executar seus aplicativos. Devido ao hardware, em particular a falta habitual de uma interconexão de rede de alto desempenho (como Infiniband etc.), as nuvens não são direcionadas para a execução de aplicativos MPI paralelos. Aplicativos distribuídos em execução nas nuvens geralmente são implementados para explorar o paradigma Map / Reduce. A propósito, muitas pessoas pensam em Mapear / reduzir como um modelo de fluxo de dados paralelo.