Quais são as diferenças entre programação paralela, simultânea e assíncrona?

O conceito de "síncrono" é mais uma coisa em nível de máquina / hardware, onde as coisas precisam ser feitas em determinados momentos, e aparece no software como a diferença entre pesquisa e programação reativa - ou seja, acordar com um temporizador para verificar algo, ou acordar com uma interrupção para reparar as coisas.

A sobreposição está no fato de que o multithreading simultâneo preventivo é geralmente tratado pelos mesmos mecanismos de hardware / interrupção, ou seja, um temporizador fará o sistema operacional suspender um thread (por interrupção) e alternar para outro sem qualquer sincronização dos threads, enquanto que se um thread acordar outro e se interrompe, a troca seria considerada sincronizada (não preventiva).

No caso preventivo, os encadeamentos são simultâneos, pois o sistema operacional está tentando executar mais de uma tarefa ao mesmo tempo (logicamente, intercalando-as). Se as tarefas forem paralelas, elas também serão simultâneas, mas na verdade serão executadas ao mesmo tempo.

Programação paralela

: Executando mais de uma computação ao mesmo tempo, para que as coisas corram mais rapidamente. Geralmente para cálculos determinísticos. Por exemplo, se você estiver multiplicando matrizes, poderá dividir a computação em vários núcleos, mas o resultado final será o mesmo que se você tivesse feito todas as contas em um único núcleo. Quando você está programando em paralelo, a parte mais difícil é descobrir a melhor forma de dividir e reunir as cargas de trabalho.

Programação concorrente

: Executando várias coisas independentes ao mesmo tempo. Geralmente, os resultados não são determinísticos e não têm uma alternativa de "núcleo único". Você também pode ter programação simultânea se sua máquina tiver um único núcleo. Por exemplo, em um sistema operacional ou servidor da web, você tem muitos programas que deseja executar simultaneamente. Ao fazer a programação simultânea, você precisa descobrir para que os processos se comuniquem, compartilhe recursos comuns sem pisar um no outro; se eles compartilham a CPU, você precisa descobrir como melhor agendá-los, etc.

Programação assíncrona:

É um estilo de programação no qual você escreve código que "espera" que algo ocorra. Às vezes, esse código é chamado de "retorno de chamada", porque quando o evento ocorre, o evento retorna seu código usando a função de retorno de chamada. Portanto, você pode enviar algo para outro computador, esperando receber uma resposta. Seria um desperdício de recursos ficar parado esperando uma resposta, então você configura uma função de retorno de chamada que lida com a resposta quando ela chega. Isso significa que você pode fazer outras coisas úteis até esse ponto.

Holberton School

Se o OP for sofisticado o suficiente para fazer essa pergunta, eu devo dar a ela uma resposta sofisticada ...

Na programação paralela, um problema é decomposto (se o problema for decomponível dessa maneira) em um grupo de tarefas relacionadas a serem executadas em paralelo (simultaneamente), com cada tarefa atribuída a um indivíduo

hardware

processador. O processador pode ser um núcleo em uma CPU com vários núcleos, ou pode ser um dos muitos processadores em, por exemplo, um supercomputador. Após a conclusão de todas essas tarefas, os resultados são consolidados no cálculo final desejado.

Na programação simultânea, um grupo de tarefas, não necessariamente relacionadas, é executado simultaneamente. As tarefas podem estar em execução em threads ou processos separados em uma CPU ou núcleo da CPU. Em seguida, a execução dos encadeamentos é intercalada no tempo pelo sistema operacional. As tarefas podem estar em execução em CPUs ou núcleos de CPU separados. Nesse caso, você realmente tem execução paralela. Observe que as CPUs separadas também podem ser máquinas separadas (em rede); nesse caso, você tem um cluster de computação.

A programação assíncrona significa que uma tarefa pode ser descarregada para outro encadeamento ou processo. Esse encadeamento pode reportar quando terminar, mas não é obrigado a fazê-lo. A programação assíncrona pode levar à simultaneidade sob certas condições.

Eu não quero criar uma definição de livro didático, então aqui estou um cenário que aconteceu na minha vida que explica concorrência vs paralelismo versus programação assíncrona.

Durante a minha infância, houve um dia em que minha mãe acordou tarde

,

o que atrasou o processo de preparar eu e minha irmã para a escola.

Em um dia ideal em que ela leva 2X minutos para nos preparar sequencialmente (primeiro eu e depois minha irmã), isso tinha que ser feito em X minutos agora.

Ela começou a acelerar as coisas. Em um dado instante

  • Ela estava preparando minha lancheira
  • Ela estava me dando café da manhã
  • Ela estava revisando meu laticínio escolar e assinando-o sempre que necessário.

Se você vê esse padrão, ela está trabalhando em várias coisas ao mesmo tempo pela RAPID CONTEXT SWITCHING para atingir seu objetivo.

Essa propriedade do núcleo único (minha mãe) trabalhando em várias coisas ao mesmo tempo, alternando rapidamente o contexto, é chamada

simultaneidade.

Então, o que é paralelismo ???

Nesse momento, vendo o quanto minha mãe está trabalhando, minha avó entrou em cena.

Ela começou a fazer todas as tarefas para minha irmã, assim como minha mãe está fazendo por mim.

Se você observar esse padrão aqui, cada núcleo (núcleo mãe e núcleo avó) está trabalhando simultaneamente em seu núcleo, mas, em geral, são dois núcleos funcionando paralelamente.

Que diabos é programação assíncrona ???

No

uma

execução simultânea, a alternância de contexto ocorre rapidamente e não é baseada em eventos.

A programação assíncrona é principalmente orientada a eventos.

Esclareci mais sobre como a programação assíncrona funciona na minha outra resposta, tomando

barbeiro e corte de cabelo

como um exemplo.

Deixe-me saber se eu perdi um ponto ou dois. 😊

Digamos que você queira fazer a soma dos primeiros 30 termos de:

[math]x^2+\floor(x^3)[/math]

Paralelamente:

  1. em paralelo (nos nós): r1 = calculaSumOfRange (1 a 10, eqn); r2 = calculaSumOfRange (11 a 20, eqn); r3 = calculaSumOfRange (21 a 30, eqn); resultado = r1 + r2 + r3;

As tarefas são enviadas para nós (que podem ser threads ou dispositivos físicos) por partições. Portanto, cada nó faz parte do trabalho em paralelo. Agora, como temos vários núcleos de CPU, podemos obter um paralelismo real.

De forma simultânea, sem promessas:

  1. para (i de 1 a 30): adder.submit (i, eqn); resultado = adder.getResult ();

O trabalho pesado (calculando a fórmula) é deportado para um encadeamento externo que normalmente será um feed de consumidor por um consumidor.adder.getResult () está bloqueando.

Em assíncrono:

  1. cálculoServiço.calculado (1 a 30, eqn) .then (r -> resultado = r);

O trabalho pesado é deportado para um encadeamento externo e fornecemos uma maneira de ser notificado.

Futuros e promessas

Exemplos :

Ao fazer uma pesquisa no Google, você está usando um serviço usando programação paralela. Eles consultam muitos nós e mesclam os resultados.

Ao usar um site com o AJAX, você usa programação assíncrona. As solicitações são feitas em segundo plano e o programa JavaScript é notificado quando os recursos estão prontos.

Quando você abre um arquivo, geralmente a caixa de diálogo "abrir arquivo" é uma chamada do SO que bloqueia o programa de chamada até você responder. Isso é simples concorrência.

Eu introduzi um pequeno viés: simultaneidade significa bloqueio. Não, não tem. A simultaneidade está fazendo parte de um programa parecer funcionar em paralelo. O paralelismo está realmente fazendo isso. (múltiplos núcleos)

Um vai além, exigindo que, no paralelismo, você resolva os problemas particionando-os. (como no exemplo de soma que eu dei) A computação em grade é um bom exemplo de paralelismo.

Ver resposta de

para os detalhes.

Um programa simultâneo é aquele com vários fluxos de controle que se sobrepõem no tempo. A simultaneidade altera a semântica de um programa para que os fluxos independentes de controle possam observar essa alteração. Por exemplo, um servidor web é um programa simultâneo e posso observar, como cliente desse servidor web, que não preciso que a solicitação de um usuário seja concluída antes que a minha possa começar.

Um programa paralelo é aquele em que subexpressões independentes são avaliadas ao mesmo tempo em diferentes processadores (potencialmente nem na mesma máquina) para concluir um cálculo mais rapidamente. Embora isso na prática exija que o programador anote seu programa para mostrar quais partes devem ser executadas em paralelo, isso não é exigido em teoria. Além disso, a computação paralela não apresenta alterações semânticas no programa.

É importante observar que os programas simultâneos podem ser executados em apenas um processador usando um agendador de intercalação e eles ainda são tão concorrentes quanto os executados em vários processadores - embora sejam potencialmente mais lentos. Este é um aspecto que

errou em sua resposta. A computação paralela é

não

um caso especial de simultaneidade. Pode-se alcançar o paralelismo usando construções de simultaneidade que geralmente levam à confusão.

A avaliação assíncrona ocorre quando um encadeamento de controle chama outra função ou método em outro encadeamento de controle e, em vez de esperar por um valor de retorno, ele continua seu trabalho. Em muitos modelos assíncronos, é provável que outro segmento ou ator faça uma chamada assíncrona mais tarde, a fim de fornecer a resposta. Esse modelo de computação funciona muito bem para programação simultânea devido à facilidade com que se pode equilibrar o trabalho de balanceamento, pois um ligeiro atraso em um encadeamento não causará atrasos em cascata.

Essas pessoas estão trabalhando em

paralelo

:

Programas paralelos distribuem suas tarefas para vários processadores, que trabalham ativamente em todos eles simultaneamente.

Esse cara é

simultaneamente

malabarismo 8 bolas:

Os programas simultâneos lidam com tarefas que estão em andamento ao mesmo tempo, mas só é necessário trabalhar brevemente e separadamente em cada tarefa, para que o trabalho possa ser intercalado na ordem que as tarefas exigirem.

Esse cara é

assincronamente

lavando a roupa enquanto lê:

Um programa assíncrono despacha tarefas para dispositivos que podem cuidar de si mesmos, deixando o programa livre fazendo outra coisa até receber um sinal de que os resultados foram concluídos.

24 = 2⋅2⋅2⋅2 = 1624 = 2⋅2⋅2⋅2 = 16

2.53.52.53.5