Pixelaula.
Procesos e hilos · Lección 4 de 5

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.

⏱ 25–35 min▶ Video de 90 s🧪 Laboratorio con 4 misiones
00 · En 90 segundos

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.

    01 · Qué es un hilo

    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.
    Escena 1

    Agrega hilos al proceso y mira qué se comparte y qué tiene cada uno por separado.

    02 · Por qué hilos

    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.
    03 · Varios núcleos

    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).

    Escena 2

    Sumar un arreglo de 16 números. Elige núcleos y cómo repartir, y compara los tiempos.

    04 · Hilos del usuario e hilos del kernel

    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.

    05 · Predice

    Antes de leer la respuesta

    Truco para tu laboratorio
    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.
    Laboratorio

    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.

    Repaso

    Comprueba lo que entendiste

    Cada respuesta incorrecta explica por qué parece correcta y en qué falla.