A diferença entre a execução “simultânea” e “paralela”?

82

Qual é a diferença entre os termos concorrente e paralelo ? Eu nunca fui capaz de entender a distinção.

A tag define a simultaneidade como uma maneira de executar dois processos simultaneamente, mas achei que o paralelismo era exatamente a mesma coisa, ou seja, segmentos ou processos separados que podem ser potencialmente executados em processadores separados.

Além disso, se considerarmos algo como E / S assíncrona, estamos lidando com simultaneidade ou paralelismo?

    
por blz 15.03.2013 / 17:01
fonte

8 respostas

80
Concorrência e paralelismo são dois conceitos relacionados, porém distintos.

Concorrência significa, essencialmente, que a tarefa A e a tarefa B precisam acontecer independentemente umas das outras, e A começa a correr, e então B inicia antes que A termine.

Existem várias maneiras diferentes de realizar a simultaneidade. Um deles é o paralelismo - ter várias CPUs trabalhando nas diferentes tarefas ao mesmo tempo. Mas esse não é o único caminho. Outra é por troca de tarefas, que funciona assim: A Tarefa A funciona até certo ponto, então a CPU que está trabalhando nela para e passa para a tarefa B, trabalha nela por um tempo e depois volta para a tarefa A. Se as fatias de tempo forem pequenas o suficiente, pode parecer ao usuário que ambas as coisas estão sendo executadas em paralelo, mesmo que elas estejam sendo processadas em série por uma CPU multitarefa.

    
por 15.03.2013 / 17:28
fonte
32

Os dois conceitos estão relacionados, mas são diferentes.

Concorrência significa que dois ou mais cálculos acontecem dentro do mesmo período de tempo, e geralmente há algum tipo de dependência entre eles.

Paralelismo significa que dois ou mais cálculos acontecem simultaneamente.

Coloque corajosamente, a simultaneidade descreve um problema (duas coisas precisam acontecer juntas), enquanto o paralelismo descreve uma solução (dois núcleos de processador são usados para executar duas coisas simultaneamente).

O paralelismo é uma maneira de implementar a simultaneidade, mas não é o único. Outra solução popular é o processamento intercalado (a.k.a. coroutines): dividir ambas as tarefas em etapas atômicas e alternar entre as duas.

De longe, o exemplo mais conhecido de simultaneidade não paralela é como o JavaScript funciona: existe apenas um thread, e qualquer callback assíncrono tem que esperar até que o pedaço de código anterior tenha terminado a execução. Isso é importante saber, porque garante que qualquer função que você escreva é atômica - nenhum retorno de chamada pode interrompê-la até que ela retorne. Mas isso também significa que "loops de ocupado" não funcionará - você não pode definir um tempo limite e, em seguida, fazer um loop até que seja disparado, porque o loop impedirá que o retorno de chamada de tempo limite seja executado.

    
por 15.03.2013 / 18:13
fonte
8

Acredito que esta resposta seja mais correta do que as respostas existentes e editá-las teria mudado sua essência. Tentei vincular várias fontes ou páginas da Wikipédia para que outras pessoas possam afirmar a exatidão.

Concorrência: a propriedade de um sistema que permite que unidades do programa, algoritmo ou problema sejam executados fora de ordem ou em ordem parcial sem afetar o resultado final 1 2 .

Um exemplo simples disso são adições consecutivas:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

Devido à propriedade comutativa da adição, a ordem destes pode ser reorganizada sem afetar a correção; o seguinte arranjo resultará na mesma resposta:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

Aqui eu agrupei os números em pares, que somariam 10, tornando mais fácil para mim chegar à resposta correta na minha cabeça.

Computação Paralela: um tipo de cálculo no qual muitos cálculos ou a execução de processos são realizados simultaneamente 3 4 . Assim, a computação paralela aproveita a propriedade da simultaneidade para executar várias unidades do programa, algoritmo ou problema simultaneamente.

Continuando com o exemplo de adições consecutivas, podemos executar diferentes partes da soma em paralelo:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

Então, no final, somamos os resultados de cada trabalhador para obter 10 + 35 = 45 .

Novamente, esse paralelismo só foi possível porque acréscimos consecutivos têm a propriedade de concorrência.

A concorrência pode ser alavancada por mais do que apenas paralelismo. Considere a preempção em um sistema de núcleo único: durante um período de tempo, o sistema pode progredir em vários executando processos sem que nenhum deles termine. De fato, seu exemplo de E / S assíncronos é um exemplo comum de simultaneidade que não requer paralelismo.

Confusão

O acima é relativamente simples. Suspeito que as pessoas se confundem porque as definições do dicionário não correspondem necessariamente ao que foi descrito acima:

  • Concorrente: ocorrendo ou existindo simultaneamente ou lado a lado 5 .
  • Concorrência: o fato de dois ou mais eventos ou circunstâncias acontecerem ou existirem ao mesmo tempo Da pesquisa no google: "define: concorrência" .

O dicionário define "simultaneidade" como um fato de ocorrência, enquanto a definição no vernáculo de computação é uma propriedade latente de um programa, propriedade ou sistema. Embora relacionados, essas coisas não são as mesmas.

Recomendações pessoais

Eu recomendo usar o termo "paralelo" quando a execução simultânea for assegurada ou esperada, e usar o termo "concorrente" quando for incerto ou irrelevante se a execução simultânea for empregada.

Eu descreveria, portanto, simulando um motor a jato em múltiplos núcleos como paralelo.

Eu descreveria Makefiles como um exemplo de simultaneidade. Makefiles afirmam as dependências de cada destino. Quando os alvos dependem de outros alvos, isso cria uma ordenação parcial. Quando os relacionamentos e as receitas são definidos de forma abrangente e correta, isso estabelece a propriedade da concorrência: existe uma ordem parcial de modo que a ordem de certas tarefas possa ser reorganizada sem afetar o resultado. Novamente, essa simultaneidade pode ser aproveitada para construir múltiplas regras simultaneamente, mas a simultaneidade é uma propriedade do Makefile se o paralelismo é empregado ou não.

    
por 28.02.2018 / 19:07
fonte
6

Execução concorrente é a forma generalizada de execução paralela. Por exemplo, o programa paralelo também pode ser chamado concorrente, mas o inverso não é verdadeiro.

  1. A execução simultânea é possível em um único processador (vários encadeamentos, gerenciados pelo planejador)
  2. A execução paralela não é possível no processador único, mas em vários processadores. (Um processo por processador)

Para mais detalhes, leia este documento de pesquisa Conceitos de programação simultânea

    
por 11.06.2015 / 19:17
fonte
3

O processamento paralelo é um subconjunto do processamento simultâneo.

O processamento simultâneo descreve duas tarefas que ocorrem de forma assíncrona, o que significa que a ordem em que as tarefas são executadas não é predeterminada. Dois encadeamentos podem ser executados simultaneamente no mesmo núcleo do processador, intercalando instruções executáveis. Por exemplo, o encadeamento 1 é executado por 10 ms, o encadeamento 2 por 10 ms, etc.

O processamento paralelo é um tipo de processamento simultâneo em que mais de um conjunto de instruções está sendo executado simultaneamente. Isso pode ser vários sistemas trabalhando em um problema comum, como na computação distribuída, ou vários núcleos no mesmo sistema.

    
por 15.03.2013 / 17:47
fonte
0

Na minha opinião, a partir de uma perspectiva de programação de aplicativos, não há diferença entre esses dois conceitos e ter duas palavras é confuso por causa da confusão. Acho que a intercalação de threads foi criada para simular o processamento multicore nos dias em que multicore não era uma possibilidade. Por que temos uma palavra para essa mentalidade desatualizada?

A Mason Wheeler e a Penguin deram a mesma resposta. Um Núcleo com alternância de tarefas e / ou multicore é simultâneo, estritamente multicore = paralelo.

Minha opinião é que esses dois termos devem ser colocados em um e eu faço um esforço para evitar dizer "concorrente". Eu acho que no nível de programação do sistema operacional a distinção é importante, mas da perspectiva do programador da aplicação não importa muito. Eu escrevi mapReduce, Spark, MPI, cuda, openCL e multithreaded c ++ e eu nunca tive que parar e pensar se o trabalho está sendo executado com threads intercalados ou com múltiplos núcleos.

Por exemplo, quando eu escrevo c ++ multithreaded às vezes não tenho certeza de quantos núcleos eu vou conseguir, embora existam maneiras de fazer demandas em quantos núcleos você obter como descrito aqui link . Na faísca eu apenas mapeio e reduzo as operações e não tenho idéia de como o jvm está lidando com eles no nível do hardware. Nas GPUs eu penso que cada thread é atribuída ao seu próprio processador simples, mas eu sempre sincronizo meus threads onde quer que um problema possa surgir. Com o MPI, a comunicação entre as máquinas é especificada explicitamente, mas podemos intercalar as funções executadas em várias máquinas em um único núcleo e combinar os resultados por meio de uma função encadeada única apropriada. E se usarmos MPI para coordenar um monte de máquinas de núcleo único, cada uma com multithreading? Que diferença faz? Eu diria que não. Chame tudo de "paralelo" e termine com isso.

    
por 12.02.2017 / 06:33
fonte
0

A declaração de tdammer chega perto, o resto é tudo além do ponto. Ele diz:

"Colocando corajosamente, a simultaneidade descreve um problema (duas coisas precisam acontecer juntas), enquanto o paralelismo descreve uma solução (dois núcleos de processador são usados para executar duas coisas simultaneamente"

Vamos apenas analisar as palavras.

Atual significa acontecer agora, real e relevante neste momento. Con significa contra, contador, não alinhando com.

Paralelo significa na mesma direção sem cruzar, sem estar no caminho um do outro.

Assim, a simultaneidade implica competir pelo mesmo recurso. O paralelismo não. Processos paralelos podem estar usando o mesmo recurso, mas não é considerado um problema, não é um problema. Com a simultaneidade, é uma questão a ser tratada.

    
por 12.02.2017 / 08:00
fonte
-1

Obviamente, os termos são usados de forma diferente em diferentes culturas.

Meu entendimento é o seguinte:

O paralelismo é uma maneira de acelerar o processamento. Quer você multiplique a matriz em um único núcleo, em vários núcleos ou até mesmo na GPU, o resultado é o mesmo (ou então seu programa está quebrado). Não adiciona novas funcionalidades a algum programa, apenas velocidade.

Enquanto simultaneidade é sobre coisas que você não pode fazer em seqüência. Por exemplo, veiculando três páginas diferentes ao mesmo tempo para três clientes, enquanto aguarda a próxima solicitação. (Embora você possa simular isso em algum grau através da intercalação, como foi feito nos dias mais antigos.) Observe que o comportamento de programas simultâneos é não determinístico. Por exemplo, não está claro qual dos três clientes será totalmente atendido primeiro. Você pode executar alguns testes e obter um resultado diferente a cada vez em relação à ordem em que a solicitação será finalizada. O sistema de tempo de execução deve garantir que: a) todos os clientes serão atendidos e b) em um período de tempo razoável.

Normalmente, o cavalo de trabalho de um cálculo paralelo não tem conhecimento nem se importa com o paralelismo. Embora as tarefas simultâneas empreguem explicitamente comunicações entre processos ou entre threads - como o bloqueio de filas, mecanismos de sincronização e bloqueio.

    
por 16.03.2013 / 01:40
fonte