¿Cuál es la diferencia entre concurrencia y paralelismo?

1076

¿Cuál es la diferencia entre concurrencia y paralelismo?

Se aprecian ejemplos.

StackUnderflow
fuente
41
respuesta corta: la concurrencia es dos líneas de clientes que ordenan desde un solo cajero (las líneas se turnan para ordenar); Paralelismo son dos líneas de clientes que ordenan a dos cajeros (cada línea tiene su propio cajero).
chharvey
@chharvey: Realmente creo que esta debería ser la respuesta. Corto (dos líneas de texto, si deja "respuesta corta"), hasta el punto, instantáneamente comprensible. ¡Bien hecho!
Mike Maxwell

Respuestas:

1270

La concurrencia es cuando dos o más tareas pueden comenzar, ejecutarse y completarse en períodos de tiempo superpuestos. No significa necesariamente que ambos se estén ejecutando en el mismo instante. Por ejemplo, multitarea en una máquina de un solo núcleo.

El paralelismo es cuando las tareas se ejecutan literalmente al mismo tiempo, por ejemplo, en un procesador multinúcleo.


Citando la Guía de programación multiproceso de Sun :

  • Concurrencia: Una condición que existe cuando al menos dos hilos están progresando. Una forma más generalizada de paralelismo que puede incluir la división en el tiempo como una forma de paralelismo virtual.

  • Paralelismo: una condición que surge cuando al menos dos hilos se ejecutan simultáneamente.

RichieHindle
fuente
169
Me gusta esta respuesta, pero tal vez iría más allá y caracterizaría la concurrencia como una propiedad de un programa o sistema (y el paralelismo como el comportamiento en tiempo de ejecución de ejecutar múltiples tareas al mismo tiempo).
Adrian Mouat
24
Me gusta mucho el comentario de Adrian Mouat. Vea también esta excelente explicación: haskell.org/haskellwiki/Parallelism_vs._Concurrency
jberryman
99
@Raj: Correcto, el paralelismo (en el sentido de subprocesamiento múltiple) no es posible con procesadores de un solo núcleo.
RichieHindle
55
Si Secuencial y Paralelo fueran valores en una enumeración, ¿cuál sería el nombre de esa enumeración?
toddmo
11
Para ese fin, la cita de Sun puede ser redactada de la siguiente manera: - Concurrencia: una condición que existe cuando, durante un período de tiempo determinado, dos hilos están progresando - Paralelismo: una condición que surge cuando, en un momento determinado , dos hilos se ejecutan simultáneamente
Phillip
495

Por qué existe la confusión

La confusión existe porque el significado del diccionario de ambas palabras es casi el mismo:

  • Concurrente : existente, sucediendo o hecho al mismo tiempo (dictionary.com)
  • Paralelo : muy similar y a menudo sucede al mismo tiempo (merriam webster).

Sin embargo, la forma en que se usan en informática y programación es bastante diferente. Aquí está mi interpretación:

  • Concurrencia : interrumpibilidad
  • Paralelismo : Independencia

Entonces, ¿qué quiero decir con las definiciones anteriores?

Aclararé con una analogía del mundo real. Digamos que tienes que hacer 2 tareas muy importantes en un día:

  1. Consigue un pasaporte
  2. Haz una presentación

Ahora, el problema es que la tarea 1 requiere que vayas a una oficina gubernamental extremadamente burocrática que te hace esperar 4 horas en fila para obtener tu pasaporte. Mientras tanto, su oficina requiere la tarea 2, y es una tarea crítica. Ambos deben estar terminados en un día específico.

Caso 1: Ejecución secuencial

Por lo general, conducirá a la oficina de pasaportes durante 2 horas, esperará en la fila durante 4 horas, completará la tarea, regresará dos horas, irá a casa, permanecerá despierto 5 horas más y hará la presentación.

Caso 2: Ejecución concurrente

Pero eres inteligente. Planeas con anticipación. Lleva una computadora portátil y, mientras espera en la fila, comienza a trabajar en su presentación. De esta manera, una vez que regrese a casa, solo necesita trabajar 1 hora extra en lugar de 5.

En este caso, ambas tareas las realiza usted, solo en pedazos. Interrumpió la tarea del pasaporte mientras esperaba en la fila y trabajó en la presentación. Cuando llamaron a su número, interrumpió la tarea de presentación y cambió a la tarea de pasaporte. El ahorro de tiempo era esencialmente posible debido a la capacidad de interrupción de ambas tareas.

La concurrencia, OMI, puede entenderse como la propiedad de "aislamiento" en ACID . Dos transacciones de la base de datos se consideran aisladas si las subtransacciones se pueden realizar de una forma intercalada y el resultado final es el mismo que si las dos tareas se realizaran de forma secuencial. Recuerde que tanto para el pasaporte como para las tareas de presentación, usted es el único verdugo .

Caso 3: Ejecución Paralela

Ahora, como eres un tipo tan inteligente, obviamente eres un superior y tienes un asistente. Entonces, antes de partir para comenzar la tarea de pasaporte, lo llama y le dice que prepare el primer borrador de la presentación. Pasas todo el día y terminas la tarea de pasaporte, vuelves y ves tus correos, y encuentras el borrador de la presentación. Ha hecho un trabajo bastante sólido y con algunas ediciones en 2 horas más, lo finalizas.

Ahora, dado que su asistente es tan inteligente como usted, pudo trabajar en él de forma independiente , sin necesidad de pedirle constantemente aclaraciones. Por lo tanto, debido a la independencia de las tareas, fueron ejecutadas al mismo tiempo por dos verdugos diferentes .

¿Aún conmigo? Bien...

Caso 4: concurrente pero no paralelo

¿Recuerdas tu tarea de pasaporte, donde tienes que esperar en la fila? Como es su pasaporte, su asistente no puede esperar en la fila. Por lo tanto, la tarea del pasaporte tiene capacidad de interrupción (puede detenerla mientras espera en la línea y reanudarla más tarde cuando se llama a su número), pero no es independiente (su asistente no puede esperar en su lugar).

Caso 5: Paralelo pero no concurrente

Supongamos que la oficina del gobierno tiene un control de seguridad para ingresar a las instalaciones. Aquí, debe quitar todos los dispositivos electrónicos y enviarlos a los oficiales, y solo los devolverán después de completar su tarea.

En este caso, la tarea del pasaporte no es independiente ni interrumpible . Incluso si está esperando en la fila, no puede trabajar en otra cosa porque no tiene el equipo necesario.

Del mismo modo, supongamos que la presentación es de naturaleza tan matemática que requiere una concentración del 100% durante al menos 5 horas. No puede hacerlo mientras espera en la cola para la tarea de pasaporte, incluso si tiene su computadora portátil con usted.

En este caso, la tarea de presentación es independiente (usted o su asistente pueden realizar 5 horas de esfuerzo enfocado), pero no interrumpible .

Caso 6: Ejecución concurrente y paralela

Ahora, digamos que además de asignar su asistente a la presentación, también lleva consigo una computadora portátil para la tarea de pasaporte. Mientras espera en la fila, verá que su asistente ha creado las primeras 10 diapositivas en un mazo compartido. Envías comentarios sobre su trabajo con algunas correcciones. Más tarde, cuando llegue a casa, en lugar de 2 horas para finalizar el borrador, solo necesita 15 minutos.

Esto fue posible porque la tarea de presentación tiene independencia (cualquiera de ustedes puede hacerlo) e interrumpibilidad (puede detenerla y reanudarla más tarde). Por lo tanto , ejecutó simultáneamente ambas tareas y ejecutó la tarea de presentación en paralelo.

Digamos que, además de ser demasiado burocrático, la oficina del gobierno es corrupta. Por lo tanto, puede mostrar su identificación, ingresarla, comenzar a esperar en línea para que se llame a su número, sobornar a un guardia y a otra persona para que mantenga su posición en la línea, escabullirse, regresar antes de llamar a su número y reanudar la espera tú mismo.

En este caso, puede realizar las tareas de pasaporte y presentación simultáneamente y en paralelo. Puede escabullirse, y su puesto lo ocupa su asistente. Ambos pueden trabajar en la presentación, etc.


Volver a la informática

En el mundo de la computación, aquí hay ejemplos de escenarios típicos de cada uno de estos casos:

  • Caso 1: Procesamiento de interrupción.
  • Caso 2: cuando solo hay un procesador, pero todas las tareas de ejecución tienen tiempos de espera debido a E / S.
  • Caso 3: a menudo visto cuando hablamos de clústeres de reducción de mapas o hadoop.
  • Caso 4: Creo que el Caso 4 es raro. Es raro que una tarea sea concurrente pero no paralela. Pero podría suceder. Por ejemplo, suponga que su tarea requiere acceso a un chip computacional especial al que solo se puede acceder a través del procesador 1. Por lo tanto, incluso si el procesador 2 está libre y el procesador 1 está realizando alguna otra tarea, la tarea de cálculo especial no puede continuar en el procesador 2.
  • Caso 5: también raro, pero no tan raro como el Caso 4. Un código no concurrente puede ser una región crítica protegida por mutexes. Una vez que se inicia, debe ejecutarse hasta su finalización. Sin embargo, dos regiones críticas diferentes pueden progresar simultáneamente en dos procesadores diferentes.
  • Caso 6: OMI, la mayoría de las discusiones sobre programación paralela o concurrente se refieren básicamente al Caso 6. Esta es una combinación de ejecuciones paralelas y concurrentes.

Concurrencia y listo

Si ve por qué Rob Pike dice que la concurrencia es mejor, debe comprender que la razón es. Tiene una tarea realmente larga en la que hay múltiples períodos de espera en los que espera algunas operaciones externas como la lectura de archivos y la descarga de la red. En su conferencia, todo lo que dice es: "simplemente rompa esta larga tarea secuencial para que pueda hacer algo útil mientras espera". Es por eso que habla de diferentes organizaciones con varios gophers.

Ahora la fortaleza de Go viene de hacer que esta ruptura sea realmente fácil con gopalabras clave y canales. Además, hay un excelente soporte subyacente en el tiempo de ejecución para programar estas gorutinas.

Pero esencialmente, ¿es la concurrencia mejor que el paralelismo?

¿Son las manzanas mejores que las naranjas?

Methos
fuente
Gracias por el caso 5. A menudo pienso que implícito paralelo significa concurrencia.
hqt
2
El bucle de eventos Node.js es un buen ejemplo para el caso 4. Aunque el procesador B tiene recursos libres, la solicitud X debe ser manejada por el procesador A que está ocupado procesando Y. Si se llama a setTimeout para Y, X puede procesarse, entonces, después del tiempo de espera, Y también terminará de procesarse.
Lucas Janon
Vale la pena señalar las dos definiciones de una palabra "concurrencia" que se pusieron en la respuesta aceptada y esta es bastante distinta . El primero se refiere a la concepción de ejecutar varias tareas en períodos de tiempo superpuestos (es decir, el paralelismo significa concurrencia por def), el segundo se refiere a la concepción de interrumpir una tarea para ejecutar otra.
Mergasov
Similar al comentario anterior: Python multiproceso es un ejemplo del caso 4. No creo que este caso sea poco común. Cualquier bloqueo global del intérprete resultará en el caso 4 (si permite la concurrencia).
chub500
246

Me gusta la charla de Rob Pike: la concurrencia no es paralelismo (¡es mejor!) (Diapositivas) (charla)

¡Rob generalmente habla sobre Go y por lo general aborda la cuestión de concurrencia vs paralelismo en una explicación visual e intuitiva! Aquí hay un breve resumen:

Tarea: ¡Quememos un montón de manuales de idiomas obsoletos! ¡Uno a la vez!

Tarea

Concurrencia: ¡ Hay muchas descomposiciones simultáneas de la tarea! Un ejemplo:

Gophers

Paralelismo: la configuración previa ocurre en paralelo si hay al menos 2 gophers trabajando al mismo tiempo o no.

trasferir
fuente
99
Para ver el video, visite blog.heroku.com/archives/2013/2/24/…
Pramod
15
Lo siento, tuve que rechazarlo por el bit "es mejor". La respuesta correcta es que es diferente. La concurrencia es parte del problema. El paralelismo es una parte de la solución.
pyon
@ EduardoLeón Obviamente no verificó el nombre de la charla. La concurrencia no es un problema, es solo una forma de pensar en un problema / tarea.
Asfer
55
@asfer Concurrency es una parte de la estructura del problema. Por cierto, no confunda "concurrencia" (el problema) con "control de concurrencia" (una solución, a menudo utilizada junto con paralelismo).
pyon
1
Lo vi y, sinceramente, no me gustó. Agrega complicaciones innecesarias y nerviosismo a algo que debería explicarse de una manera mucho más simple (verifique aquí la respuesta de los malabaristas).
jj_
146

Para agregar a lo que otros han dicho:

La concurrencia es como tener a un malabarista haciendo malabares con muchas pelotas. Independientemente de cómo parezca, el malabarista solo atrapa / lanza una pelota por mano a la vez. Paralelismo es tener varios malabaristas haciendo malabarismos con pelotas simultáneamente.

Thomas T
fuente
2
Voy a ser exigente, pero si estás haciendo malabares con un par de bolas, puedes tener dos bolas al mismo tiempo (dependiendo de cómo lo hagas).
thebugfinder
52
@thebugfinder, para asegurarse de que no haya más margen de error en el ejemplo de Thomas. La concurrencia es como una persona que hace malabares con solo 1 mano. Independientemente de cómo parezca que la persona solo está sosteniendo como máximo una pelota a la vez. El paralelismo es cuando el malabarista usa ambas manos.
bigtunacan
lo que realmente quise decir con "par de bolas" fue "número par de bolas"
thebugfinder
1
Muy inteligente respuesta. Definitivamente puedo ver el punto del buscador de insectos, pero me gusta mucho esta respuesta si se toma en cuenta una acción a la vez y se acuerda.
BK
2
Creo que es mejor con "Paralelismo es tener una persona para cada pelota". Si aumenta el número de bolas (imagine solicitudes web), esas personas pueden comenzar a hacer malabarismos, haciendo que la ejecución sea simultánea y paralela. También me encantaría que alguien pudiera explicar el patrón del reactor con el ejemplo de los malabaristas ..
jj_
120

Digamos que tiene un programa que tiene dos hilos. El programa puede ejecutarse de dos maneras:

Concurrency                 Concurrency + parallelism
(Single-Core CPU)           (Multi-Core CPU)
 ___                         ___ ___
|th1|                       |th1|th2|
|   |                       |   |___|
|___|___                    |   |___
    |th2|                   |___|th2|
 ___|___|                    ___|___|
|th1|                       |th1|
|___|___                    |   |___
    |th2|                   |   |th2|

En ambos casos, tenemos simultaneidad por el simple hecho de que tenemos más de un hilo ejecutándose.

Si ejecutamos este programa en una computadora con un solo núcleo de CPU, el sistema operativo estaría cambiando entre los dos subprocesos, permitiendo que se ejecute un subproceso a la vez.

Si ejecutamos este programa en una computadora con una CPU multinúcleo, podríamos ejecutar los dos subprocesos en paralelo , uno al lado del otro al mismo tiempo.

Pithikos
fuente
44
Me gustaron los bloques de hilo. ¡Simple pero perfecto! Gracias por una respuesta tan asombrosa.
bozzmob
53

Simultaneidad: si un solo procesador resuelve dos o más problemas. texto alternativo

Paralelismo: si un problema es resuelto por múltiples procesadores.

texto alternativo

Rajendra Uppal
fuente
55
No estoy de acuerdo con esto: un programa diseñado para ser concurrente puede o no ejecutarse en paralelo; La concurrencia es más un atributo de un programa, el paralelismo puede ocurrir cuando se ejecuta.
Adrian Mouat
36

Trataré de explicar con un ejemplo interesante y fácil de entender. :)

Suponga que una organización organiza un torneo de ajedrez donde 10 jugadores ( con las mismas habilidades para jugar ajedrez ) desafiarán a un campeón profesional de ajedrez. Y dado que el ajedrez es un juego 1: 1, los organizadores deben realizar 10 juegos de manera eficiente en el tiempo para que puedan terminar todo el evento lo más rápido posible.

Esperemos que los siguientes escenarios describan fácilmente múltiples formas de llevar a cabo estos 10 juegos:

1) SERIE : digamos que el profesional juega con cada persona uno por uno, es decir, comienza y termina el juego con una persona y luego comienza el siguiente juego con la siguiente persona y así sucesivamente. En otras palabras, decidieron conducir los juegos secuencialmente. Entonces, si un juego demora 10 minutos en completarse, 10 juegos demorarán 100 minutos, también suponga que la transición de un juego a otro toma 6 segundos, luego, para 10 juegos, será 54 segundos (aproximadamente 1 minuto).

así que todo el evento se completará aproximadamente en 101 minutos ( PEOR ENFOQUE )

2) CONCURRENTE : digamos que el profesional juega su turno y pasa al siguiente jugador, por lo que los 10 jugadores juegan simultáneamente pero el jugador profesional no está con dos personas a la vez, él juega su turno y pasa a la siguiente persona. Ahora suponga que el jugador profesional tarda 6 segundos en jugar su turno y también el tiempo de transición del jugador profesional con dos jugadores es de 6 segundos, por lo que el tiempo de transición total para volver al primer jugador será de 1 minuto (10x6 segundos). Por lo tanto, para cuando regrese a la primera persona con la que se inició el evento, han pasado 2 minutos (10xtime_per_turn_by_champion + 10xtransition_time = 2mins)

Suponiendo que todos los jugadores tomen 45 segundos para completar su turno, de acuerdo con 10 minutos por juego del evento SERIAL, el no. de rondas antes de que termine un juego debe 600 / (45 + 6) = 11 rondas (aprox.)

Entonces, todo el evento se completará aproximadamente en 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20.35mins (aproximadamente)

VEA LA MEJORA de 101 minutos a 20.35 minutos ( MEJOR ENFOQUE )

3) PARALELO : digamos que los organizadores obtienen algunos fondos adicionales y, por lo tanto, decidieron invitar a dos jugadores campeones profesionales (ambos igualmente capaces) y dividieron el conjunto de los mismos 10 jugadores (retadores) en dos grupos de 5 cada uno y los asignaron a dos campeones, es decir, uno Agrupar cada uno. Ahora el evento progresa en paralelo en estos dos conjuntos, es decir, al menos dos jugadores (uno en cada grupo) juegan contra los dos jugadores profesionales en su grupo respectivo.

Sin embargo, dentro del grupo, el jugador profesional tomará un jugador a la vez (es decir, secuencialmente), por lo que sin ningún cálculo puede deducir fácilmente que todo el evento se completará aproximadamente en 101/2 = 50.5 minutos para completar

VEA LA MEJORA de 101 minutos a 50.5 minutos ( BUEN ENFOQUE )

4) CONCURRENTE + PARALELO : en el escenario anterior, digamos que los dos jugadores campeones jugarán simultáneamente (lea el segundo punto) con los 5 jugadores en sus respectivos grupos, por lo que ahora los juegos entre grupos se ejecutan en paralelo, pero dentro del grupo se ejecutan simultáneamente.

Entonces, los juegos en un grupo se completarán aproximadamente en 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15.5mins (aproximadamente)

Entonces, todo el evento (que involucra a dos de estos grupos paralelos) se completará aproximadamente en 15.5 minutos

VEA LA MEJORA de 101 minutos a 15.5 minutos ( MEJOR ENFOQUE )

NOTA: en el escenario anterior, si reemplaza 10 jugadores con 10 trabajos similares y dos jugadores profesionales con dos núcleos de CPU, nuevamente el siguiente orden seguirá siendo cierto:

SERIE> PARALELO> CONCURRENTE> CONCURRENTE + PARALELO

(NOTA: este orden puede cambiar para otros escenarios, ya que este orden depende en gran medida de la interdependencia de los trabajos, la comunicación necesita trabajos en blanco y negro y trabajos de transición en blanco y negro)

sactiw
fuente
2
Gran explicación Hay una adición. El modelo concurrente para el segundo caso (cuando un jugador profesional mueve jugadores b / n) mejorará solo si el jugador hace su turno en 45 segundos. En otras palabras, deberíamos tener E / S esperando en todo el proceso. Si un jugador normal puede girar en menos de 45 segundos (5 o puede ser 10 segundos) la mejora será menor. Por lo tanto, si no tenemos tiempo de espera de E / S en nuestro trabajo, la concurrencia será más o menos lo mismo que una ejecución en serie.
Psylone
33

Ejemplo simple:

Simultáneamente es: "Dos colas que acceden a un cajero automático"

Paralelo es: "Dos colas y dos cajeros automáticos"

Saurabh Pakhare
fuente
¿Y multihilo? Solo pensando en cómo encaja el término multihilo en el escenario anterior. En este caso, ¿el Concurrent == Multithreading, como en uno de cada cola va a ATM por cada momento?
KhoPhi
31

Imagine aprender un nuevo lenguaje de programación viendo un video tutorial. Debe pausar el video, aplicar lo que se dice en el código y luego continuar viendo. Eso es concurrencia.

Ahora eres un programador profesional. Y disfrutas escuchando música tranquila mientras codificas. Eso es paralelismo.

Como Andrew Gerrand dijo en el blog de GoLang

La concurrencia se trata de lidiar con muchas cosas a la vez. El paralelismo se trata de hacer muchas cosas a la vez.

Disfrutar.

Ramy M. Mousa
fuente
29

Resuelven diferentes problemas. La concurrencia resuelve el problema de tener escasos recursos de CPU y muchas tareas. Entonces, crea hilos o rutas de ejecución independientes a través del código para compartir tiempo en el recurso escaso. Hasta hace poco, la concurrencia ha dominado la discusión debido a la disponibilidad de la CPU.

El paralelismo resuelve el problema de encontrar suficientes tareas y tareas apropiadas (las que se pueden dividir correctamente) y distribuirlas entre abundantes recursos de CPU. El paralelismo siempre ha existido, por supuesto, pero está llegando a la vanguardia porque los procesadores multinúcleo son muy baratos.

JP Alioto
fuente
28

concurencia: múltiples flujos de ejecución con el potencial de compartir recursos

Ej: dos hilos que compiten por un puerto de E / S.

paralelismo: dividir un problema en múltiples fragmentos similares.

Por ejemplo: analizar un archivo grande ejecutando dos procesos en cada mitad del archivo.

Mihai Toader
fuente
21

La ejecución de programación concurrente tiene 2 tipos: programación concurrente no paralela y programación concurrente paralela (también conocida como paralelismo).

La diferencia clave es que, para el ojo humano, los hilos en concurrencia no paralela parecen ejecutarse al mismo tiempo, pero en realidad no lo hacen. En la concurrencia no paralela, los subprocesos cambian rápidamente y se turnan para usar el procesador a través del corte de tiempo. Mientras que en el paralelismo hay múltiples procesadores disponibles, múltiples hilos pueden ejecutarse en diferentes procesadores al mismo tiempo. ingrese la descripción de la imagen aquí

Referencia: Introducción a la concurrencia en lenguajes de programación

Apurva Thorat
fuente
8
una imagen que vale más que mil palabras
senseiwu
21

El paralelismo es la ejecución simultánea de procesos en un multiple cores per CPUo multiple CPUs (on a single motherboard).

La concurrencia es cuando se logra el paralelismo en un single core/CPUmediante el uso de algoritmos de programación que dividen el tiempo de la CPU (intervalo de tiempo). Los procesos están intercalados .

Unidades:

  • 1 o muchos núcleos en una sola CPU (casi todos los procesadores modernos)
  • 1 o muchas CPU en una placa base (piense en los servidores de la vieja escuela)
  • 1 aplicación es 1 programa (piense en el navegador Chrome)
  • 1 programa puede tener 1 o muchos procesos (piense que cada pestaña del navegador Chrome es un proceso)
  • 1 proceso puede tener 1 o varios subprocesos de 1 programa (pestaña de Chrome que reproduce videos de Youtube en 1 subproceso, otro subproceso generado para la sección de comentarios, otro para la información de inicio de sesión de los usuarios)
  • Por lo tanto, 1 programa puede tener 1 o muchos hilos de ejecución
  • 1 proceso es thread(s)+allocated memory resources by OS (montón, registros, pila, memoria de clase)
nabster
fuente
2
Creo que esta es la respuesta perfecta en el mundo de la informática.
sofs1
1
Esta respuesta debe ser la aceptada, no la filosofía de arriba y de abajo
Eugen Sunic
10

Concurrencia => Cuando se realizan múltiples tareas en períodos de tiempo superpuestos con recursos compartidos (potencialmente maximizando la utilización de los recursos).

Paralelo => cuando una sola tarea se divide en múltiples subtareas independientes simples que se pueden realizar simultáneamente.

MBK
fuente
¿Cómo describiría un sistema de procesador de un solo núcleo que realiza múltiples tareas (segmentos de tiempo) para dar la apariencia de un proceso superpuesto? Cuando la concurrencia se define como ejecución en períodos de tiempo superpuestos, incluye este procesamiento. Ha descrito la ejecución simultánea que la excluye según su definición de concurrencia.
acarlon
9

Piense en ello como colas de servicio donde el servidor solo puede servir el primer trabajo en una cola.

1 servidor, 1 cola de trabajos (con 5 trabajos) -> sin concurrencia, sin paralelismo (solo un trabajo se está completando, el siguiente trabajo en la cola tiene que esperar hasta que se termine el trabajo y no hay otro servidor para servicio)

1 servidor, 2 o más colas diferentes (con 5 trabajos por cola) -> concurrencia (ya que el servidor comparte el tiempo con todos los primeros trabajos en colas, por igual o ponderado), todavía no hay paralelismo ya que en cualquier instante, hay uno y solo trabajo siendo atendido.

2 o más servidores, una cola -> paralelismo (2 trabajos realizados en el mismo instante) pero sin concurrencia (el servidor no comparte el tiempo, el 3er trabajo tiene que esperar hasta que uno de los servidores se complete).

2 o más servidores, 2 o más colas diferentes -> concurrencia y paralelismo

En otras palabras, la concurrencia es tiempo compartido para completar un trabajo, PUEDE tomar el mismo tiempo para completar su trabajo, pero al menos comienza temprano. Lo importante es que los trabajos se pueden dividir en trabajos más pequeños, lo que permite el intercalado.

El paralelismo se logra con solo más CPU, servidores, personas, etc. que se ejecutan en paralelo.

Tenga en cuenta que si se comparten los recursos, no se puede lograr un paralelismo puro, pero aquí es donde la concurrencia tendría su mejor uso práctico, asumiendo otro trabajo que no necesita ese recurso.

Rahul
fuente
7

Voy a ofrecer una respuesta que entre en conflicto con algunas de las respuestas populares aquí. En mi opinión, concurrencia es un término general que incluye paralelismo. La concurrencia se aplica a cualquier situación en la que tareas o unidades de trabajo distintas se superpongan en el tiempo. El paralelismo se aplica más específicamente a situaciones en las que se evalúan / ejecutan distintas unidades de trabajo al mismo tiempo físico. La razón de ser del paralelismo es acelerar el software que puede beneficiarse de múltiples recursos informáticos físicos. El otro concepto importante que se ajusta a la concurrencia es la interactividad. Interactividadse aplica cuando la superposición de tareas es observable desde el mundo exterior. La razón de ser de la interactividad es crear software que responda a entidades del mundo real como usuarios, pares de red, periféricos de hardware, etc.

El paralelismo y la interactividad son dimensiones de concurrencia casi completamente independientes. Para un proyecto en particular, a los desarrolladores les puede interesar cualquiera, ambos o ninguno. Tienden a confundirse, sobre todo porque la abominación que son hilos da una primitiva razonablemente conveniente para hacer ambas cosas.

Un poco más de detalle sobre el paralelismo :

El paralelismo existe a escalas muy pequeñas (p. Ej., Paralelismo de nivel de instrucción en procesadores), escalas medias (p. Ej. Procesadores multinúcleo) y escalas grandes (p. Ej. Clústeres informáticos de alto rendimiento). La presión sobre los desarrolladores de software para exponer más paralelismo a nivel de hilo ha aumentado en los últimos años, debido al crecimiento de los procesadores multinúcleo. El paralelismo está íntimamente conectado con la noción de dependencia . Las dependencias limitan la medida en que se puede lograr el paralelismo; dos tareas no pueden ejecutarse en paralelo si una depende de la otra (ignorando la especulación).

Hay muchos patrones y marcos que los programadores usan para expresar paralelismo: tuberías, grupos de tareas, operaciones agregadas en estructuras de datos ("matrices paralelas").

Un poco más de detalle sobre la interactividad :

La forma más básica y común de interactividad es con eventos (es decir, un bucle de eventos y controladores / devoluciones de llamada). Para tareas simples, los eventos son geniales. Intentar hacer tareas más complejas con eventos entra en la extracción de la pila (también conocido como infierno de devolución de llamada; también conocido como inversión de control). Cuando te hartas de los eventos, puedes probar cosas más exóticas como generadores, corutinas (también conocidas como Async / Await) o ​​hilos cooperativos.

Por amor al software confiable, no use hilos si lo que busca es interactividad.

Curmudgeonliness

No me gusta el eslogan de Rob Pike "la concurrencia no es paralelismo, es mejor". La concurrencia no es ni mejor ni peor que el paralelismo. La concurrencia incluye interactividad que no se puede comparar de una manera mejor / peor con el paralelismo. Es como decir "controlar el flujo es mejor que los datos".

Ben Ylvisaker
fuente
6

En electrónica, la serie y el paralelo representan un tipo de topología estática, determinando el comportamiento real del circuito. Cuando no hay concurrencia, el paralelismo es determinista .

Para describir fenómenos dinámicos relacionados con el tiempo , utilizamos los términos secuenciales y concurrentes . Por ejemplo, un determinado resultado puede obtenerse a través de una determinada secuencia de tareas (por ejemplo, una receta). Cuando estamos hablando con alguien, estamos produciendo una secuencia de palabras. Sin embargo, en realidad, muchos otros procesos ocurren en el mismo momento y, por lo tanto, coinciden con el resultado real de una determinada acción. Si mucha gente está hablando al mismo tiempo, las conversaciones concurrentes pueden interferir con nuestra secuencia, pero los resultados de esta interferencia no se conocen de antemano. La concurrencia introduce indeterminación .

La caracterización serial / paralela y secuencial / concurrente es ortogonal. Un ejemplo de esto es en la comunicación digital. En un adaptador en serie , un mensaje digital se distribuye temporalmente (es decir, secuencialmente ) a lo largo de la misma línea de comunicación (por ejemplo, un cable). En un adaptador paralelo , esto se divide también en líneas de comunicación paralelas (por ejemplo, muchos cables) y luego se reconstruye en el extremo receptor.

Imaginemos un juego, con 9 niños. Si los desechamos como una cadena, damos un mensaje al principio y lo recibimos al final, tendremos una comunicación en serie. Más palabras componen el mensaje, que consiste en una secuencia de unidades de comunicación.

I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....

Este es un proceso secuencial reproducido en una infraestructura en serie .

Ahora, imaginemos para dividir a los niños en grupos de 3. Dividimos la frase en tres partes, le damos el primero al niño de la línea a nuestra izquierda, el segundo al niño de la línea central, etc.

I like ice-cream so much. > I like    > X > X > X > .... > ....
                          > ice-cream > X > X > X > ....
                          > so much   > X > X > X > ....

Este es un proceso secuencial reproducido en una infraestructura paralela (aunque parcialmente serializada aunque).

En ambos casos, suponiendo que haya una comunicación perfecta entre los niños, el resultado se determina de antemano.

Si hay otras personas que hablan con el primer hijo al mismo tiempo que usted, tendremos procesos concurrentes . No sabemos qué proceso será considerado por la infraestructura, por lo que el resultado final no está determinado de antemano.

s1l3n0
fuente
+1 Interesante. Al calcular una definición, según la respuesta actualmente aceptada concurrente significa ejecución en períodos de tiempo superpuestos, no necesariamente simultáneamente (lo que sería paralelo). En electrónica, ¿cómo describe los circuitos que están diseñados para dar la apariencia de cosas que suceden al mismo tiempo, pero que simplemente cambian muy rápidamente? Para continuar con su analogía del helado: me gusta mucho el helado> niño A1 me gusta> niño B1 helado> niño C1 tanto> niño A2 me gusta> niño B2 helado <niño C2 tanto ...
acarlon
Vi esto por primera vez aquí: s1l3n0.blogspot.com/2013/04/… .
FrankHB
Sí, refiné / amplié un poco mi respuesta en una de mis notas de blog personales. ;)
s1l3n0
5

La concurrencia es la forma generalizada de paralelismo. 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 subprocesos, administrados por el planificador o grupo de subprocesos)

  2. La ejecución paralela no es posible en un solo procesador sino en múltiples procesadores. (Un proceso por procesador)

  3. La computación distribuida también es un tema relacionado y también se puede llamar computación concurrente, pero lo inverso no es cierto, como el paralelismo.

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


fuente
5

Realmente me gustó esta representación gráfica de otra respuesta: creo que responde la pregunta mucho mejor que muchas de las respuestas anteriores

Paralelismo versus concurrencia Cuando dos hilos se ejecutan en paralelo, ambos se ejecutan al mismo tiempo. Por ejemplo, si tenemos dos hilos, A y B, su ejecución paralela se vería así:

CPU 1: A ------------------------->

CPU 2: B ------------------------->

Cuando dos subprocesos se ejecutan simultáneamente, su ejecución se superpone. La superposición puede ocurrir de una de dos maneras: o los subprocesos se ejecutan al mismo tiempo (es decir, en paralelo, como arriba), o sus ejecuciones se intercalan en el procesador, de la siguiente manera:

CPU 1: A -----------> B ----------> A -----------> B -------- ->

Entonces, para nuestros propósitos, el paralelismo puede considerarse como un caso especial de concurrencia

Fuente: otra respuesta aquí

Espero que ayude.

HopeKing
fuente
4

Realmente me gusta la respuesta de Paul Butcher a esta pregunta (es el escritor de Seven Concurrency Models en Seven Weeks ):

Aunque a menudo se confunden, el paralelismo y la concurrencia son cosas diferentes. La concurrencia es un aspecto del dominio del problema: su código debe manejar múltiples eventos simultáneos (o casi simultáneos) . El paralelismo, por el contrario, es un aspecto del dominio de la solución: desea hacer que su programa se ejecute más rápido procesando diferentes partes del problema en paralelo. Algunos enfoques son aplicables a la concurrencia, algunos al paralelismo y otros a ambos. Comprenda a qué se enfrenta y elija la herramienta adecuada para el trabajo.

dangom
fuente
3

La concurrencia puede involucrar tareas que se ejecutan simultáneamente o no (de hecho, se pueden ejecutar en procesadores / núcleos separados, pero también se pueden ejecutar en "ticks"). Lo importante es que la concurrencia siempre se refiere a hacer una parte de una tarea mayor . Entonces, básicamente es parte de algunos cálculos. Tienes que ser inteligente sobre lo que puedes hacer simultáneamente y qué no hacer y cómo sincronizar.

El paralelismo significa que solo estás haciendo algunas cosas simultáneamente. No necesitan ser parte de la resolución de un problema. Sus hilos pueden, por ejemplo, resolver un solo problema cada uno. Por supuesto, las cosas de sincronización también se aplican, pero desde una perspectiva diferente.

kboom
fuente
3

La "concurrencia" es cuando hay múltiples cosas en progreso .

El "paralelismo" es cuando las cosas concurrentes progresan al mismo tiempo .


Ejemplos de concurrencia sin paralelismo:

  • Múltiples hilos en un solo núcleo.
  • Múltiples mensajes en una cola de mensajes Win32.
  • Múltiples SqlDataReaders en una conexión MARS .
  • Varias promesas de JavaScript en una pestaña del navegador.

Sin embargo, tenga en cuenta que la diferencia entre concurrencia y paralelismo es a menudo una cuestión de perspectiva. Los ejemplos anteriores no son paralelos desde la perspectiva de (efectos observables de) la ejecución de su código. Pero hay paralelismo a nivel de instrucción incluso dentro de un solo núcleo. Hay piezas de hardware que hacen cosas en paralelo con la CPU y luego interrumpen la CPU cuando se hace. La GPU podría estar dibujando en la pantalla mientras se ejecuta el procedimiento de ventana o el controlador de eventos. El DBMS podría estar atravesando B-Trees para la siguiente consulta mientras aún está obteniendo los resultados de la anterior. El navegador podría estar haciendo diseño o redes mientras Promise.resolve()se ejecuta su Etcétera etcétera...

Ahí vas. El mundo está tan desordenado como siempre;)

Branko Dimitrijevic
fuente
3

La forma más simple y elegante de entender los dos en mi opinión es esta. La concurrencia permite el entrelazado de la ejecución y, por lo tanto, puede dar la ilusión de paralelismo. Esto significa que un sistema concurrente puede ejecutar su video de Youtube junto con usted escribiendo un documento en Word, por ejemplo. El sistema operativo subyacente, al ser un sistema concurrente, permite que esas tareas intercalen su ejecución. Debido a que las computadoras ejecutan instrucciones tan rápido, esto da la apariencia de hacer dos cosas a la vez.

El paralelismo es cuando tales cosas realmente están en paralelo. En el ejemplo anterior, puede encontrar que el código de procesamiento de video se está ejecutando en un solo núcleo y la aplicación de Word se está ejecutando en otro. Tenga en cuenta que esto significa que un programa concurrente también puede estar en paralelo. La estructuración de su aplicación con subprocesos y procesos le permite a su programa explotar el hardware subyacente y, posiblemente, hacerlo en paralelo.

¿Por qué no hacer que todo sea paralelo entonces? Una razón es porque la concurrencia es una forma de estructurar programas y es una decisión de diseño para facilitar la separación de preocupaciones, mientras que el paralelismo a menudo se usa en nombre del desempeño. Otra es que algunas cosas fundamentalmente no se pueden hacer completamente en paralelo. Un ejemplo de esto sería agregar dos cosas al final de una cola: no puede insertar ambas al mismo tiempo. Algo debe ir primero y el otro detrás de él, o de lo contrario arruinarás la cola. Aunque podemos intercalar dicha ejecución (y así obtenemos una cola concurrente), no puede tenerla paralela.

¡Espero que esto ayude!

Daniel Soutar
fuente
3

La programación concurrente se refiere a operaciones que parecen superponerse y se ocupa principalmente de la complejidad que surge debido al flujo de control no determinista. Los costos cuantitativos asociados con los programas concurrentes son típicamente tanto el rendimiento como la latencia. Los programas concurrentes a menudo están vinculados a IO pero no siempre, por ejemplo, los recolectores de basura concurrentes están completamente en la CPU. El ejemplo pedagógico de un programa concurrente es un rastreador web. Este programa inicia solicitudes de páginas web y acepta las respuestas simultáneamente a medida que los resultados de las descargas están disponibles, acumulando un conjunto de páginas que ya han sido visitadas. El flujo de control no es determinista porque las respuestas no se reciben necesariamente en el mismo orden cada vez que se ejecuta el programa. Esta característica puede dificultar la depuración de programas concurrentes. Algunas aplicaciones son fundamentalmente concurrentes, por ejemplo, los servidores web deben manejar las conexiones del cliente al mismo tiempo. Erlang es quizás el próximo lenguaje más prometedor para la programación altamente concurrente.

La programación paralela se refiere a operaciones que se superponen con el objetivo específico de mejorar el rendimiento. Las dificultades de la programación concurrente se evaden haciendo que el flujo de control sea determinista. Por lo general, los programas generan conjuntos de tareas secundarias que se ejecutan en paralelo y la tarea principal solo continúa una vez que finaliza cada subtarea. Esto hace que los programas paralelos sean mucho más fáciles de depurar. La parte difícil de la programación paralela es la optimización del rendimiento con respecto a problemas como la granularidad y la comunicación. Esto último sigue siendo un problema en el contexto de los multinúcleos porque hay un costo considerable asociado con la transferencia de datos de un caché a otro. La multiplicación de matriz de matriz densa es un ejemplo pedagógico de programación paralela y se puede resolver de manera eficiente utilizando Straasen ' s algoritmo de divide y vencerás y ataca los subproblemas en paralelo. Cilk es quizás el lenguaje más prometedor para la programación paralela de alto rendimiento en computadoras con memoria compartida (incluidos los multinúcleos).

Copiado de mi respuesta: https://stackoverflow.com/a/3982782

Jon Harrop
fuente
2

Paralelismo: tener múltiples subprocesos realiza tareas similares que son independientes entre sí en términos de datos y recursos que requieren para hacerlo. Por ejemplo: el rastreador de Google puede generar miles de hilos y cada hilo puede hacer su tarea de forma independiente.

Concurrencia: La concurrencia aparece en la imagen cuando ha compartido datos, recursos compartidos entre los hilos. En un sistema transaccional, esto significa que debe sincronizar la sección crítica del código utilizando algunas técnicas como bloqueos, semáforos, etc.

Sudip Bhandari
fuente
Esta debería ser la respuesta aceptada IMO ya que captura la esencia de los dos términos.
michid
2

(Estoy bastante sorprendido de que una pregunta tan fundamental no se resuelva de manera correcta y ordenada durante años ...)

En resumen, tanto la concurrencia como el paralelismo son propiedades de la informática .

A partir de la diferencia, aquí está la explicación de Robert Harper :

Lo primero que hay que entender es que el paralelismo no tiene nada que ver con la concurrencia . La concurrencia se refiere a la composición no determinista de los programas (o sus componentes). El paralelismo se refiere a la eficiencia asintótica de los programas con comportamiento determinista . La concurrencia se trata de gestionar lo inmanejable: los eventos llegan por razones que escapan a nuestro control y debemos responder a ellas. Un usuario hace clic con el mouse, el administrador de ventanas debe responder, aunque la pantalla exige atención. Tales situaciones son inherentemente no deterministas, pero también empleamos pro formano determinismo en un entorno determinista al pretender que los componentes señalan eventos en un orden arbitrario, y que debemos responder a ellos a medida que surgen. La composición no determinista es una poderosa idea de estructuración de programas. El paralelismo, por otro lado, se trata de dependencias entre las subcomputaciones de un cálculo determinista. El resultado no está en duda, pero existen muchos medios para lograrlo, algunos más eficientes que otros. Deseamos aprovechar esas oportunidades para nuestra ventaja.

Pueden ser tipos de propiedades ortogonales en los programas. Lea esta publicación de blog para obtener ilustraciones adicionales. Y este discutió un poco más sobre la diferencia sobre los componentes en la programación , como los hilos.

Tenga en cuenta que los subprocesos o la multitarea son implementaciones de informática que tienen propósitos más concretos. Pueden estar relacionados con el paralelismo y la concurrencia, pero no de manera esencial. Por lo tanto, no son buenas entradas para comenzar la explicación.

Un punto destacado más: el "tiempo" (físico) no tiene casi nada que ver con las propiedades que se analizan aquí. El tiempo es solo una forma de implementación de la medición para mostrar el significado de las propiedades, pero lejos de la esencia. Piense dos veces el papel del "tiempo" en la complejidad del tiempo , que es más o menos similar, incluso la medición a menudo es más significativa en ese caso.

FrankHB
fuente
2

"Concurrente" es hacer cosas, cualquier cosa, al mismo tiempo. Podrían ser cosas diferentes, o la misma cosa. A pesar de la respuesta aceptada, que falta, no se trata de "parecer ser al mismo tiempo". Realmente es al mismo tiempo. Necesita múltiples núcleos de CPU, ya sea usando memoria compartida dentro de un host, o memoria distribuida en diferentes hosts, para ejecutar código concurrente. Las tuberías de 3 tareas distintas que se ejecutan simultáneamente al mismo tiempo son un ejemplo: la tarea de nivel 2 debe esperar a las unidades completadas por la tarea de nivel 1 y la tarea de nivel 3 debe esperar a las unidades de trabajo completadas por tarea-nivel-2. Otro ejemplo es la concurrencia de 1 productor con 1 consumidor; o muchos productores y 1 consumidor; lectores y escritores; et al.

"Paralelo" está haciendo las mismas cosas al mismo tiempo. Es concurrente, pero además es el mismo comportamiento que ocurre al mismo tiempo, y más típicamente en datos diferentes. El álgebra matricial a menudo se puede paralelizar, porque tiene la misma operación ejecutándose repetidamente: por ejemplo, las sumas de columnas de una matriz se pueden calcular todas al mismo tiempo usando el mismo comportamiento (suma) pero en columnas diferentes. Es una estrategia común dividir (dividir) las columnas entre los núcleos de procesador disponibles, de modo que tenga cerca de la misma cantidad de trabajo (número de columnas) que maneja cada núcleo de procesador. Otra forma de dividir el trabajo es la bolsa de tareas donde los trabajadores que terminan su trabajo vuelven a un gerente que reparte el trabajo y obtiene más trabajo dinámicamente hasta que todo esté hecho. El algoritmo de venta de entradas es otro.

No solo el código numérico puede ser paralelo. Los archivos con demasiada frecuencia se pueden procesar en paralelo. En una aplicación de procesamiento de lenguaje natural, para cada uno de los millones de archivos de documentos, es posible que deba contar la cantidad de tokens en el documento. Esto es paralelo, porque está contando tokens, que es el mismo comportamiento, para cada archivo.

En otras palabras, el paralelismo es cuando el mismo comportamiento se realiza simultáneamente. Simultáneamente significa al mismo tiempo, pero no necesariamente el mismo comportamiento. Paralelo es un tipo particular de concurrencia donde sucede lo mismo al mismo tiempo.

Los términos, por ejemplo, incluirán instrucciones atómicas, secciones críticas, exclusión mutua, espera de giro, semáforos, monitores, barreras, paso de mensajes, reducción de mapas, latidos cardíacos, anillo, algoritmos de tickets, hilos, MPI, OpenMP.

El trabajo de Gregory Andrews es uno de los mejores libros de texto: programación multiproceso, paralela y distribuida.

Geoffrey Anderson
fuente
1

Genial, déjame tomar un escenario para mostrar lo que entiendo. supongamos que hay 3 niños nombrados: A, B, C. A y B hablan, C escucha. Para A y B, son paralelos: A: soy A. B: soy B.

Pero para C, su cerebro debe tomar el proceso concurrente para escuchar A y B, tal vez: yo soy IA, soy B.

mannnnerd
fuente
1

La concurrencia simple significa que se están ejecutando más de una tarea (no es necesario en paralelo). Por ejemplo, supongamos que tenemos 3 tareas en cualquier momento: más de una puede estar ejecutándose o todas pueden estar ejecutándose al mismo tiempo.

Paralelismo significa que están literalmente corriendo en paralelo. Entonces, en ese caso, los tres deben ejecutarse al mismo tiempo.

akhil_mittal
fuente
1

La noción de "concurrencia" de Pike es una decisión intencional de diseño e implementación. Un diseño de programa con capacidad concurrente puede o no exhibir "paralelismo" conductual; depende del entorno de tiempo de ejecución.

No desea el paralelismo exhibido por un programa que no fue diseñado para la concurrencia. :-) Pero en la medida en que sea una ganancia neta para los factores relevantes (consumo de energía, rendimiento, etc.), desea un diseño de máxima concurrencia para que el sistema host pueda paralelizar su ejecución cuando sea posible.

El lenguaje de programación Pike's Go ilustra esto en extremo: sus funciones son todos hilos que pueden ejecutarse correctamente simultáneamente, es decir, llamar a una función siempre crea un hilo que se ejecutará en paralelo con la persona que llama si el sistema es capaz de hacerlo. Una aplicación con cientos o incluso miles de hilos es perfectamente común en su mundo. (No soy un experto en Go, esa es solo mi opinión al respecto).

bgat
fuente