Hilos que esperan trabajo
Crear un hilo por cada tarea sale caro. Al terminar sabrás dimensionar un pool para un servidor web.
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.
Que otro cree los hilos
Escribir a mano una aplicación con cientos de hilos es difícil: hay que acertar con la concurrencia, el paralelismo y que el resultado sea correcto. La estrategia de los hilos implícitos pasa esa tarea a los compiladores y las bibliotecas: quien programa solo identifica las tareas que pueden ir en paralelo, y el sistema decide cuántos hilos crear y cómo asignárselas.
02 · Pools de hilosHilos que esperan trabajo
Crear un hilo es más barato que crear un proceso, pero sigue costando, y más si se descarta al terminar cada tarea. Además, crear hilos sin límite puede agotar la memoria. La solución es un pool de hilos: al arrancar, el programa crea un grupo de hilos que esperan trabajo. Cuando llega una tarea, la toma uno libre; al terminar, no se destruye: vuelve al pool.
- Usar un hilo que ya existe es más rápido que crear uno nuevo.
- El pool limita cuántos hilos hay a la vez, lo que protege a un sistema que no aguanta demasiados.
- Separar la tarea de cómo se ejecuta permite estrategias flexibles, como retrasarla o repetirla periódicamente.
El tamaño del pool suele basarse en la cantidad de núcleos, aunque algunos sistemas lo ajustan solos según la carga.
03 · Divide y vencerásFork-join
En el modelo fork-join, el padre crea hilos hijos para partes del problema (fork) y luego espera a que todos terminen para combinar los resultados (join). Es síncrono y encaja con los algoritmos recursivos de divide y vencerás: el problema se parte hasta que es lo bastante pequeño para resolverlo directamente. Java lo incluye desde la versión 7, y una biblioteca decide cuántos hilos reales usar.
Sumar 16 números con fork-join. Elige el umbral: cuando un trozo es de ese tamaño o menor, se suma directamente sin partirlo más.
Otras herramientas de hilos implícitos son OpenMP (directivas para paralelizar bucles en C y C++), Grand Central Dispatch (de Apple), Intel Thread Building Blocks y CUDA de NVIDIA, que reparte el trabajo entre miles de núcleos de la tarjeta gráfica.
04 · Lo que se complicaProblemas de los hilos
- fork() y exec(): si un hilo llama a
fork(), ¿se duplican todos los hilos o solo el que llamó? Yexec()reemplaza el proceso entero, con todos sus hilos. - Señales: ¿a qué hilo se entrega una señal enviada al proceso?
- Cancelación: terminar un hilo antes de tiempo, de inmediato o en puntos seguros.
- Almacenamiento local: datos que cada hilo necesita propios, aunque compartan todo lo demás.
- Activación del planificador: la coordinación entre la biblioteca de hilos y el kernel.
Un proceso y un hilo son lo mismo
Linux no distingue de verdad entre procesos e hilos: ambos son una task_struct, y se dice tarea. La llamada clone() crea una tarea nueva e indica, con banderas, qué comparte con la que la crea. Sin compartir nada, el resultado se comporta como un proceso; compartiéndolo todo, como un hilo.
Elige qué comparte la tarea nueva con su creadora en clone().
Antes de leer la respuesta
Cada vez que cambias el modo, el pool o la carga, empieza una medición nueva. Las misiones se cumplen con 20 ticks seguidos de una misma configuración.
Tu turno: un servidor web bajo carga
Un servidor web con 4 núcleos y memoria para 24 hilos. Le llegan solicitudes: con carga baja, una cada dos ticks; con carga alta, seis cada cinco ticks. Cada solicitud necesita 3 ticks de CPU, y crear un hilo nuevo cuesta 2 más. Compara un hilo por solicitud con un pool de hilos.
Comprueba lo que entendiste
Cada respuesta incorrecta explica por qué parece correcta y en qué falla.