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

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

Los ejemplos son apreciados.

    La concurrencia es cuando dos o más tareas pueden comenzar, ejecutarse y completarse en períodos de tiempo superpuestos. No necesariamente significa que ambos estarán funcionando 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 progtwigció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 el corte de tiempo como una forma de paralelismo virtual.

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

    Por qué existe la confusión

    La confusión existe porque los significados del diccionario de estas dos palabras son casi los mismos:

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

    Sin embargo, la forma en que se utilizan en la informática y la progtwigción son bastante diferentes. Aquí está mi interpretación:

    • Concurrencia : interruptabilidad
    • Paralelismo : Independencia

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

    Voy a 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 hecha

    Ahora, el problema es que la tarea-1 requiere que vaya a una oficina gubernamental extremadamente burocrática que lo hace esperar durante 4 horas seguidas para obtener su 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ás a la oficina de pasaportes por 2 horas, esperarás en la fila por 4 horas, terminarás la tarea, conducirás 2 horas hacia atrás, te irás a tu casa, te mantendrás alejado 5 horas más y realizarás la presentación.

    Caso 2: ejecución concurrente

    Pero eres inteligente. Planeas con anticipación. Lleva consigo una computadora portátil y mientras espera en la cola, comienza a trabajar en su presentación. De esta manera, una vez que regrese a su 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 línea y trabajó en la presentación. Cuando se llamó a su número, interrumpió la tarea de presentación y cambió a la tarea de pasaporte. El ahorro en el tiempo fue esencialmente posible debido a la interrupción de ambas tareas.

    La concurrencia, IMO, debe tomarse como “aislamiento” en las propiedades ACID de una base de datos. Dos transacciones de base de datos satisfacen el requisito de aislamiento si realiza subtransacciones en cada una de ellas en forma intercalada y el resultado final es el mismo que si las dos tareas se realizaran en serie. Recuerde que para el pasaporte y las tareas de presentación, usted es el único verdugo .

    Caso 3: Ejecución paralela

    Ahora, ya que eres un hombre inteligente, obviamente eres un superior, y tienes un asistente. Entonces, antes de irse 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. Él ha hecho un trabajo bastante sólido y con algunas ediciones en 2 horas más, lo finalizas.

    Desde entonces, 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, se realizaron al mismo tiempo por dos verdugos diferentes .

    ¿Aún conmigo? Bien…

    Caso 4: concurrente pero no paralelo

    Recuerde su tarea de pasaporte, donde tiene que esperar en la línea? Como es su pasaporte, su asistente no puede esperar en línea para usted. Por lo tanto, la tarea de pasaporte tiene capacidad de interrupción (puede detenerla mientras espera en la línea y reanudarla más tarde cuando se llame a su número), pero no tiene capacidad de independencia (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 al local. Aquí, debe eliminar todos los dispositivos electrónicos y enviarlos a los oficiales, y solo devuelven sus dispositivos después de completar su tarea.

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

    Del mismo modo, supongamos que la presentación tiene una 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 dedicar 5 horas de esfuerzo concentrado), pero no se puede interrumpir .

    Caso 6: Ejecución concurrente y paralela

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

    Esto fue posible porque la tarea de presentación tiene independencia (cualquiera de ustedes puede hacerlo) y capacidad de interrupción (puede detenerla y reanudarla más tarde). Entonces, 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 fila para llamar a su número, sobornar a un guardia y otra persona para mantener su posición en la línea, escabullirse, regresar antes de que se llame su número y reanudar la espera tú mismo.

    En este caso, puede realizar tanto el pasaporte como las tareas de presentación al mismo tiempo y en paralelo. Puede escabullirse, y su posición está en manos de su asistente. Ambos pueden trabajar en la presentación, etc.


    De vuelta a la informática

    En el mundo de la informática, 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 estamos hablando de map-reduce o hadoop clusters.
    • Caso 4: Creo que el Caso 4 es raro. No es común que una tarea sea concurrente, pero no paralela. Pero podría suceder. Por ejemplo, supongamos que su tarea requiere acceso a un chip computacional especial al que se puede acceder solo 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 es raro, pero no tan raro como el Caso 4. Un código no simultáneo 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 progtwigción paralela o concurrente están básicamente hablando del Caso 6. Esta es una mezcla y combinación de ejecuciones paralelas y concurrentes.

    Concurrencia e ir

    Si ves por qué Rob Pike dice que la concurrencia es mejor, debes entender que la razón es. Tienes una tarea realmente larga en la que hay varios períodos de espera en los que esperas algunas operaciones externas, como lectura de archivos, descarga de red. En su conferencia, todo lo que él está diciendo es, “solo divide esta larga tarea secuencial para que puedas hacer algo útil mientras esperas”. Es por eso que habla de diferentes organizaciones con varios túmulos.

    Ahora la fuerza de Go viene de hacer que esto sea realmente fácil con la palabra clave go y los canales. Además, hay un excelente soporte subyacente en el tiempo de ejecución para progtwigr estos goroutines.

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

    ¿Las manzanas son preferidas más que las naranjas?

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

    Rob generalmente habla de Go y usualmente aborda la pregunta de Concurrencia vs Paralelismo en una explicación visual e intuitiva. Aquí hay un breve resumen:

    Tarea: ¡Quemamos una stack 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 anterior ocurre en paralelo si hay al menos 2 personas trabajando al mismo tiempo o no.

    Para agregar a lo que otros han dicho:

    La concurrencia es como tener un malabarista haciendo malabarismos con muchas bolas. Independientemente de cómo parezca, el malabarista solo está atrapando / lanzando una pelota por mano a la vez. El paralelismo es tener múltiples malabaristas que hacen malabarismos con las bolas simultáneamente.

    Digamos que tienes un progtwig que tiene dos hilos. El progtwig 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 concurrencia por el mero hecho de que tenemos más de un hilo ejecutándose.

    Si ejecutamos este progtwig en una computadora con un único núcleo de CPU, el sistema operativo estaría cambiando entre los dos hilos, lo que permite que un hilo se ejecute a la vez.

    Si ejecutamos este progtwig en una computadora con una CPU de múltiples núcleos, entonces podríamos ejecutar los dos hilos en paralelo , uno al lado del otro, exactamente al mismo tiempo.

    Concurrencia: si dos o más problemas son resueltos por un solo procesador. texto alternativo

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

    texto alternativo

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

    Supongamos que una organización organiza un torneo de ajedrez en el que 10 jugadores ( con las mismas habilidades de juego de ajedrez ) desafiarán a un campeón profesional de ajedrez. Y dado que el ajedrez es de 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 conducir estos 10 juegos:

    1) SERIAL : digamos que el profesional juega con cada persona una por una, es decir, comienza y termina el juego con una persona y luego comienza el próximo juego con la siguiente persona, y así sucesivamente. En otras palabras, decidieron llevar a cabo los juegos secuencialmente. Entonces, si un juego tarda 10 minutos en completarse, 10 juegos tomarán 100 minutos, también se supone que la transición de un juego a otro dura 6 segundos, luego para 10 juegos será de 54 segundos (aproximadamente 1 min).

    por lo que todo el evento se completará aproximadamente en 101 minutos ( PEOR APROXIMACIÓN )

    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, 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 en b / n dos jugadores es de 6 segundos, por lo que el tiempo total de transición para volver al primer jugador será de 1 minuto (10x6seg). Por lo tanto, para cuando regrese a la primera persona con quien se inició el evento, pasaron 2 minutos (10xtime_per_turn_by_champion + 10xtransition_time = 2mins)

    Suponiendo que todos los jugadores tomen 45 segundos para completar su turno, en base a 10 minutos por juego del evento SERIAL, el no. de rondas antes de que finalice un juego debería 600 / (45 + 6) = 11 rondas (aprox)

    Así que todo el evento se completará aproximadamente en 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_10_players = 11×51 + 11x60sec = 561 + 660 = 1221sec = 20.35mins (aproximadamente)

    VEA LA MEJORA de 101 minutos a 20.35 minutos ( MEJOR APROXIMACIÓN )

    3) PARALELO – digamos que los organizadores obtienen algunos fondos adicionales y decidieron invitar a dos campeones profesionales (ambos igualmente capaces) y dividieron el conjunto de los mismos 10 jugadores (retadores) en dos grupos de 5 cada uno y se los asignaron a dos campeones, es decir, uno agrupe cada uno. Ahora el evento está progresando en paralelo en estos dos conjuntos, es decir, al menos dos jugadores (uno en cada grupo) están jugando contra los dos jugadores profesionales en su respectivo grupo.

    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 podrá 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 (leer el 2º punto) con los 5 jugadores en sus respectivos grupos, por lo que ahora los juegos de todos los grupos se ejecutan en paralelo pero dentro del grupo se ejecutan al mismo tiempo.

    Por lo tanto, los juegos de un grupo se completarán aproximadamente en 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_5_players = 11×51 + 11×30 = 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 APROXIMACIÓN )

    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 se mantendrá:

    SERIAL> 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 los trabajos de transición en b / n)

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

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

    paralelismo: división de un problema en múltiples fragmentos similares.

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

    Ellos resuelven diferentes problemas. La concurrencia resuelve el problema de tener pocos recursos de CPU y muchas tareas. Por lo tanto, crea hilos o rutas de ejecución independientes a través del código para compartir el 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 (que se puedan dividir correctamente) y distribuirlas sobre recursos de CPU abundantes. El paralelismo siempre ha estado presente, por supuesto, pero está saliendo a la luz porque los procesadores multi-core son tan baratos.

    Ejemplo simple:

    Concurrente es: “Dos colas que acceden a un cajero automático”

    Paralelo es: “Dos colas y dos cajeros automáticos”

    Imagine aprender un nuevo lenguaje de progtwigción viendo un video tutorial. Debes pausar el video, aplicar lo que se ha dicho en el código y continuar viendo. Eso es concurrencia.

    Ahora eres un progtwigdor profesional. Y disfruta escuchando música tranquila mientras codifica. Eso es Paralelismo.

    Disfrutar.

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

    1 servidor, 1 cola de trabajos (con 5 trabajos) -> sin simultaneidad, sin paralelismo (solo se realiza el mantenimiento de un trabajo hasta su finalización, el siguiente trabajo de la cola debe esperar hasta que finalice el trabajo de mantenimiento y no haya otro servidor para servicio)

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

    2 o más servidores, uno Queue -> 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 se complete uno de los servidores).

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

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

    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 el paralelismo puro, pero es aquí donde la concurrencia tendría su mejor uso práctico, tomando otro trabajo que no necesita ese recurso.

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

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

    Voy a ofrecer una respuesta que entra en conflicto con algunas de las respuestas populares aquí. En mi opinión, concurrencia es un término general que incluye paralelismo. La simultaneidad se aplica a cualquier situación en la que distintas tareas o unidades de trabajo se superpongan en el tiempo. El paralelismo se aplica más específicamente a situaciones donde se evalúan / ejecutan distintas unidades de trabajo en el mismo tiempo físico. La razón de ser del paralelismo es acelerar el software que puede beneficiarse de múltiples recursos físicos de cómputo. El otro concepto importante que encaja bajo concurrencia es la interactividad. La interactividad se 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, compañeros de red, periféricos de hardware, etc.

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

    Un poco más de detalles sobre el paralelismo :

    El paralelismo existe a escalas muy pequeñas (por ejemplo, paralelismo de nivel de instrucción en los procesadores), escalas medianas (por ejemplo, procesadores multinúcleo) y grandes escalas (por ejemplo, clusters de computación de alto rendimiento). La presión sobre los desarrolladores de software para exponer más paralelismos a nivel de subprocesos 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 se pueden ejecutar en paralelo si una depende de la otra (Ignorando la especulación).

    Hay muchos patrones y marcos que los progtwigdores usan para express el 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 llamadas). Para tareas simples, los eventos son geniales. Intentar hacer tareas más complejas con eventos entra en la extracción de stack (también conocido como retrollamada de llamada, también conocida 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 “La concurrencia no es paralelismo, es mejor” de Rob Pike. La concurrencia no es ni mejor ni peor que el paralelismo. La simultaneidad incluye la interactividad que no se puede comparar de una manera mejor / peor con el paralelismo. Es como decir “el flujo de control es mejor que los datos”.

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

    Para describir fenómenos dynamics relacionados con el tiempo , usamos los términos secuenciales y concurrentes . Por ejemplo, se puede obtener un determinado resultado 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 simultáneas pueden interferir con nuestra secuencia, pero los resultados de esta interferencia no se conocen de antemano. Concurrencia introduce indeterminación .

    La caracterización serial / paralela y secuencial / concurrente son ortogonales. Un ejemplo de esto es en la comunicación digital. En un adaptador de 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 , este 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 hijos. Si los desechamos como una cadena, damos un mensaje al principio y lo recibimos al final, tendríamos una comunicación serial. 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, visualicemos para dividir a los niños en grupos de 3. Dividimos la frase en tres partes, le damos la primera al niño de la línea a nuestra izquierda, la segunda 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 (aún 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 le hablan al primer niño al mismo tiempo que usted, entonces tendremos procesos simultáneos . No sabemos qué proceso será considerado por la infraestructura, por lo que el resultado final no está determinado de antemano.

    La concurrencia es la forma generalizada de paralelismo. Por ejemplo, el progtwig paralelo también se puede llamar concurrente, pero el inverso no es verdadero.

    1. La ejecución simultánea es posible en un solo procesador (varios hilos, administrados por el progtwigdor o grupo de hilos)

    2. La ejecución en paralelo 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 el reverso no es cierto, como el paralelismo.

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

    Me gusta mucho 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 necesita 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 que el progtwig se ejecute más rápido procesando distintas partes del problema en paralelo. Algunos enfoques son aplicables a la concurrencia, otros al paralelismo y algunos a ambos. Comprenda a qué se enfrenta y elija la herramienta adecuada para el trabajo.

    Me gustó mucho esta representación gráfica de otra respuesta. Creo que responde la pregunta mucho mejor que muchas de las respuestas anteriores.

    Paralelismo vs concurrencia Cuando dos hilos se ejecutan en paralelo, ambos se ejecutan al mismo tiempo. Por ejemplo, si tenemos dos hilos, A y B, entonces 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 estas dos maneras: o bien los subprocesos se están ejecutando al mismo tiempo (es decir, en paralelo, como se indicó anteriormente), o sus ejecuciones se están intercalando en el procesador, de la siguiente manera:

    CPU 1: A ———–> B ———-> A ———–> B ——– ->

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

    Fuente: Otra respuesta aquí

    Espero que ayude.

    La simultaneidad puede implicar tareas ejecutadas simultáneamente o no (de hecho pueden ejecutarse en procesadores / núcleos separados, pero también pueden ejecutarse 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 lo que no y cómo sincronizar.

    Paralelismo significa que solo estás haciendo algunas cosas al mismo tiempo. No necesitan ser parte de la solución de un problema. Sus hilos pueden, por ejemplo, resolver un solo problema cada uno. Por supuesto, también se aplica sincronización, pero desde una perspectiva diferente.

    Paralelismo: Tener múltiples hilos que hacen tareas similares que son independientes entre sí en términos de datos y recursos que requieren para hacerlo. Por ejemplo: Google crawler puede generar miles de subprocesos y cada subproceso puede realizar su tarea de forma independiente.

    Concurrencia: la simultaneidad entra en escena cuando tiene datos compartidos, 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 lockings, semáforos, etc.

    “Concurrencia” es cuando hay varias cosas en progreso .

    “Paralelismo” es cuando las cosas concurrentes están progresando al mismo tiempo .


    Ejemplos de concurrencia sin paralelismo:

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

    Tenga en cuenta, sin embargo, que la diferencia entre simultaneidad y paralelismo suele ser una cuestión de perspectiva. Los ejemplos anteriores no son paralelos desde la perspectiva de (efectos observables de) ejecutar 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 termina. La GPU podría estar dibujando en la pantalla mientras se está ejecutando el procedimiento de ventana o el controlador de eventos. El DBMS podría estar atravesando B-Trees para la próxima consulta mientras todavía está buscando los resultados de la anterior. El navegador podría estar haciendo un diseño o una red mientras se Promise.resolve() su Promise.resolve() . Etcétera etcétera…

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

    La progtwigción simultánea considera las 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 progtwigs concurrentes suelen ser de rendimiento y latencia. Los progtwigs simultáneos a menudo están vinculados a IO, pero no siempre, p. Ej., Los recolectores de basura concurrentes están completamente en la CPU. El ejemplo pedagógico de un progtwig simultáneo es un rastreador web. Este progtwig inicia las solicitudes de páginas web y acepta las respuestas al mismo tiempo 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 progtwig. Esta característica puede dificultar la depuración de progtwigs concurrentes. Algunas aplicaciones son fundamentalmente concurrentes, por ejemplo, los servidores web deben manejar las conexiones de los clientes al mismo tiempo. Erlang es quizás el lenguaje más prometedor para la progtwigción altamente concurrente.

    La progtwigción en paralelo se refiere a las operaciones que se superponen para el objective específico de mejorar el rendimiento. Las dificultades de la progtwigción concurrente se eluden al hacer que el control sea determinista. Normalmente, los progtwigs crean conjuntos de tareas secundarias que se ejecutan en paralelo y la tarea primaria solo continúa una vez que ha finalizado cada subtarea. Esto hace que los progtwigs paralelos sean mucho más fáciles de depurar. La parte más difícil de la progtwigción paralela es la optimización del rendimiento con respecto a problemas tales como la granularidad y la comunicación. Este último sigue siendo un problema en el contexto de las multinúcleas porque existe un costo considerable asociado con la transferencia de datos de una memoria caché a otra. La multiplicación matricial-matriz densa es un ejemplo pedagógico de progtwigción paralela y se puede resolver de manera eficiente utilizando el algoritmo de división y conquista de Straasen y atacando los sub-problemas en paralelo. Cilk es quizás el lenguaje más prometedor para la progtwigción paralela de alto rendimiento en computadoras con memoria compartida (incluidas las multinúcleas).

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

    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 escuchan. Para A y B, son paralelos: A: yo soy A. B: soy B.

    Pero para C, su cerebro debe tomar el proceso simultáneo para escuchar A y B, tal vez: Yo soy IA soy B.

    La simultaneidad simple significa que se están ejecutando más de una tarea (no necesaria 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 estar ejecutándose al mismo tiempo.

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

    No desea el paralelismo exhibido por un progtwig que no fue diseñado para 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 concurrente máximo para que el sistema host pueda paralelizar su ejecución cuando sea posible.

    El lenguaje de progtwigción Go de Pike ilustra esto en el extremo: sus funciones son todos los hilos que pueden ejecutarse correctamente al mismo tiempo, es decir, llamar a una función siempre crea un hilo que se ejecutará en paralelo con el llamador si el sistema es capaz de hacerlo. Una aplicación con cientos o incluso miles de hilos es perfectamente normal en su mundo. (No soy experto en Go, eso es solo mi opinión).

    La explicación de esta fuente fue útil para mí:

    La concurrencia se relaciona con la forma en que una aplicación maneja múltiples tareas en las que trabaja. Una aplicación puede procesar una tarea al mismo tiempo (secuencialmente) o trabajar en varias tareas al mismo tiempo (simultáneamente).

    El paralelismo, por otro lado, está relacionado con la forma en que una aplicación maneja cada tarea individual. Una aplicación puede procesar la tarea en serie de principio a fin, o dividir la tarea en subtareas que pueden completarse en paralelo.

    Como puede ver, una aplicación puede ser concurrente, pero no paralela. Esto significa que procesa más de una tarea al mismo tiempo, pero las tareas no se dividen en subtareas.

    Una aplicación también puede ser paralela pero no concurrente. Esto significa que la aplicación solo funciona en una tarea a la vez, y esta tarea se divide en subtareas que pueden procesarse en paralelo.

    Además, una aplicación no puede ser simultánea ni paralela. Esto significa que funciona solo en una tarea a la vez, y la tarea nunca se divide en subtareas para la ejecución paralela.

    Finalmente, una aplicación también puede ser simultánea y paralela, ya que funciona en múltiples tareas al mismo tiempo y también divide cada tarea en subtareas para la ejecución paralela. Sin embargo, algunos de los beneficios de la simultaneidad y el paralelismo pueden perderse en este escenario, ya que las CPU de la computadora ya están razonablemente ocupadas, ya sea con simultaneidad o paralelismo. Combinarlo puede generar solo una pequeña ganancia de rendimiento o incluso una pérdida de rendimiento.

    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 puede dar la ilusión de paralelismo. Esto significa que un sistema simultáneo 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 progtwig simultáneo también puede estar en paralelo. La estructuración de su aplicación con subprocesos y procesos le permite a su progtwig explotar el hardware subyacente y potencialmente hacerse en paralelo.

    ¿Por qué no tener todo en paralelo entonces? Una razón es porque la concurrencia es una forma de estructurar los progtwigs y es una decisión de diseño para facilitar la separación de las preocupaciones, mientras que el paralelismo se usa a menudo en nombre del rendimiento. Otra es que algunas cosas fundamentalmente no se pueden hacer completamente en paralelo. Un ejemplo de esto sería agregar dos cosas al reverso de una cola: no puede insertar ambas al mismo tiempo. Something must go first and the other behind it, or else you mess up the queue. Although we can interleave such execution (and so we get a concurrent queue), you cannot have it parallel.

    ¡Espero que esto ayude!

    (I’m quite surprised such a fundamental question is not resolved correctly and neatly for years…)

    In short, both concurrency and parallelism are properties of computing .

    As of the difference, here is the explanation from Robert Harper :

    The first thing to understand is parallelism has nothing to do with concurrency . Concurrency is concerned with nondeterministic composition of programs (or their components). Parallelism is concerned with asymptotic efficiency of programs with deterministic behavior. Concurrency is all about managing the unmanageable: events arrive for reasons beyond our control, and we must respond to them. A user clicks a mouse, the window manager must respond, even though the display is demanding attention. Such situations are inherently nondeterministic, but we also employ pro forma nondeterminism in a deterministic setting by pretending that components signal events in an arbitrary order, and that we must respond to them as they arise. Nondeterministic composition is a powerful program structuring idea. Parallelism, on the other hand, is all about dependencies among the subcomputations of a deterministic computation. The result is not in doubt, but there are many means of achieving it, some more efficient than others. We wish to exploit those opportunities to our advantage.

    They can be sorts of orthogonal properties in programs. Read this blog post for additional illustrations. And this one discussed slightly more on difference about components in programming , like threads.

    Note that threading or multitasking are all implementations of computing serving more concrete purposes. They can be related to parallelism and concurrency, but not in an essential way. Thus they are hardly good entries to start the explanation.

    One more highlight: (physical) “time” has almost nothing to do with the properties discussed here. Time is just a way of implementation of the measurement to show the significance of the properties, but far from the essence. Think twice the role of “time” in time complexity – which is more or less similar, even the measurement is often more significant in that case.

    Just by consulting the dictionary, you can see that concurrent (from latin) means to run together, converge, agree; ergo there is a need to synchronize because there is competition on the same resources. Parallel (from greek) means to duplicate on the side; ergo to do the same thing at the same time.