¿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?
Respuestas:
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.
fuente
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.
fuente
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 diceConcurrency means, essentially, that task A and task B both need to happen independently of each other
. Entonces, ¿Cuál es la conclusión?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:
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:
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:
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:
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.
fuente
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.
Para más detalles, lea este documento de investigación Conceptos de programación concurrente
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente