multithreading - tareas - Hilo vs paralelismo, ¿en qué se diferencian?
ejecutar dos metodos al mismo tiempo en c# (8)
¿Cómo se define el "paralelismo"? El multihilo es una implementación concreta del concepto de ejecución paralela de programas.
El artículo al que RichardOD enlazó parece estar relacionado principalmente con si los hilos se ejecutan en paralelo en una máquina concreta.
Sin embargo, su pregunta parece ver multihilo y paralelismo como opuestos. ¿Quizás te refieres a programas que usan múltiples procesos en lugar de múltiples hilos? Si es así, las diferencias son:
- Los hilos son mucho más baratos de crear que los procesos. Esta es la razón por la que el uso de subprocesos en lugar de procesos resultó en una gran aceleración en las aplicaciones web, esto se llamó "FastCGI".
- Múltiples hilos en la misma máquina tienen acceso a la memoria compartida. Esto hace que la comunicación entre hilos sea mucho más fácil, pero también muy peligrosa (es fácil crear errores como condiciones de carrera que son muy difíciles de diagnosticar y corregir).
¿Cuál es la diferencia entre roscado y paralelismo?
¿Cuál tiene ventaja sobre la otra?
Aquí está la mejor respuesta para despejar las dudas de cualquier persona relacionadas con el paralelismo y el enhebrado. [Lo leí en quora y me pareció útil compartirlo con los lectores de SO].
Los hilos son una construcción de software. Puedo iniciar tantos pthreads como quiera, incluso en un viejo procesador de un solo núcleo. Por lo tanto, el subproceso múltiple no es necesariamente paralelo: solo es paralelo si el hardware puede admitirlo. Entonces, si tiene varios núcleos y / o hyperthreading, su multi-threading se vuelve paralelo. Y estos días eso es, de hecho, la mayor parte del tiempo.
La concurrencia se trata de actividades que no tienen un ordenamiento temporal claro. Entonces, nuevamente, si el hardware lo admite, se pueden hacer en paralelo, si no, no.
Por lo tanto, tradicionalmente el subprocesamiento múltiple es casi sinónimo de concurrencia. Y ambos solo se vuelven paralelos si el hardware lo admite. Incluso entonces puede iniciar muchos más subprocesos de los que admite el hardware, y queda con la concurrencia.
El enhebrado es el paralelismo de un hombre pobre.
EDITAR: Para ser más precisos:
El enhebrado no tiene nada que ver con el paralelismo y el verso sabio. El subprocesamiento se trata de hacer sentir que algunos procesos se ejecutan en paralelo. Sin embargo, esto no hace que los procesos para completar TODAS sus acciones sean más rápidos en total.
El paralelismo es una técnica general de usar más de un flujo de instrucciones para completar un cálculo. El aspecto crítico de todas las técnicas paralelas es la comunicación entre flujos para colaborar una respuesta final.
El enhebrado es una implementación específica del paralelismo. Cada flujo de instrucciones recibe su propia pila para mantener un registro de variables locales y llamadas a funciones, y se comunica implícitamente con los otros flujos mediante la memoria compartida.
Un ejemplo podría ser tener un subproceso simplemente encolando las solicitudes de disco y pasarlo a un subproceso de trabajo, paralelizando efectivamente el disco y la CPU. El método tradicional de tuberías UNIX es dividir estos en dos programas completos, digamos "cat" y grep en el comando:
cat /var/log/Xorg.0.log | grep "EE"
El subprocesamiento posiblemente podría reducir los costos de comunicación de copiar la E / S del disco del proceso cat al proceso grep.
El subprocesamiento es una tecnología, el paralelismo es un paradigma que puede implementarse utilizando subprocesos (pero podría hacerse fácilmente utilizando subprocesos únicos en varios procesadores)
El subprocesamiento generalmente se refiere a tener múltiples procesos trabajando al mismo tiempo en una sola CPU (bueno, en realidad no crees que lo hagan, pero cambian muy rápido entre ellos).
El paralelismo es tener varios procesos trabajando al mismo tiempo en varias CPU.
Ambos tienen sus pros y sus contras en gran medida en función del programador utilizado por su sistema operativo. Por lo general, el costo de cálculo de crear un subproceso es mucho más bajo que generar un proceso en otra CPU, sin embargo, tener una CPU "completa" para usted aumenta la velocidad general de ese proceso. Pero nuevamente, si ese proceso necesita comunicarse con otro proceso en otra CPU, debe resolver el problema de IPC (comunicación entre procesos) que podría ser una sobrecarga tal que es mejor usar un subproceso en la misma CPU.
La mayoría de los sistemas operativos son conscientes de múltiples CPU / Cores y pueden usarlos, pero esto hace que el programador sea generalmente bastante complejo.
Si está programando en un lenguaje que usa una máquina virtual (máquina virtual), tenga en cuenta que necesitan implementar su propio planificador (si es que lo hacen). Python, por ejemplo, usa un GIL, que prácticamente dice que todo lo que se ejecuta en esa VM permanece en la misma CPU, siempre. Aunque algunos sistemas operativos son capaces de migrar un proceso pesado a otra CPU que no está tan ocupada en este momento, lo que, por supuesto, significa que todo el proceso debe detenerse mientras lo hace.
Algunos sistemas operativos como DragonFlyBSD adoptan un enfoque completamente diferente para la programación, por lo que en este momento se trata del enfoque "estándar".
Creo que esta respuesta te da suficientes palabras clave para buscar más información :-)
Si pensamos en la CPU como una empresa y en los subprocesos como sus trabajadores , nos ayudará a entender los subprocesos y el paralelismo con mayor facilidad.
Como una empresa tiene muchos trabajadores, la CPU también tiene muchos hilos.
También puede haber más de una compañía y, por lo tanto, puede haber más de una CPU.
Por lo tanto, cuando los trabajadores (subprocesos) trabajan en una empresa (CPU), se denomina subprocesos .
Y cuando dos o más empresas (CPU) trabajan de forma independiente o en conjunto, se denomina paralelismo .
Daniel Moth (un antiguo compañero de trabajo mío) - El artículo de Roscado / Concurrencia vs Paralelismo lo explica todo.
Citado
Para aprovechar los múltiples núcleos de nuestro software, en última instancia, se deben utilizar subprocesos. Debido a este hecho, algunos desarrolladores caen en la trampa de equiparar multihilo con paralelismo. Eso no es exacto ... Puede tener subprocesos múltiples en una máquina de un solo núcleo, pero solo puede tener paralelismo en una máquina de varios núcleos
La prueba rápida: si en una máquina de un solo núcleo está utilizando subprocesos y tiene mucho sentido para su escenario, entonces no está "haciendo paralelismo", simplemente está haciendo multihilo.