Varias tareas, un proceso
Un hilo es una línea de ejecución dentro de un proceso. Al terminar sabrás por qué Linux usa el modelo uno a uno.
Primero, la idea completa
Mira el video entero o salta a la parte que quieras repasar. Después, cada idea tiene su propia escena para tocarla.
Varias tareas dentro de un proceso
Un hilo (thread) es la unidad básica de uso de la CPU. Cada hilo tiene lo suyo: un identificador, un contador de programa, sus registros y su pila. Y comparte con los demás hilos del mismo proceso el código, los datos y los recursos, como los archivos abiertos.
Un proceso tradicional tiene un solo hilo y hace una cosa a la vez. Con varios hilos, hace varias:
- Un navegador muestra una página en un hilo mientras otro descarga datos de la red.
- Un procesador de texto tiene un hilo para los gráficos, otro para el teclado y otro que corrige la ortografía en segundo plano.
- Un generador de miniaturas usa un hilo por imagen.
Agrega hilos al proceso y mira qué se comparte y qué tiene cada uno por separado.
Un servidor con miles de clientes
Un servidor web recibe miles de solicitudes a la vez. Con un único hilo atendería una por una. Las primeras soluciones creaban un proceso por solicitud, pero crear procesos cuesta tiempo y memoria, y más si todos hacen lo mismo. Crear un hilo por solicitud es mucho más barato, y los hilos comparten memoria sin necesitar IPC. Los beneficios:
- Capacidad de respuesta: la aplicación sigue respondiendo aunque una parte haga algo largo.
- Compartir recursos: los hilos comparten memoria y recursos del proceso de forma natural.
- Economía: crear hilos y cambiar entre ellos es más barato que hacerlo entre procesos.
- Escalabilidad: en un sistema con varios núcleos, los hilos pueden ejecutarse en paralelo.
Concurrencia no es paralelismo
Con un solo núcleo hay concurrencia: varias tareas avanzan turnándose. Con varios núcleos hay paralelismo: varias tareas se ejecutan en el mismo instante. Aprovecharlos no es automático; hay que:
- Identificar tareas que puedan ir por separado.
- Equilibrarlas, para que todas aporten un trabajo parecido.
- Dividir los datos que cada tarea usará.
- Manejar las dependencias de datos, sincronizando a las tareas que se necesitan entre sí.
- Probar y depurar, que es más difícil con tantos caminos de ejecución posibles.
Hay dos formas de repartir: el paralelismo de datos hace la misma operación sobre partes distintas de los datos (cada núcleo suma un trozo del arreglo); el paralelismo de tareas reparte operaciones distintas (un hilo calcula el promedio y otro el máximo).
Sumar un arreglo de 16 números. Elige núcleos y cómo repartir, y compara los tiempos.
Tres modelos
Los hilos de usuario los maneja una biblioteca, fuera del kernel; los hilos del kernel los maneja directamente el sistema operativo. Para que un hilo de usuario se ejecute, tiene que corresponderle algún hilo del kernel:
- Muchos a uno: muchos hilos de usuario sobre un solo hilo del kernel. Si uno hace una llamada al sistema que bloquea, se bloquea el proceso entero; y como solo uno entra al kernel a la vez, no hay paralelismo. Lo usaron algunos Solaris y las primeras versiones de Java.
- Uno a uno: cada hilo de usuario tiene su hilo del kernel. Permite paralelismo y un bloqueo no detiene a los demás, a cambio de crear muchos hilos del kernel. Lo usan Linux y Windows.
- Muchos a muchos: multiplexa muchos hilos de usuario sobre un número menor o igual de hilos del kernel. Es el más complejo de implementar.
Las bibliotecas de hilos dan la API para crearlos: Pthreads (el estándar POSIX, que cada sistema implementa), los hilos de Windows y los de Java, que la JVM traduce a hilos del sistema. Con hilos asíncronos, el padre crea al hijo y sigue; con hilos síncronos, el padre espera a que sus hijos terminen (join), lo habitual cuando comparten muchos datos.
En Linux no hay una distinción real entre proceso e hilo: ambos son una task_struct. La biblioteca NPTL implementa el modelo uno a uno, y la llamada clone() crea una tarea indicando qué comparte con su creador.
Antes de leer la respuesta
El modelo y la cantidad de núcleos se cambian con los botones. En la línea de tiempo, los hilos de un mismo proceso tienen el mismo color.
Tu turno: modelos de hilos y núcleos
El programa editor tiene tres hilos: uno espera el teclado, otro corrige la ortografía y otro guarda en disco. hilos lanza tres hilos de cálculo, uno de los cuales lee el disco a mitad de camino. Cambia el modelo de hilos y los núcleos, y compara.
Comprueba lo que entendiste
Cada respuesta incorrecta explica por qué parece correcta y en qué falla.