Resumo

Concluído
  • Os programas de computador podem ser classificados como aplicativos sequenciais, paralelos, distribuídos e simultâneos.
  • Um programa sequencial é executado na ordem do programa em apenas uma CPU (ou, mais especificamente, um núcleo).
  • Um programa simultâneo é um conjunto de programas sequenciais que compartilham uma ou mais CPUs ao mesmo tempo durante a execução.
  • Um programa paralelo é um conjunto de programas sequenciais que se sobrepõem no tempo, sendo executados em CPUs separadas em paralelo.
  • Programas paralelos que são executados em CPUs separadas em computadores em rede diferentes são chamados de programas distribuídos.
  • Um thread é a menor sequência de instruções que um SO pode gerenciar com seu agendador. Vários threads constituem um processo, compartilhando todos eles um mesmo espaço de endereço do processador. Vários processos constituem uma tarefa, enquanto várias tarefas normalmente são agrupadas como um trabalho.
  • A programação distribuída é crucial para resolver muitos problemas, como cargas de trabalho científicas, computação de Big Data, bancos de dados e mecanismos de pesquisa.
  • Várias preocupações ditam o design de programas distribuídos para a nuvem. São elas o modelo de programação, o modelo de computação e a arquitetura do programa.
  • Os modelos de programação típicos incluem o modelo de memória compartilhada e o modelo de passagem de mensagem.
  • O modelo de memória compartilhada supõe um espaço de endereço compartilhado, que pode ser acessado por todas as tarefas. As tarefas se comunicam entre si lendo e gravando nesse espaço de endereço compartilhado. A comunicação entre as tarefas deve ser sincronizada explicitamente (usando constructos como barreiras, semáforos e bloqueios). O OpenMP é um exemplo de linguagem de programação com modelo de memória compartilhada.
  • No modelo de passagem de mensagem, as tarefas não compartilham um espaço de endereço e só podem se comunicar umas com as outras, enviando e recebendo mensagens explicitamente. O MPI é um exemplo de linguagem de programação com modelo de passagem de mensagem.
  • Os modelos de programação também são classificados como síncronos e assíncronos, com base na orquestração das várias tarefas em execução em paralelo. Os modelos de programação síncronos forçam todas as tarefas que os compõem a operar de modo atrelado, enquanto os modelos assíncronos não o fazem.
  • Os programas também podem ser classificados de acordo com o tipo de paralelismo que incorporam. Eles podem ter paralelismo de dados ou paralelismo de grafos.
  • Modelos com paralelismo de dados se concentram na distribuição dos dados entre vários computadores enquanto o mesmo código é executado em cada um deles. Esse tipo de modelo também é chamado de modelo SPMD (programa único, dados múltiplos).
  • Os modelos com paralelismo de grafos se concentram na distribuição da computação, e não dos dados. Esse tipo de modelo também é chamado de modelo MPMD (programas múltiplos, dados múltiplos).
  • As tarefas em um modelo de programação distribuído podem ser organizadas em dois modelos de arquitetura diferentes: arquiteturas assimétricas/de mestre-subordinado ou simétricas/ponto a ponto.
  • A organização de mestre-subordinado requer que uma ou mais tarefas sejam designadas especificamente como as tarefas mestre, que coordenarão a execução do programa entre as tarefas subordinadas.
  • A organização ponto a ponto consiste em um conjunto de tarefas que são iguais, mas que exigem esquemas mais complicados para organizar a computação e tomar decisões.
  • Os grandes desafios da criação de programas de nuvem incluem o gerenciamento da escalabilidade, da comunicação, da heterogeneidade, da sincronização, da tolerância a falhas e do agendamento.
  • Os programas não podem ser acelerados infinitamente em virtude da lei de Amdahl, que expressa o limite de aceleração de um programa como uma função da fração do tempo do programa gasto na execução de código que é serial por natureza.
  • O gerenciamento eficiente da comunicação entre as tarefas distribuídas determina o desempenho de muitos aplicativos. As estratégias para aprimorar os gargalos de comunicação na nuvem incluem a colocalização de tarefas altamente comunicantes e o gerenciamento eficiente do particionamento de dados para mapear os dados para os nós mais próximos.
  • As nuvens trazem heterogeneidade em termos do hardware físico subjacente, que normalmente é mascarada do usuário final por meio da virtualização. Os programas em execução na nuvem que são capazes de levar em conta e fazer ajustes com base no hardware heterogêneo podem se beneficiar em termos de desempenho.
  • Técnicas de sincronização robustas são essenciais para a programação distribuída, para lidar com problemas como deadlocks.
  • A tolerância a falhas representa um sério desafio na programação para nuvens. Os programas devem prever e recuperar-se de falhas de software e hardware durante a execução na nuvem.
  • As técnicas de agendamento de tarefas e trabalhos levam em conta a natureza exclusiva dos recursos de nuvem para maximizar o desempenho.