El caso
Un navegador. Doce entradas. Y el sistema de pedidos, una sola.
Isaac abrió el administrador de tareas y vio el navegador listado doce veces. El sistema de pedidos de la tienda aparecía una sola vez, pero atendía a decenas de clientes al mismo tiempo.
Dos programas, dos formas de organizar el trabajo. ¿Qué entiende el sistema operativo por "un programa en ejecución"?
Este post parte de Kernel: es él quien crea y acompaña todo lo que se describe aquí.
El problema
Un programa en el disco no hace nada
Un programa es un archivo, guardado en el disco. Para que corra, el sistema tiene que cargarlo en memoria, darle un pedazo del procesador y seguir lo que hace. Y surgen dos necesidades al mismo tiempo:
- Aislar: dos programas no pueden dañar la memoria uno del otro.
- Hacer varias cosas: un mismo programa, como el sistema de pedidos, tiene que atender a muchos clientes sin hacer que uno espere a otro.
La solución
Proceso: un programa en ejecución
Un proceso es un programa en ejecución. El programa es la receta en papel, y el proceso es la cocina funcionando. Para cada proceso, el kernel guarda una ficha con todo lo que necesita saber:
- el PID (process ID), un número que identifica al proceso;
- el estado (ejecutando, esperando…);
- la memoria que puede usar, separada de la de los demás;
- los archivos abiertos y los valores de los registros del procesador.
Esa ficha se llama bloque de control del proceso (process control block, PCB).
Cómo nace un proceso
En los sistemas Unix, como Linux y macOS, un proceso nuevo nace en dos pasos:
- El
forkcrea un proceso hijo, una copia del proceso que lo llamó (el padre). Para no copiar todo de una vez, Linux usa la copia al escribir (copy-on-write): padre e hijo comparten la memoria hasta que uno de ellos escriba, y solo entonces se copia la parte modificada. - El
execcambia el programa del hijo por otro. Así es como la terminal abre ells: hace unfork, y el hijo ejecuta ells.
Qué está haciendo el proceso
En cada momento, un proceso está en uno de estos estados:
| Estado | Qué significa |
|---|---|
| Listo (ready) | Tiene todo lo necesario para correr y espera su turno en el procesador |
| Ejecutando (running) | Está usando el procesador en este momento |
| Bloqueado (blocked, o waiting) | Espera algo para continuar, como la respuesta del disco o de la red |
El kernel alterna los procesos entre estos estados tan rápido que parece que todos corren al mismo tiempo. Cada cambio exige guardar el estado del que sale y restaurar el del que entra: es el cambio de contexto (context switch), y cuesta tiempo.
Dentro del proceso
Hilo: varias líneas de ejecución
Un hilo es una línea de ejecución dentro de un proceso. Todo proceso tiene al menos uno, y puede tener varios. Los hilos de un mismo proceso:
- comparten la memoria y los archivos abiertos del proceso;
- tienen, cada uno, su propia pila (stack) y sus registros, porque cada uno está en un punto distinto del código.
El proceso es la tienda de Isaac, con su mostrador, su depósito y su caja. Los hilos son los empleados: todos trabajan en la misma tienda y usan el mismo depósito, y cada uno hace una tarea distinta. Otra tienda es otro proceso: tiene su propio depósito, y nadie de una entra en el depósito de la otra.
Como los hilos comparten la memoria, crear uno y alternar entre ellos es más barato que hacerlo con procesos. El precio es el riesgo: dos hilos que tocan el mismo dato al mismo tiempo pueden estorbarse, un problema que aparecerá en los posts sobre concurrencia.
No confundas
Proceso × hilo
Proceso (process)
“¿Necesito aislamiento fuerte entre las partes?”
- Ejemplo
- Cada pestaña del navegador, para que el cuelgue de una no derribe a las demás.
- Foco
- Memoria propia, más caro de crear, y la falla de uno no afecta a los demás.
Hilo
“¿Necesito varias tareas que trabajen con los mismos datos?”
- Ejemplo
- El sistema de pedidos, atendiendo a varios clientes con un hilo por pedido.
- Foco
- Comparte la memoria, es más liviano, y la falla de uno puede derribar todo el proceso.
En la práctica
Dónde aparece esto
Navegador (un proceso por pestaña)
Los navegadores modernos usan procesos separados para aislar las pestañas y las extensiones.
En la computadora de Isaac: las doce entradas del navegador.
Servidor con hilos (pool de hilos)
Un servidor mantiene un grupo de hilos listos, y cada solicitud usa uno de ellos.
En la tienda: el sistema de pedidos atendiendo a decenas de clientes.
Observar procesos e hilos (ps, top)
En Linux, ps -eLf lista los procesos y sus hilos, y top muestra lo que está usando el procesador.
| Situación | Elección |
|---|---|
| Programas que no pueden estorbarse entre sí, o código de terceros | Procesos |
| Muchas tareas que leen y escriben los mismos datos | Hilos |
| Una falla no puede derribar el resto | Procesos |
| La creación tiene que ser rápida y barata | Hilos |
Términos clave
Seis términos para fijar
Toca la tarjeta para ver la definición.
Prueba rápida
Tres preguntas, estilo examen
01
¿Qué comparten los hilos de un mismo proceso?
02
En un sistema Unix, ¿qué hace la llamada fork?
03
Un hilo accede a una región inválida de la memoria y el programa termina. ¿Qué pasa con los demás hilos del proceso?
Proceso e hilo responden a dos necesidades distintas: el proceso aísla un programa de los demás, y el hilo permite que un programa haga varias cosas con los mismos datos. Elegir entre uno y otro es elegir entre aislamiento y economía, y eso explica por qué el navegador usa procesos y el servidor de Isaac usa hilos.