Costumo ler que paralelismo e concorrência são coisas diferentes. Muitas vezes, os respondentes / comentadores chegam a escrever que são duas coisas completamente diferentes. No entanto, na minha opinião, eles estão relacionados, mas eu gostaria de alguns esclarecimentos sobre isso.
Por exemplo, se eu estou em uma CPU multi-core e conseguem dividir o cálculo em x menor computação (digamos usando fork / join) cada um executando em seu próprio segmento, eu vou ter um programa que é computação paralela fazer (porque supostamente a qualquer momento várias threads serão executadas em vários núcleos) e sendo simultâneas, certo?
Embora se eu esteja simplesmente usando, digamos, Java e lidando com eventos da interface do usuário e repaints no Event Dispatch Thread e executando o único thread que eu mesmo criei, terei um programa simultâneo (EDT + GC thread + meu thread principal) etc.) mas não paralelo.
Gostaria de saber se estou acertando e se o paralelismo (em um sistema "único, mas com vários núcleos") sempre implica simultaneidade ou não?
Além disso, existem programas multiencadeados em execução na CPU com vários núcleos, mas onde os diferentes encadeamentos estão fazendo cálculos totalmente diferentes, considerados como "paralelismo"?
fonte
Respostas:
De acordo com a Wikipedia :
Ou seja, o paralelismo sempre implica simultaneidade.
Não. A essência do paralelismo é que um grande problema é dividido em menores, para que as partes menores possam ser resolvidas simultaneamente. As peças são mutuamente independentes (pelo menos até certo ponto), mas ainda fazem parte do problema maior, que agora está sendo resolvido em paralelo.
A essência da simultaneidade é que vários threads (ou processos ou computadores) estão fazendo algo simultaneamente , possivelmente (mas não necessariamente) interagindo de algumas maneiras. Wikipedia novamente :
fonte
O código pode ser simultâneo, mas não paralelo.
Imagine vários threads em execução na máquina de núcleo único. Esta máquina de núcleo único processará apenas um encadeamento por vez, portanto, não haverá paralelismo de operações. Mas para cada thread, graças à maneira como o sistema operacional lida com vários threads, cada segmento precisa assumir que todos os outros threads estão em execução ao mesmo tempo.
fonte
Paralelismo significa simplesmente realizar muitas tarefas simultaneamente; por outro lado, a simultaneidade é a capacidade do kernel de executar muitas tarefas alternando constantemente entre muitos processos.
Para alcançar o paralelismo, é importante que o sistema tenha muitos núcleos somente para que o paralelismo possa ser alcançado com eficiência. E há muito impacto no desempenho e muita sobrecarga é incorrida se o paralelismo for tentado em uma máquina de núcleo único.
Por exemplo, o sistema anterior tinha apenas um núcleo e os agendadores de CPU dariam uma ilusão de paralelismo alternando constantemente entre processos, permitindo que cada processo progredisse.
fonte