O campo da computação distribuída ficou muito aquém do desenvolvimento de uma única teoria matemática para descrever algoritmos distribuídos. Existem vários 'modelos' e estruturas de computação distribuída que simplesmente não são compatíveis entre si. A pura explosão de propriedades temporais variáveis (assincronia, sincronia, sincronia parcial), várias primitivas de comunicação (passagem de mensagens vs. memória compartilhada, broadcast vs. unicast), modelos de múltiplas falhas (falha de parada, recuperação de falha, envio de omissão, bizantino e assim por diante) on) nos deixou um número intratável de modelos, estruturas e metodologias de sistema, que comparar resultados de solvabilidade relativos e limites mais baixos entre esses modelos e estruturas se tornou árduo, intratável e, às vezes, impossível.
Minha pergunta é muito simples, por que isso acontece? O que há de tão fundamentalmente diferente na computação distribuída (de sua contraparte seqüencial) que não conseguimos coletar a pesquisa em uma teoria unificada da computação distribuída? Com a computação seqüencial, as Máquinas de Turing, as Funções Recursivas e o Cálculo Lambda são todos equivalentes. Foi apenas um golpe de sorte ou fizemos realmente um bom trabalho ao encapsular a computação seqüencial de uma maneira que ainda está para ser realizada com a computação distribuída?
Em outras palavras, a computação distribuída é inerentemente inflexível para uma teoria elegante (e, em caso afirmativo, como e por quê?), Ou simplesmente não somos inteligentes o suficiente para descobrir tal teoria?
A única referência que pude encontrar que aborda esse problema é: " Avaliando duas décadas de pesquisa em teoria da computação distribuída " por Fischer e Merritt DOI: 10.1007 / s00446-003-0096-6
Quaisquer referências ou exposições seriam realmente úteis.
fonte
Eu responderei isso da perspectiva de problemas clássicos de gráfico (ou problemas de entrada / saída): temos uma rede, cada nó recebe algo como entrada e cada nó deve produzir algo como saída. Eu acho que isso é o mais próximo do mundo da complexidade computacional tradicional.
Estou certamente tendenciosa, mas eu acho que neste cenário, não é um simples e modelo bastante comumente usado de computação distribuída: algoritmos distribuídos síncronos , com a definição que time = número de rodadas síncronos em execução . Na terminologia da Peleg, esse é o modelo LOCAL .
Esse modelo é bom, pois possui muito poucas "partes móveis", sem parâmetros, etc. No entanto, é muito concreto: faz sentido dizer que o tempo de execução de um algoritmo é exatamente 15 neste modelo. E você pode provar limites inferiores incondicionais, teóricos da informação: dessa perspectiva, a complexidade distribuída de muitos problemas de gráfico (por exemplo, coloração de gráfico) é bastante bem compreendida.
Este modelo também fornece uma abordagem unificada para muitos aspectos da computação distribuída:
Agora, tudo isso é bom, desde que você estude problemas "realmente distribuídos" no sentido de que o tempo de execução do seu algoritmo é menor que o diâmetro do gráfico , ou seja, nenhum nó precisa ter informações completas sobre a estrutura do gráfico. No entanto, também existem muitos problemas que são inerentemente globais: o algoritmo mais rápido nesse modelo tem um tempo de execução linear no diâmetro do gráfico. No estudo desses problemas, o modelo acima não faz mais sentido, e precisamos recorrer a outra coisa. Normalmente, começa-se a prestar atenção ao número total de mensagens ou bits comunicados na rede. Essa é uma das razões pelas quais temos vários modelos diferentes.
Então, é claro, temos o problema de que a comunidade de computação distribuída é na verdade duas comunidades diferentes, com surpreendentemente poucas coisas em comum . Se você amontoar todos os modelos de duas comunidades, que vão certamente olhar um pouco confuso ... Minha resposta acima está relacionada com apenas uma metade da comunidade; Eu acredito que os outros irão preencher em relação à outra metade.
fonte
Uma idéia romântica para capturar vários modelos de computação distribuída foi através da topologia algébrica. A idéia central é construir complexos simples, permitindo que os pontos sejam estados do processo, cada um rotulado com um ID do processo. Esta é uma cartilha sobre o tópico. A resposta mais próxima de sua pergunta provavelmente foi abordada por Eli Gafni em seu artigo - Computação distribuída - Um vislumbre de uma teoria. Em seu artigo, ele mostra simulações de como começar com memória compartilhada assíncrona para dois ou três processadores (para parada de falha e bizantino) - mostra como aplicar isso ao modelo de transmissão de mensagens. Crucial para entender suas simulações é a noção de visualizar uma computação distribuída topologicamente
fonte
Eu acho que a situação parece bem diferente se vista em contexto: a partir dos primeiros trabalhos e os resultados da impossibilidade no acordo bizantino ( PSL80 LSP82 FLP85), ficou claro em breve que problemas fundamentais na computação distribuída só podem ser resolvidos com suposições estritas de sincronia e um alto grau de redundância. Como esses limites inferiores dos recursos teóricos incondicionais foram considerados inviáveis para quaisquer fins práticos, a pesquisa se concentrou no desenvolvimento de modelos mais refinados que permitiam concessões cada vez mais refinadas de premissas (garantias de tempo ou modos de falha, por exemplo) vs. garantias (ou seja, número de falhas simultâneas de que tipos e que tipo de componentes são tolerados (por exemplo, processadores, links), a fim de fornecer aos projetistas do sistema as ferramentas para encontrar a solução certa para o sistema em questão.
fonte