¿La diferencia entre ejecución "concurrente" y "paralela"?

107

¿Cuál es la diferencia entre los términos ejecución simultánea y paralela ? Nunca he podido captar la distinción.

La etiqueta define la concurrencia como una manera de ejecutar dos procesos simultáneamente, pero pensé que el paralelismo era exactamente lo mismo, es decir: hilos o procesos separados que potencialmente se pueden ejecutar en procesadores separados.

Además, si consideramos algo como E / S asíncrona, ¿estamos tratando con concurrencia o paralelismo?

blz
fuente
27
En pocas palabras: concurrente: muchas operaciones diferentes ocurren a la vez. paralelo: la misma operación dividida en pequeños bits que ocurre a la vez.
Oded
3
@Oded, entiendo lo que significan las palabras, pero tengo problemas para entender las implicaciones. ¿Tienes un ejemplo concreto?
blz
77
@Oded, realmente no estoy de acuerdo con usted, en ninguna parte de sus definiciones (ya sea general o aplicada a la programación) las nociones de "concurrente" y "paralelo" mencionan algo sobre el número o "tamaño" de las operaciones.
Shivan Dragon
2
@Oded cuando dijiste "pedacitos".
Avner Shahar-Kashtan
2
@Oded: Sí, pero esta parece ser la raíz del malentendido entre usted y ShivanDragon.
Avner Shahar-Kashtan

Respuestas:

97

La concurrencia y el paralelismo son dos conceptos relacionados pero distintos.

La concurrencia significa, esencialmente, que la tarea A y la tarea B deben suceder independientemente una de la otra, y A comienza a ejecutarse, y luego B comienza antes de que A termine.

Hay varias formas diferentes de lograr la concurrencia. Uno de ellos es el paralelismo: tener múltiples CPU trabajando en las diferentes tareas al mismo tiempo. Pero esa no es la única forma. Otra es mediante el cambio de tareas, que funciona así: la tarea A funciona hasta cierto punto, luego la CPU que trabaja en ella se detiene y cambia a la tarea B, funciona durante un tiempo y luego vuelve a la tarea A. Si los intervalos de tiempo son lo suficientemente pequeños, puede parecerle al usuario que ambas cosas se ejecutan en paralelo, a pesar de que en realidad están siendo procesadas en serie por una CPU multitarea.

Mason Wheeler
fuente
44
El caso B es cómo funciona IO asíncrono, ¿no?
blz
66
@blz: Eso es correcto. También es cómo funciona la multitarea preventiva. La principal diferencia es que en IO asíncrono, el programa decide renunciar a su tiempo y decirle a la CPU que procese algo más, mientras que en la multitarea preventiva, si el hilo en ejecución no abandona voluntariamente la CPU después de un tiempo suficiente, el sistema operativo se adelanta eso.
Mason Wheeler
1
La mejor explicación sin duda
Konrad
@MasonWheeler: si solo tenemos 1 CPU, entonces solo podemos tener concurrencia, sin paralelismo. ¿Derecho? El paralelismo se puede lograr con más de 1 CPU. ¿Derecho? Y si es correcto y si tenemos solo 1 CPU, los Streams de Java 8 no son de ninguna utilidad.
Anish Mittal
1
Correcto sobre los primeros puntos. En cuanto al último, ¿es el paralelismo el único beneficio que obtienes de Streams? No soy un desarrollador de Java, pero mi impresión es que los flujos de Java son más o menos equivalentes a LINQ, y eso tiene beneficios reales en expresividad y facilidad de desarrollo.
Mason Wheeler
37

Los dos conceptos están relacionados, pero son diferentes.

La concurrencia significa que dos o más cálculos suceden dentro del mismo período de tiempo, y generalmente hay algún tipo de dependencia entre ellos.

Paralelismo significa que dos o más cálculos suceden simultáneamente.

Dicho con audacia, la concurrencia describe un problema (dos cosas deben suceder juntas), mientras que el paralelismo describe una solución (se usan dos núcleos de procesador para ejecutar dos cosas simultáneamente).

El paralelismo es una forma de implementar la concurrencia, pero no es la única. Otra solución popular es el procesamiento intercalado (también conocido como corutinas): divide ambas tareas en pasos atómicos y alterna entre ambas.

Con mucho, el ejemplo más conocido de concurrencia no paralela es cómo funciona JavaScript: solo hay un subproceso y cualquier devolución de llamada asincrónica tiene que esperar hasta que el fragmento de código anterior haya terminado de ejecutarse. Es importante saberlo, ya que garantiza que cualquier función que escriba sea atómica: ninguna devolución de llamada puede interrumpirla hasta que regrese. Pero también significa que los "bucles ocupados" no funcionarán: no puede establecer un tiempo de espera y luego hacer un bucle hasta que se active, porque el bucle evitará que se ejecute la devolución de llamada de tiempo de espera.

tdammers
fuente
8
Dices eso Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.Pero el usuario que escribió esa respuesta aceptada dice Concurrency means, essentially, that task A and task B both need to happen independently of each other. Entonces, ¿Cuál es la conclusión?
nbro
¿Podría explicar por qué el modelo de JavaScript es concurrente? Según su definición de concurrencia, deben realizarse dos o más cálculos dentro del mismo período de tiempo. Pero en JavaScript, los cálculos se ordenan secuencialmente usando una sola cola.
Damluar
44
Por "dentro del mismo marco de tiempo", no necesariamente quiero decir "simultáneamente", solo que los marcos de tiempo generales durante los cuales ocurren se superponen. Esto se puede lograr en paralelo (por ejemplo, dos núcleos de procesador, cada uno ejecutando una de las tareas), pero también se puede lograr serializando completamente la ejecución (primero realice la tarea 1, recuerde el resultado, luego haga la tarea 2, luego informe ambas) , o cortando ambos y entrelazando los trozos. Lo último es lo que hace JS.
tdammers
9

Creo que esta respuesta es más correcta que las respuestas existentes y editarlas habría cambiado su esencia. He tratado de vincular a varias fuentes o páginas de wikipedia para que otros puedan afirmar lo correcto.


Concurrencia: la propiedad de un sistema que permite que las unidades del programa, algoritmo o problema se ejecuten fuera de orden o en orden parcial sin afectar el resultado final 1 2 .

Un ejemplo simple de esto son las adiciones consecutivas:

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

Debido a la propiedad conmutativa de la suma, el orden de estos puede reorganizarse sin afectar la corrección; la siguiente disposición dará como resultado la misma respuesta:

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

Aquí he agrupado los números en pares que sumarán 10, haciéndome más fácil llegar a la respuesta correcta en mi cabeza.

Computación paralela: un tipo de computación en la cual muchos cálculos o la ejecución de procesos se llevan a cabo simultáneamente 3 4 . Por lo tanto, la computación paralela aprovecha la propiedad de concurrencia para ejecutar múltiples unidades del programa, algoritmo o problema simultáneamente.

Continuando con el ejemplo de adiciones consecutivas, podemos ejecutar diferentes porciones de la suma en paralelo:

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

Luego, al final, sumamos los resultados de cada trabajador para obtener 10 + 35 = 45.

Nuevamente, este paralelismo solo fue posible porque las adiciones consecutivas tienen la propiedad de concurrencia.

Sin embargo, la simultaneidad puede ser aprovechada por algo más que el paralelismo. Considere la preferencia en un sistema de un solo núcleo: durante un período de tiempo, el sistema puede avanzar en múltiples procesos en ejecución sin que ninguno de ellos finalice. De hecho, su ejemplo de E / S asíncrona es un ejemplo común de concurrencia que no requiere paralelismo.


Confusión

Lo anterior es relativamente sencillo. Sospecho que las personas se confunden porque las definiciones del diccionario no coinciden necesariamente con lo que se describió anteriormente:

  • Concurrente: ocurre o existe simultáneamente o de lado a lado 5 .
  • Concurrencia: el hecho de que dos o más eventos o circunstancias sucedan o existan al mismo tiempo. Desde la búsqueda en google: "define: concurrencia" .

El diccionario define "concurrencia" como un hecho de ocurrencia, mientras que la definición en la informática vernácula es una propiedad latente de un programa, propiedad o sistema. Aunque relacionadas estas cosas no son lo mismo.


Recomendaciones personales

Recomiendo usar el término "paralelo" cuando la ejecución simultánea esté asegurada o esperada, y usar el término "concurrente" cuando sea incierto o irrelevante si se empleará la ejecución simultánea.

Por lo tanto, describiría simular un motor a reacción en múltiples núcleos como paralelo.

Describiría Makefiles como un ejemplo de concurrencia. Los Makefiles indican las dependencias de cada objetivo. Cuando los objetivos dependen de otros objetivos, esto crea un orden parcial. Cuando las relaciones y las recetas se definen de manera completa y correcta, esto establece la propiedad de concurrencia: existe un orden parcial tal que el orden de ciertas tareas se puede reorganizar sin afectar el resultado. Una vez más, esta concurrencia se puede aprovechar para construir múltiples reglas simultáneamente, pero la concurrencia es una propiedad del Makefile, ya sea que se use el paralelismo o no.

Levi Morrison
fuente
6

La ejecución concurrente es la forma generalizada de ejecución paralela. Por ejemplo, el programa paralelo también se puede llamar concurrente, pero lo inverso no es cierto.

  1. La ejecución concurrente es posible en un solo procesador (múltiples hilos, administrados por el planificador)
  2. La ejecución paralela no es posible en un solo procesador sino en múltiples procesadores. (Un proceso por procesador)

Para más detalles, lea este documento de investigación Conceptos de programación concurrente


fuente
1
"La ejecución paralela no es posible en un solo procesador sino en múltiples procesadores", aparte de, por supuesto, donde hay rutas de ejecución paralelas dentro de un procesador, por ejemplo, sistemas que explotan el paralelismo de nivel de instrucción (también conocido como arquitecturas "superescalares", por ejemplo, procesadores Intel desde Pentium, ARM Cortex y la mayoría de los otros procesadores de alta gama), y Single Instruction Multiple Data, también conocidos como arquitecturas de datos paralelos (por ejemplo, MMX / SSE / etc.). Sin mencionar arreglos exóticos como procesadores de flujo de datos, etc.
Jules
3

El procesamiento paralelo es un subconjunto del procesamiento concurrente.

El procesamiento concurrente describe dos tareas que ocurren de forma asincrónica, lo que significa que el orden en que se ejecutan las tareas no está predeterminado. Dos subprocesos pueden ejecutarse simultáneamente en el mismo núcleo del procesador entrelazando instrucciones ejecutables. Por ejemplo, el subproceso 1 se ejecuta durante 10 ms, el subproceso 2 se ejecuta durante 10 ms, etc.

El procesamiento paralelo es un tipo de procesamiento concurrente donde más de un conjunto de instrucciones se ejecuta simultáneamente. Esto podría ser múltiples sistemas trabajando en un problema común como en la informática distribuida, o múltiples núcleos en el mismo sistema.

CondiciónRacer
fuente
0

La declaración de Tdammer se acerca, el resto está fuera del punto. Él dice:

"Dicho con audacia, la concurrencia describe un problema (dos cosas deben suceder juntas), mientras que el paralelismo describe una solución (se usan dos núcleos de procesador para ejecutar dos cosas simultáneamente"

Solo analicemos las palabras.

Actual significa suceder ahora, real, relevante en este momento. Con significa contra, contra, no alinearse con.

Paralelo significa en la misma dirección sin cruzar, sin estar en el camino del otro.

Entonces, la concurrencia implica competir por el mismo recurso. El paralelismo no. Los procesos paralelos pueden estar utilizando el mismo recurso pero no se considera un problema, no es un problema. Con la concurrencia, es un problema a tratar.

Martin Maat
fuente
"Actual significa pasar ahora, real, relevante en este momento. Con significa contra, contra, no alinearse con". - cita requerida. Dudo mucho de estas dos declaraciones. Si bien "actual" puede tener el significado mencionado aquí en inglés, ese no es el significado utilizado en la palabra "concurrente"
Hulk
1
Creo que la traducción de concurrente del latín es "correr juntos". El prefijo 'con' a menudo significa juntos , como en la conspiración (respirar juntos) consecuencia (resultados juntos o siguientes) concluir (muy juntos) etc. Es una faceta molesta del lenguaje que algo puede tener significados opuestos, la sanción es mi ejemplo favorito .
@no comprende En este caso (actual), el significado de correr juntos parece ser el mejor. Dado que no hay una corriente pro ... En holandés, concurrente es un sustantivo que significa competidor. Courant es común, se mueve a tu alrededor. También es periódico. Algo que está activo ahora. "Rekening courant" es una cuenta corriente. Siento que la concurrencia implica con (!) Flict. Una pelea por el mismo recurso. Corriendo en el mismo espacio. Quizás por el significado holandés (competidor).
Martin Maat
¿Qué diría Dijkstra, me pregunto?
-1

Obviamente, los términos se usan de manera diferente en diferentes culturas.

Mi entendimiento es el siguiente:

El paralelismo es una forma de acelerar el procesamiento. Si realiza la multiplicación de matrices en un solo núcleo, en múltiples núcleos o incluso en la GPU, el resultado es el mismo (o de lo contrario su programa está roto). No agrega nueva funcionalidad a algún programa, solo velocidad.

Si bien la concurrencia se trata de cosas que no puedes hacer de forma secuencial. Por ejemplo, sirviendo 3 páginas web diferentes al mismo tiempo a 3 clientes, mientras espera la próxima solicitud. (Aunque podría simular esto hasta cierto punto mediante intercalación, como se hizo en los días anteriores). Tenga en cuenta que el comportamiento de los programas concurrentes no es determinista. Por ejemplo, no está claro cuál de los 3 clientes será atendido por completo primero. Podría ejecutar bastantes pruebas y obtener un resultado diferente cada vez con respecto al orden en que se completará la solicitud. El sistema de tiempo de ejecución debe garantizar que a) todos los clientes serán atendidos yb) en un período de tiempo razonable.

Por lo general, el caballo de trabajo de un cómputo paralelo no es consciente del paralelismo ni le importa. Si bien las tareas concurrentes a menudo emplean explícitamente comunicaciones entre procesos o entre subprocesos, como el bloqueo de colas, la sincronización y los mecanismos de bloqueo.

Ingo
fuente
-1

En mi opinión, desde la perspectiva de la programación de aplicaciones, no hay diferencia entre estos dos conceptos y tener dos palabras es confuso en aras de la confusión. Creo que el entrelazado de hilos se realizó para simular el procesamiento multinúcleo en los días en que multinúcleo no era una posibilidad. ¿Por qué tenemos una palabra para esta mentalidad anticuada?

Mason Wheeler y Penguin han dado la misma respuesta. One Core con cambio de tareas o multinúcleo es concurrente, estrictamente multinúcleo = paralelo.

Mi opinión es que estos dos términos deben combinarse en uno y hago un esfuerzo por evitar decir "concurrente". Supongo que en el nivel de programación del sistema operativo la distinción es importante, pero desde la perspectiva del programador de la aplicación no importa demasiado. He escrito mapReduce, Spark, MPI, cuda, openCL y multiproceso c ++ y nunca he tenido que parar y pensar si el trabajo se ejecuta con hilos intercalados o con múltiples núcleos.

Por ejemplo, cuando escribo C ++ multiproceso a veces no estoy seguro de cuántos núcleos obtendré, aunque hay formas de exigir cuántos núcleos obtienes como se describe aquí https://stackoverflow.com/questions/2166425/ Cómo estructurar una aplicación de CA para usar un procesador multinúcleo . En chispa, solo mapeo y reduzco las operaciones y no tengo idea de cómo la jvm las está manejando a nivel de hardware. En GPU creoCada subproceso se asigna a su propio procesador simple, pero siempre sincronizo mis subprocesos siempre que surja un problema. Con MPI, la comunicación entre máquinas se especifica explícitamente, pero podríamos intercalar las funciones que se ejecutan en varias máquinas en un solo núcleo y combinar los resultados a través de una función apropiada de un solo subproceso. ¿Y si usamos MPI para coordinar un montón de máquinas de un solo núcleo, cada una con subprocesos múltiples? ¿Qué diferencia hace? Yo diría que ninguno. Llámalo todo "paralelo" y termina de una vez.

Julian Cienfuegos
fuente
2
La distinción sigue siendo relevante hoy. Solo puede tener paralelismo hasta la cantidad de núcleos de CPU que tiene su hardware, sin embargo, muchos programas tienen cientos de cálculos simultáneos que ocurren a la vez, mucho más que la cantidad de núcleos que tiene el hardware. Si no se comprende esta distinción, los programadores podrían no comprender por qué sus programas paralelos se ejecutan más lentamente que su versión de subproceso único (o un pequeño número de subprocesos).
Mentira Ryan