Premisas
Es decir, un proceso se puede descomponer en subprocesos, son los llamados hilos o threads. Estos hilos tienen una propiedad que los hacen muy interesantes para el diseño de programas, y no es otra que pueden ejecutarse de forma paralela, dado que hoy en día los procesadores cuentan con diferentes núcleos (número de procesadores dentro de único chip) e hilos (capacidad que tienen los núcleos para ejecutar 1 o más hilos), esto nos permitirá mejorar el rendimiento de nuestras aplicaciones. Con esta forma de programar podemos aprovechar los tiempos de espera (por ejemplo una consulta compleja SQL a una base de datos o una API Rest) de los procesos para poder realizar otras tareas en paralelo.
Multithreading es una característica de muchos lenguajes de programación Java, C#, Python, … que permite la ejecución concurrente de dos o más partes de un programa para una utilización máxima de la CPU. Cada parte de dicho programa se llama hilo. Entonces, los hilos son procesos livianos dentro de un proceso. Un programa multihilo contiene dos o más partes que se pueden ejecutar simultáneamente. Cada parte de dicho programa se denomina hilo (thread) y cada hilo define una ruta de ejecución independiente. Por lo tanto, multihilo (Multithreaded) es una forma especializada de multitarea.
Si un proceso está bien organizado en threads/hilos podemos incrementar de manera exponencial su rendimiento.
Hay dos tipos distintos de multitareas: basado en procesos (como hemos visto en el tema anterior) y basado en hilos. Es importante entender la diferencia entre los dos.
Como hemos dicho al principio, una ventaja principal del multihilo es que le permite escribir programas muy eficientes porque le permite utilizar el tiempo de inactividad que está presente en la mayoría de los programas. Como probablemente sepa, la mayoría de los dispositivos de E/S, ya sean puertos de red, unidades de disco o el teclado, son mucho más lentos que la CPU. Por lo tanto, un programa a menudo pasará la mayor parte de su tiempo de ejecución esperando para enviar o recibir información hacia o desde un dispositivo.
Al usar multihilo, tu programa puede ejecutar otra tarea durante este tiempo de inactividad. Por ejemplo, mientras una parte de tu programa está enviando un archivo a través de Internet, otra parte puede leer la entrada del teclado, y otra puede almacenar el siguiente bloque de datos para enviar.
Como estamos viendo los sistemas multiprocesador y multinúcleo se han convertido en algo común. Por supuesto, los sistemas de un solo procesador todavía están en uso generalizado. Es importante comprender que las características multihilo de funcionan en ambos tipos de sistemas.** En un sistema de núcleo único, como también hemos visto en el tema anterior, los hilos de ejecución simultáneas comparten la CPU, y cada hilo recibe un trozo de tiempo de CPU**.
Por lo tanto, en un sistema de núcleo único, dos o más hilos no se ejecutan al mismo tiempo, pero se utiliza el tiempo de CPU inactivo. Sin embargo, en sistemas multiprocesador/multinúcleo, es posible que dos o más hilos se ejecuten de manera simultánea. En muchos casos, esto puede mejorar aún más la eficiencia del programa y aumentar la velocidad de ciertas operaciones.
Un hilo puede estar en uno de varios estados, en resumen: