Diferencia entre concurrencia y paralelismo
Tema: tecnología.
La concurrencia es la capacidad de un programa para gestionar varias tareas a la vez, intercalando su ejecución aunque sea en un solo núcleo; el paralelismo es ejecutar varias tareas de manera literalmente simultánea, en núcleos o procesadores distintos.
Para recordarlo: la concurrencia es una forma de organizar el trabajo; el paralelismo es una forma de ejecutarlo. Se puede programar de forma concurrente sin que haya paralelismo real detrás.
Tabla comparativa: concurrencia y paralelismo
| Concurrencia | Paralelismo | |
|---|---|---|
| Qué es | Gestionar varias tareas a la vez, intercalando su avance. | Ejecutar varias tareas al mismo instante físico. |
| Requiere varios núcleos | No, puede lograrse en un único núcleo. | Sí, necesita al menos dos núcleos o procesadores. |
| Nivel | Es una forma de diseñar y organizar el programa. | Es una forma de ejecutar ese programa en el hardware. |
| Analogía | Una persona que atiende varias llamadas alternando entre ellas. | Varias personas, cada una atendiendo su propia llamada al mismo tiempo. |
| Ejemplo | Un servidor que atiende cientos de peticiones alternando su procesamiento. | Un programa de vídeo que reparte cada fotograma entre los núcleos del procesador. |
Qué es la concurrencia
La concurrencia describe la capacidad de un sistema para avanzar en varias tareas dentro de un mismo periodo de tiempo, sin que eso implique que se ejecuten en el mismo instante exacto. En un ordenador con un solo núcleo, esto se consigue repartiendo el tiempo del procesador entre las distintas tareas en fragmentos muy breves, cambiando de una a otra tan rápido que, desde fuera, parece que todas avanzan a la vez.
El objetivo de diseñar un programa de forma concurrente no es necesariamente acelerarlo, sino estructurarlo para que pueda ocuparse de varias cosas sin bloquearse esperando a que termine una sola, como un servidor que sigue aceptando nuevas conexiones mientras atiende las que ya tiene abiertas.
Qué es el paralelismo
El paralelismo consiste en ejecutar de verdad varias tareas al mismo tiempo, cada una en su propio núcleo de procesador, en su propio procesador o incluso en máquinas distintas. A diferencia de la concurrencia, aquí no hay ningún intercalado: las tareas avanzan literalmente en paralelo, en el mismo instante.
El objetivo habitual del paralelismo es reducir el tiempo total de un cálculo, al repartir el trabajo entre varias unidades de procesamiento que trabajan de forma simultánea, como dividir el renderizado de una imagen en franjas que cada núcleo procesa por separado.
Ejemplos que muestran la diferencia
Un servidor con un único núcleo atiende con concurrencia cientos de peticiones web, alternando entre ellas tan rápido que ningún usuario nota la espera.
Un programa de edición de vídeo usa paralelismo cuando reparte el procesamiento de distintos fotogramas entre los varios núcleos del procesador, reduciendo el tiempo total de exportación.
Un sistema puede ser concurrente y paralelo a la vez: gestiona muchas tareas de forma organizada y, además, cuenta con varios núcleos que las ejecutan de verdad al mismo tiempo.
Cuándo usar cada término
- Usa concurrencia para describir cómo se organiza un programa para atender varias tareas sin bloquearse, sin importar si hay uno o varios núcleos disponibles.
- Usa paralelismo para describir la ejecución física simultánea de varias tareas en distintos núcleos, procesadores o máquinas.
- No des por hecho que «concurrente» significa «más rápido»: la concurrencia mejora la organización del trabajo, y solo el paralelismo real reduce el tiempo total cuando hay hardware suficiente.
Preguntas frecuentes
¿Puede haber concurrencia sin paralelismo?
Sí. Un programa puede gestionar varias tareas de forma concurrente en un único núcleo, alternando entre ellas, sin que exista ninguna ejecución simultánea real.
¿Puede haber paralelismo sin concurrencia?
En cierto sentido sí, cuando se repite exactamente el mismo cálculo simple sobre datos distintos en varios núcleos a la vez, sin que las tareas necesiten coordinarse entre sí ni compartir información durante la ejecución.
¿Necesito varios núcleos para programar de forma concurrente?
No. La concurrencia es un enfoque de diseño del programa, y funciona incluso en un procesador con un solo núcleo, aunque tener varios núcleos permite que parte de esa concurrencia se convierta también en paralelismo real.