¿Cuál es la diferencia entre concurrencia y paralelismo?
Se aprecian ejemplos.
language-agnostic
concurrency
parallel-processing
StackUnderflow
fuente
fuente
Respuestas:
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.
fuente
Por qué existe la confusión
La confusión existe porque el significado del diccionario de ambas palabras es casi el mismo:
Sin embargo, la forma en que se usan en informática y programación es bastante diferente. Aquí está mi interpretación:
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:
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:
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
go
palabras 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?
fuente
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!
Concurrencia: ¡ Hay muchas descomposiciones simultáneas de la tarea! Un ejemplo:
Paralelismo: la configuración previa ocurre en paralelo si hay al menos 2 gophers trabajando al mismo tiempo o no.
fuente
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.
fuente
Digamos que tiene un programa que tiene dos hilos. El programa puede ejecutarse de dos maneras:
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.
fuente
Simultaneidad: si un solo procesador resuelve dos o más problemas.
Paralelismo: si un problema es resuelto por múltiples procesadores.
fuente
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)
fuente
Ejemplo simple:
Simultáneamente es: "Dos colas que acceden a un cajero automático"
Paralelo es: "Dos colas y dos cajeros automáticos"
fuente
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
Disfrutar.
fuente
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.
fuente
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.
fuente
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.
Referencia: Introducción a la concurrencia en lenguajes de programación
fuente
El paralelismo es la ejecución simultánea de procesos en un
multiple cores per CPU
omultiple CPUs (on a single motherboard)
.La concurrencia es cuando se logra el paralelismo en un
single core/CPU
mediante el uso de algoritmos de programación que dividen el tiempo de la CPU (intervalo de tiempo). Los procesos están intercalados .fuente
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.
fuente
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.
fuente
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".
fuente
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.
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.
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.
fuente
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.
La ejecución concurrente es posible en un solo procesador (múltiples subprocesos, administrados por el planificador o grupo de subprocesos)
La ejecución paralela no es posible en un solo procesador sino en múltiples procesadores. (Un proceso por procesador)
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
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.
fuente
Realmente me gusta la respuesta de Paul Butcher a esta pregunta (es el escritor de Seven Concurrency Models en Seven Weeks ):
fuente
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.
fuente
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:
SqlDataReader
s en una conexión MARS .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;)
fuente
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!
fuente
Copiado de mi respuesta: https://stackoverflow.com/a/3982782
fuente
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.
fuente
(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 :
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.
fuente
"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.
fuente
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.
fuente
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.
fuente
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).
fuente