Concurrencia VS Paralelismo

Concurrencia VS ParalelismoA pesar de que hoy en día casi todas las aplicaciones trabajan con múltiples hilos de ejecución y que los programadores saben utilizarlos, muy poca gente sabe distinguir entra Concurrencia y Paralelismo, ya que son conceptos bastantes relacionados, pero que no necesariamente significan lo mismo.

 

 

Concurrencia:

 

La concurrencia es la capacidad del CPU para procesar más de un proceso al mismo tiempo, ¿simple no? Pero que implica esto realmente. Pues bien, para comprender esto es necesario entender cómo funciona un procesador. Un procesador puede procesar al mismo tiempo el mismo número de procesos que el número de CORES que tiene, de esta forma, si un procesador tiene un CORE, entonces solo podrá ejecutar un proceso a la vez, por otro parte, si tenemos 8 CORES, entonces podremos ejecutar hasta 8 procesos al mismo tiempo.

 

Concurrencia

Ya con este punto claro, solo quedaría agregar que, en la concurrencia, los procesos en ejecución no tienen por qué estar relacionados, es decir, cualquiera puede iniciar y terminar en el momento que sea, y el resultado de uno no afecta al otro.

 

 

Paralelismo:

 

El paralelismo sigue la filosofía de “divide y vencerás”, ya que consiste en tomar un único problema, y mediante concurrencia llegar a una solución más rápido. El paralelismo lo que hace es tomar el problema inicial, dividir el problema en fracciones más pequeñas, y luego cada fracción es procesada de forma concurrente, aprovechando al máximo la capacidad del procesador para resolver el problema. La principal diferencia del paralelismo contra la concurrencia es que, en el paralelismo, todos los procesos concurrentes están íntimamente relacionados a resolver el mismo problema, de tal forma que el resultado de los demás procesos afecta al resultado final.

NOTA: En el paralelismo debe de haber un paso final que se encargue de unir los resultados de todos los procesos para poder arrojar un resultado final.

 

Paralelismo

Puede resultas complicado entenderlo a primera vista, pero observemos la imagen anterior. Primero que nada, llega un proceso grande (Amarillo), el cual es divididos en cuatro partes(Naranja), las cuales coinciden con el número de CORES del procesador(Verde). Ahora bien, por cada CORE disponible se lanza un proceso concurrente para resolver una fracción del problema. Cuando el proceso de un CORE termina, deja su resultado como una parte del resultado final (Naranja), así al terminar todos los procesos concurrentes, tenemos un resultado final (Amarillo).

 

 

Escenario del mundo real:

 

Para comprender mejor como es que funcionan estos dos conceptos veremos un ejemplo simple de cada uno.

 

Ejemplo de concurrencia:

Empecemos con la concurrencia, imagina una aplicación de descarga de música, en la cual puedes descargar un número determinado de canciones al mismo tiempo, cada canción es independiente de la otra, por lo que la velocidad y el tiempo que tarde en descargarse cada una no afectara al resto de canciones. Esto lo podemos ver como un proceso concurrente, ya que cada descarga es un proceso totalmente independiente del resto.

 

concurrencia

Observa la imagen, cada descarga se procesa de forma separada, y al final a una descarga no le importa el estado de las demás. Ya que cada descarga es una tarea completamente diferente.

 

Ejemplo de paralelismo:

 

En el caso del paralelismo podemos imaginas la clásica página de viajes, donde nos ayudan a buscar el vuelo más barato o las mejores promociones, para hacer esto, la página debe de buscar al momento en cada aerolínea el vuelo más barato, con menos conexiones, etc. Para esto puedo hacerlo de dos formas, buscar secuencialmente en cada aerolínea las mejores promociones (muy tardado) o utilizar el paralelismo para buscar al mismo tiempo las mejores promociones en todas las aerolíneas.

 

paralelismo

Observemos en la imagen como el proceso parte de una entrada inicial (inputs) los cuales definen las características del vuelo a buscar, luego se utiliza la concurrencia para buscar en las cuatro aerolíneas al mismo tiempo. Veamos que en este proceso es indispensable que las 4 búsquedas terminen para poder arrojar un resultado. Podemos ver claramente la relación entre los 4 procesos, ya que el resultado de uno puedo afectar al proceso final.

Observemos también que una vez que los cuatro procesos terminan, hay un subproceso adicional encargado de unir los resultados y arrojar un resultado final.

 

 

Conclusiones:

Podrás observar que si bien, la concurrencia y el paralelismo está muy relacionados, no son la misma cosa, por lo tanto, la concurrencia ayuda a procesar varias tareas al mismo tiempo, mientras que el paralelismo resuelve una única tarea de una forma mucho más eficiente.

 

16 thoughts to “Concurrencia VS Paralelismo”

  1. ¿La última imagen, por tanto, se trata de separar la búsqueda de la mejor aerolínea en varias búsquedas al mismo tiempo, que se juntan la ser todas finalizadas (dando la mejor como resultado), utilizando la concurrencia pero constituyendo, por tanto, paralelismo (ya que es una única tarea la que se divide en subtareas interdependientes)?

    1. WoW, tu pregunta es muuuuy larga y no se si la comprendí muy bien, pero trataré de responderte lo mejor que pueda.
      Lo que dices es correcto, el paralelismo es una única tarea, la cual se apoya de la concurrencia para resolverla de una forma más rápida. La idea de usar concurrencia, es con la finalidad de dividir la tarea en pequeños fragmentos que pueda ser procesados en forma independientes. Por lo tanto, el paralelismo no puede finalizar hasta que todas las tareas que se lanzaron hallan terminado.

      Espero haber resuelto tu duda,saludos.

        1. Haa si, en realidad es una tarea que se puede dividir en varias más pequeñas que pueden ser procesadas de forma concurrente y al final, se une el resultado de cada hilo para dar origen a un resultado final 🙂

  2. Entendí que con la concurrencia podemos tener varias tareas procesadas de manera independiente y que el resultado de una no afecta a la otra en su resultado final, por otro lado con paralelismo podemos realizar una sola tarea a la vez dividida en subprocesos, la cual se apoya de la concurrencia para ejecutar cada subproceso, debido a esto se tiene que esperar el resultado de cada subproceso para unirlo en un solo, por eso comentas que el paralelismo depende de la concurrencia.

    Agradezco te tomes la dedicación y el tiempo invertido en tu blog para ayudarnos a despejar nuestras dudas.

    Git account: EdgarMC100
    Gmail: edgarmc100@gmail.com
    LinkedIn: http://www.linkedin.com/in/edgarmc100

    1. Lo que comentas es totalmente correcto, lo que quiere decir que lograste comprender a la perfección los conceptos. Felicidades por eso.

  3. Muy bien explicado, estoy estudiando Programación Concurrente en la carrera y muchos problemas tenemos que dividir las tareas para luego juntar resultados, así que también estamos haciendo paralelismo 😉

  4. Agradezco de antemano tu entrada sobre concurrencia y paralelismo. Creo que de todo lo que había encontrado por Internet, tu informacion fue la mas clara, breve, precisa.

    Saludos.

  5. Tengo entendido que la concurrencia no tiene que ver con la arquitectura del procesador, ya que la misma existe desde hace muchísimo tiempo a través de los cambios de contexto, es decir, que con un procesador mononúcleo, podemos iniciar varias tareas a la vez (concurrentes), las cuales se irán alternando hasta finalizar (no simultáneas) mediante dicho cambio de contexto.
    A partir de la creacion de procesadores multinúcleo, la concurrencia se logra gracias al paralismo, realizando multiples cálculos en simultáneo repartidos entre los diferentes núcleos del procesador.

    Ayudame a encuadrar tu definición con mi concepto si es que es correcto…gracias!

    1. La concurrencia se logra mediante el procesamiento de varios hilos de ejecución, y efectivamente, no está totalmente anclada a los procesadores, pero si muy relacionada, por que apartir de ellos es que se logra la concurrencia, si solo tiene un nucle, la computadora deberá pausar los hilos para darles optortunidad a otros y luego regresar al otro, con los múlti nucleos esto se mejora, pues es posible procesar varios hilos al mismo tiempo.
      El echo de que tengas múltiples núcleos, no significa que estos trabajen de forma paralela, es allí la diferencia, el paralemismo se logra cuando diseñas procesos que exploten los procesadores para resolver una sola tarae a travez de la concurrencia.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *