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


107

Qual é a diferença entre os termos execução simultânea e paralela ? Eu nunca fui capaz de entender a distinção.

A tag define simultaneidade como uma maneira de executar dois processos simultaneamente, mas pensei que o paralelismo fosse exatamente a mesma coisa, ou seja: threads ou processos separados que podem ser executados em processadores separados.

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


27
Em poucas palavras - simultâneo: muitas operações diferentes acontecendo ao mesmo tempo. paralelo: a mesma operação dividida em pequenos bits acontecendo ao mesmo tempo.
Oded

3
@ Oded, entendo o que as palavras significam, mas estou tendo problemas para entender as implicações. Você tem um exemplo concreto?
blz

7
@Oded, eu realmente não concordo com você, em nenhum lugar nas suas definições (gerais ou aplicadas à programação) as noções de "simultâneo" e "paralelo" mencionam qualquer coisa sobre o número ou o "tamanho" das operações.
Shivan Dragão

2
@Oded quando você disse "pequenos pedaços".
Avner Shahar-Kashtan 15/03

2
@Oded: Sim, mas isso parece ser a raiz do mal-entendido entre você e o ShivanDragon.
Avner Shahar-Kashtan /

Respostas:


97

Concorrência e paralelismo são dois conceitos relacionados, mas distintos.

Simultaneidade significa, essencialmente, que a tarefa A e a tarefa B precisam acontecer independentemente uma da outra, e A começa a executar e B inicia antes que A seja concluída.

Existem várias maneiras diferentes de obter simultaneidade. Um deles é o paralelismo - ter várias CPUs trabalhando nas diferentes tarefas ao mesmo tempo. Mas esse não é o único caminho. Outra é a alternância de tarefas, que funciona da seguinte maneira: a tarefa A funciona até um certo ponto; então, a CPU que trabalha nela pára e passa para a tarefa B, trabalha por um tempo e volta para a tarefa A. Se Como os intervalos de tempo são pequenos o suficiente, pode parecer ao usuário que ambas as coisas estão sendo executadas em paralelo, mesmo que estejam sendo processadas em série por uma CPU multitarefa.


4
O caso B é como o IO assíncrono funciona, não?
blz

6
@ BLZ: ​​Isso mesmo. É também como a multitarefa preventiva funciona. A principal diferença é que, no IO assíncrono, o programa decide desistir de seu tempo e instruir a CPU a processar outra coisa, enquanto na multitarefa preventiva, se o segmento em execução não desistir voluntariamente da CPU depois de um tempo suficiente, o sistema operacional tenta isto.
Mason Wheeler

1
A melhor explicação para as mãos
Konrad

@MasonWheeler: Se tivermos apenas 1 CPU, só poderemos ter simultaneidade, sem paralelismo. Direito? O paralelismo pode ser alcançado por mais de 1 CPU. Direito? E se estiver certo e se tivermos apenas 1 CPU, o Streams do Java 8 não terá utilidade.
Anish Mittal 23/02

1
Certo sobre os primeiros pontos. Quanto ao último, o paralelismo é o único benefício que você recebe do Streams? Não sou desenvolvedor Java, mas minha impressão é que o Java Streams é aproximadamente equivalente ao LINQ, e isso traz benefícios reais em termos de expressividade e facilidade de desenvolvimento.
Mason Wheeler

37

Os dois conceitos estão relacionados, mas diferentes.

Concorrência significa que dois ou mais cálculos ocorrem no mesmo período de tempo e geralmente existe algum tipo de dependência entre eles.

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

De maneira ousada, 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 é a única. Outra solução popular é o processamento intercalado (também conhecido como corotinas): divida as duas tarefas em etapas atômicas e alterne entre as duas.

De longe, o exemplo mais conhecido de simultaneidade não paralela é como o JavaScript funciona: existe apenas um encadeamento e qualquer retorno de chamada assíncrono precisa aguardar até que a parte anterior do código termine a execução. É importante saber, pois garante que qualquer função que você escreva seja atômica - nenhum retorno de chamada poderá interrompê-lo até que ele retorne. Mas isso também significa que os "loops ocupados" não funcionam - você não pode definir um tempo limite e depois executar um loop até que ele seja acionado, porque o loop impedirá a execução do retorno de chamada de tempo limite.


8
Você diz isso Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.Mas o usuário que escreveu a resposta aceita diz Concurrency means, essentially, that task A and task B both need to happen independently of each other. Então, qual é a conclusão?
N13 13/03

você poderia explicar por que o modelo do JavaScript é simultâneo? A partir da sua definição de simultaneidade, dois ou mais cálculos devem ocorrer no mesmo período. Porém, em JavaScript, os cálculos são ordenados sequencialmente usando uma única fila.
damluar

4
Por "dentro do mesmo período", não quero dizer necessariamente "simultaneamente", apenas que os períodos gerais durante os quais ocorrem se sobrepõem. Isso pode ser alcançado em paralelo (por exemplo, dois núcleos de processador, cada um executando uma das tarefas), mas também pode ser alcançado serializando completamente a execução (execute a tarefa 1 primeiro, lembre-se do resultado, depois execute a tarefa 2 e relate as duas) , ou cortando e intercalando os pedaços. O último é o que JS faz.
tdammers

9

Acredito que esta resposta seja mais correta do que as respostas existentes e editá-las mudaria sua essência. Tentei fazer o link para várias fontes ou páginas da Wikipedia, para que outras pessoas possam afirmar a correção.


Concorrência: a propriedade de um sistema que permite que unidades do programa, algoritmo ou problema sejam executadas 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 às propriedades comutativas da adição, a ordem delas pode ser reorganizada sem afetar a correção; a seguinte organização resultará na mesma resposta:

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

Aqui, agrupei os números em pares que somam 10, facilitando a obtenção da resposta correta em minha cabeça.

Computação Paralela: um tipo de computação em que 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 a obter 10 + 35 = 45.

Novamente, esse paralelismo só foi possível porque adições consecutivas têm a propriedade de simultaneidade.

A simultaneidade pode ser aproveitada por mais do que apenas paralelismo. Considere a preferência em um sistema de núcleo único: por um período de tempo, o sistema pode progredir em vários processos em execução sem que nenhum deles seja concluído. De fato, seu exemplo de E / S assíncrona é um exemplo comum de simultaneidade que não requer paralelismo.


Confusão

O exposto acima é relativamente direto. Eu suspeito que as pessoas ficam confusas 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 .
  • Simultaneidade: o fato de dois ou mais eventos ou circunstâncias acontecerem ou existirem ao mesmo tempo. Na pesquisa no google: "define: simultaneidade" .

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 relacionadas, essas coisas não são as mesmas.


Recomendações pessoais

Eu recomendo usar o termo "paralelo" quando a execução simultânea for garantida ou esperada e usar o termo "simultâneo" quando for incerto ou irrelevante se a execução simultânea será empregada.

Portanto, eu descreveria a simulação de um mecanismo a jato em múltiplos núcleos como paralelo.

Eu descreveria Makefiles como um exemplo de simultaneidade. Makefiles indicam as dependências de cada destino. Quando os destinos dependem de outros, isso cria uma ordem parcial. Quando os relacionamentos e as receitas são definidos de forma abrangente e correta, isso estabelece a propriedade da simultaneidade: existe uma ordem parcial para que a ordem de determinadas tarefas possa ser reorganizada sem afetar o resultado. Novamente, essa simultaneidade pode ser aproveitada para criar várias regras simultaneamente, mas a simultaneidade é uma propriedade do Makefile, independentemente de o paralelismo ser empregado ou não.


6

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

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

Para detalhes, leia este documento de pesquisa Conceitos de Programação Simultânea


1
"A execução paralela não é possível em um único processador, mas em vários processadores" - exceto, é claro, onde existem caminhos de execução paralelos em um processador, por exemplo, sistemas que exploram o paralelismo em nível de instrução (também conhecido como arquiteturas "superescalares", por exemplo, processadores Intel desde Pentium, ARM Cortex e a maioria dos outros processadores de última geração) e Single Instruction Multiple Data, também conhecidos como arquiteturas paralelas a dados (por exemplo, MMX / SSE / etc). Sem mencionar arranjos exóticos, como processadores de fluxo de dados, e assim por diante.
Jules

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 na qual as tarefas são executadas não é predeterminada. Dois threads podem ser executados simultaneamente no mesmo núcleo do processador, intercalando instruções executáveis. Por exemplo, o segmento 1 é executado por 10ms, o segmento 2 é executado por 10ms, etc.

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


0

Quando a declaração de Tdammer chega perto, o resto está além do ponto. Ele diz:

"Colocando com ousadia, 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, atual, relevante neste momento. Con significa contra, contra, não alinhado com.

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

Portanto, simultaneidade implica competir pelo mesmo recurso. Paralelismo não. Processos paralelos podem estar usando o mesmo recurso, mas isso não é considerado um problema, não é um problema. Com a simultaneidade, é um problema a ser tratado.


"Atual significa acontecer agora, real, relevante neste momento. Con significa contra, contra, não alinhar com." - citação necessária. Eu duvido fortemente de ambas as afirmações. Enquanto "corrente" pode ter o significado mencionado aqui em Inglês, que não é o significado usado na palavra "concorrente"
Hulk

1
Eu acho que a tradução do concorrente do latim é "correr juntos". O prefixo 'con' geralmente significa juntos , como na conspiração (respirar juntos) conseqüência (resulta juntos ou no seguimento) conclui (juntos) etc. É uma faceta irritante da linguagem que algo pode ter significados opostos, a sanção é o meu exemplo favorito .

@no comprende Nesse caso (con-current), o significado de correr em conjunto parece o mais adequado. Como não há pró-corrente ... Em holandês, simultâneo é um substantivo que significa concorrente. Courant é comum, movendo-se ao seu redor. Também é jornal. Algo que está ativo agora. "Rekening courant" é uma conta corrente. Sinto que a simultaneidade implica em conflito (!). Uma briga pelo mesmo recurso. Correndo no mesmo espaço. Talvez por causa do significado holandês (concorrente).
Martin Maat

O que Dijkstra diria, eu me pergunto?

-1

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

Meu entendimento é o seguinte:

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

Enquanto simultaneidade é sobre coisas que você não pode fazer sequencialmente. Por exemplo, veicular 3 páginas da web diferentes ao mesmo tempo para 3 clientes, enquanto aguarda a próxima solicitação. (Embora você possa simular isso até certo ponto por meio da intercalação, como foi feito nos dias anteriores.) Observe que o comportamento de programas concorrentes não é determinístico. Por exemplo, não está claro qual dos três clientes será atendido completamente primeiro. Você pode executar alguns testes e obter um resultado diferente a cada vez em relação à ordem em que a solicitação será concluída. O sistema de tempo de execução deve garantir que a) todos os clientes sejam atendidos eb) em um período de tempo razoável.

Normalmente, o cavalo de trabalho de uma computação paralela não está ciente nem se importa com o paralelismo. Embora tarefas simultâneas usem explicitamente comunicações entre processos ou entre threads - como filas de bloqueio, mecanismos de sincronização e bloqueio.


-1

Na minha opinião, 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 o multicore não era uma possibilidade. Por que temos uma palavra para essa mentalidade desatualizada?

Mason Wheeler e 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 agrupados em um e faço um esforço para evitar dizer "simultâneo". Eu acho que no nível de programação do sistema operacional a distinção é importante, mas da perspectiva do programador de aplicativos, isso não importa muito. Escrevi mapReduce, Spark, MPI, cuda, openCL e multithreaded c ++ e nunca tive que parar e pensar se o trabalho está sendo executado com threads intercalados ou com vários núcleos.

Por exemplo, quando eu escrevo c ++ multithread às vezes, não tenho certeza de quantos núcleos vou receber, embora haja maneiras de exigir quantos núcleos você obtém conforme descrito aqui https://stackoverflow.com/questions/2166425/ como estruturar um aplicativo de CA para usar um processador multicore . No Spark, apenas mapeio e reduzo as operações e não tenho idéia de como a jvm está lidando com elas no nível do hardware. Em GPUs eu achocada thread é atribuído ao seu próprio processador simples, mas eu sempre sincronizo meus threads sempre que surgir um problema. Com o MPI, a comunicação entre máquinas é especificada explicitamente, mas poderíamos intercalar as funções em execução em várias máquinas em um único núcleo e combinar os resultados por meio de uma função de rosca única apropriada. E se usarmos o MPI para coordenar várias 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.


2
A distinção ainda é relevante hoje. Você só pode ter paralelismo até o número de núcleos da CPU que o seu hardware possui; no entanto, muitos programas têm centenas de cálculos simultâneos acontecendo ao mesmo tempo, muito mais do que o número de núcleos que o hardware possui. A falha em entender essa distinção pode levar os programadores a não entender por que seus programas paralelos estão sendo executados mais lentamente que sua versão de thread único (ou pequeno número de threads).
Lie Ryan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.