¿La diferencia entre ejecución “concurrente” y “paralela”?

80

¿Cuál es la diferencia entre los términos concurrent y parallel ? Nunca he sido capaz de comprender 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, procesos o subprocesos separados que potencialmente pueden ejecutarse en procesadores separados.

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

    
pregunta blz 15.03.2013 - 17:01

8 respuestas

80

Concurrencia y paralelismo son dos conceptos relacionados pero distintos.

La concurrencia significa, esencialmente, que tanto la tarea A como la B deben suceder independientemente una de 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 varias CPU trabajando en las diferentes tareas al mismo tiempo. Pero esa no es la única manera. Otro es por 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, trabaja en ella por 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.

    
respondido por el Mason Wheeler 15.03.2013 - 17:28
32

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

Concurrencia significa que dos o más cálculos ocurren 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 ocurren simultáneamente.

En pocas palabras, la concurrencia describe un problema (dos cosas deben suceder juntas), mientras que el paralelismo describe una solución (dos núcleos de procesador se utilizan 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 (a.k.a. coroutines): divida ambas tareas en pasos atómicos, y alterne entre las dos.

Por mucho, el mejor ejemplo conocido de concurrencia no paralela es cómo funciona JavaScript: solo hay un hilo, y cualquier devolución de llamada asincrónica tiene que esperar hasta que la parte anterior del código haya terminado de ejecutarse. Es importante saber esto, ya que garantiza que cualquier función que escriba es atómica; ninguna devolución de llamada puede interrumpirla hasta que regrese. Pero también significa que los "bucles ocupados" no funcionarán: no se puede establecer un tiempo de espera y luego un ciclo hasta que se active, porque el ciclo evitará que se ejecute la devolución de llamada de tiempo de espera.

    
respondido por el tdammers 15.03.2013 - 18:13
8

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

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 adición, el orden de estos se puede reorganizar sin afectar la corrección; El siguiente arreglo resultará en la misma respuesta:

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

Aquí agrupé los números en pares que sumarán 10, lo que me facilita la respuesta correcta en mi mente.

Computación paralela: un tipo de cálculo en el que se realizan simultáneamente muchos cálculos o la ejecución de procesos 3 4 . Por lo tanto, la computación paralela aprovecha la propiedad de la concurrencia para ejecutar varias 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 concurrencia puede ser aprovechada por algo más que el paralelismo. Considere preferencia en un sistema de un solo núcleo: durante un período de tiempo, el sistema puede avanzar en varios Procesos en ejecución sin que ninguno de ellos termine. 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 la gente se confunde porque las definiciones del diccionario no coinciden necesariamente con lo que se describió anteriormente:

  • Concurrente: ocurre o existe simultáneamente o 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: concurrency" .

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

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 la simulación de un motor a reacción en múltiples núcleos como paralelo.

Describiría Makefiles como un ejemplo de concurrencia. Los makefiles establecen las dependencias de cada objetivo. Cuando los objetivos dependen de otros objetivos, esto crea un orden parcial. Cuando las relaciones y las recetas están definidas de manera integral y correcta, esto establece la propiedad de la concurrencia: existe un orden parcial tal que el orden de ciertas tareas se puede reorganizar sin afectar el resultado. Nuevamente, esta concurrencia puede aprovecharse para crear múltiples reglas simultáneamente, pero la concurrencia es una propiedad del Makefile, ya sea que se utilice el paralelismo o no.

    
respondido por el Levi Morrison 28.02.2018 - 19:07
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 contrario no es cierto.

  1. La ejecución simultánea es posible en un solo procesador (varios subprocesos, administrados por el programador)
  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 trabajo de investigación. Conceptos de programación concurrente

    
respondido por el user183296 11.06.2015 - 19:17
3

El procesamiento paralelo es un subconjunto del procesamiento simultáneo.

El procesamiento simultáneo describe dos tareas que ocurren de forma asíncrona, 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 intercalando instrucciones ejecutables. Por ejemplo, el hilo 1 se ejecuta durante 10 ms, el hilo 2 se ejecuta durante 10 ms, etc.

El procesamiento paralelo es un tipo de procesamiento simultáneo en el que se ejecutan simultáneamente más de un conjunto de instrucciones. Esto podría ser múltiples sistemas trabajando en un problema común como en la computación distribuida, o múltiples núcleos en el mismo sistema.

    
respondido por el ConditionRacer 15.03.2013 - 17:47
0

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 por el bien de la confusión. Creo que el intercalado de hilos se realizó para simular el procesamiento multinúcleo en los días en que el multinúcleo no era una posibilidad. ¿Por qué tenemos una palabra para esta mentalidad obsoleta?

Mason Wheeler y Penguin han dado la misma respuesta. Un núcleo con conmutación de tareas y / o multinúcleo es concurrente, estrictamente multinúcleo = paralelo.

Mi opinión es que estos dos términos deben combinarse en uno solo y me 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 aplicaciones no importa demasiado. Escribí mapReduce, Spark, MPI, cuda, openCL y c ++ multiproceso, y nunca tuve que detenerme y pensar si el trabajo se está ejecutando con subprocesos intercalados o con varios 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 obtiene como se describe aquí enlace . En chispa, solo hago mapas y operaciones reducidas, y no tengo idea de cómo las gestiona el JVM en el nivel de hardware. En las GPU, pienso cada 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 de subproceso único apropiada. ¿Y qué pasa si usamos MPI para coordinar un grupo de máquinas de un solo núcleo, cada una con multiproceso? ¿Qué diferencia hace? Yo diría que ninguno. Llámelo todo "paralelo" y termine con él.

    
respondido por el Julian Cienfuegos 12.02.2017 - 06:33
0

la declaración de tdammer se acerca, el resto es todo lo que no es el punto. Él dice:

"Con valentía, la concurrencia describe un problema (dos cosas deben suceder juntas), mientras que el paralelismo describe una solución (dos núcleos de procesador se utilizan para ejecutar dos cosas simultáneamente"

Analicemos las palabras.

Los medios actuales están sucediendo ahora, reales, relevantes en este momento. Con significa contra, contrarrestar, 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 lo hace. Los procesos paralelos pueden estar usando el mismo recurso pero no se considera un problema, no es un problema. Con la concurrencia, es un problema que debe tratarse.

    
respondido por el Martin Maat 12.02.2017 - 08:00
-1

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

Mi comprensión es la siguiente:

El paralelismo es una forma de acelerar el procesamiento. Ya sea que haga 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 su programa está roto). No agrega nueva funcionalidad a algún programa, solo velocidad.

Mientras que la concurrencia es sobre cosas que no puedes hacer secuencialmente. Por ejemplo, al servicio de 3 páginas web diferentes al mismo tiempo para 3 clientes, mientras se espera la próxima solicitud. (Aunque se podría simular esto hasta cierto punto mediante el intercalado, como se hizo en los días más antiguos). Tenga en cuenta que el comportamiento de los programas concurrentes no es determinista. Por ejemplo, no está claro, cuál de los 3 clientes se atenderá completamente primero. Puede realizar varias pruebas y obtener un resultado diferente cada vez con respecto al pedido 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 tiempo razonable.

Por lo general, el caballo de trabajo de un cómputo paralelo no es consciente del paralelismo, ni le importa. Mientras que 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.

    
respondido por el Ingo 16.03.2013 - 01:40

Lea otras preguntas en las etiquetas

Comentarios Recientes

Una cosa que nadie parece haber confirmado en la programación es la semántica de los bucles de cola. La mayoría de los programas no necesitan incluir bucles en absoluto. Sin embargo, en la mayoría de los sistemas más grandes, cada subproceso puede llamar tantos subprocesos como cree que son realmente necesarios para cosas como esperar declaraciones de retorno, creación de subprocesos, inundación de subprocesos y subprocesos que ejecutan conexiones ajax mientras se usa otro subproceso para realizar un trabajo... Lee mas