A menudo leo que el paralelismo y la concurrencia son cosas diferentes. Muy a menudo, los respondedores / comentaristas llegan a escribir que son dos cosas completamente diferentes. Sin embargo, en mi opinión, están relacionados, pero me gustaría una aclaración al respecto.
Por ejemplo, si estoy en una CPU multinúcleo y logro dividir el cómputo en x cómputo más pequeño (digamos usando fork / join) cada uno ejecutándose en su propio hilo, tendré un programa que está haciendo cómputo paralelo (porque supuestamente, en cualquier momento, varios hilos se ejecutarán en varios núcleos) y serán concurrentes, ¿verdad?
Mientras que si simplemente estoy usando, digamos, Java y lidiando con eventos de UI y repintado en el hilo de despacho de eventos más ejecutando el único hilo que creé yo mismo, tendré un programa que sea concurrente (hilo EDT + GC + mi hilo principal etc.) pero no en paralelo.
Me gustaría saber si estoy haciendo esto bien y si el paralelismo (en un sistema "único pero con múltiples núcleos") siempre implica concurrencia o no.
Además, ¿se ejecutan programas de subprocesos múltiples en CPU de múltiples núcleos pero donde los diferentes subprocesos están haciendo un cálculo totalmente diferente se considera que usan "paralelismo"?
fuente
Respuestas:
De acuerdo con Wikipedia :
Es decir, el paralelismo siempre implica concurrencia.
No. La esencia del paralelismo es que un gran problema se divide en otros más pequeños para que las piezas más pequeñas se puedan resolver al mismo tiempo. Las piezas son mutuamente independientes (al menos hasta cierto punto), pero siguen siendo parte del problema más grande, que ahora se resuelve en paralelo.
La esencia de la concurrencia es que varios hilos (o procesos, o computadoras) están haciendo algo simultáneamente , posiblemente (pero no necesariamente) interactuando de alguna manera. Wikipedia nuevamente :
fuente
El código puede ser concurrente, pero no paralelo.
Imagine múltiples hilos ejecutándose en una máquina de un solo núcleo. Esta máquina de un solo núcleo solo procesará un subproceso a la vez, por lo que no habrá paralelismo de operaciones. Pero para cada subproceso, gracias a cómo el sistema operativo maneja múltiples subprocesos, cada subproceso debe asumir que todos los demás subprocesos se ejecutan al mismo tiempo.
fuente
Paralelismo simplemente significa hacer muchas tareas simultáneamente; Por otro lado, la concurrencia es la capacidad del núcleo para realizar muchas tareas cambiando constantemente entre muchos procesos.
Para lograr el paralelismo es importante que el sistema tenga muchos núcleos solo entonces el paralelismo se puede lograr de manera eficiente. Y hay un gran impacto en el rendimiento y se genera una gran sobrecarga si se intenta el paralelismo en una máquina de un solo núcleo.
Por ejemplo, el sistema anterior tenía solo un núcleo y los programadores de CPU darían una ilusión de paralelismo al cambiar constantemente entre procesos permitiendo que cada proceso progrese.
fuente