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:

  1. El fork crea 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.
  2. El exec cambia el programa del hijo por otro. Así es como la terminal abre el ls: hace un fork, y el hijo ejecuta el ls.

Qué está haciendo el proceso

En cada momento, un proceso está en uno de estos estados:

EstadoQué 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.

Proceso AMemoria compartidacódigo · datos · heapHilo 1pila propiaHilo 2pila propiaHilo 3pila propiaTodos los hilos ven la misma memoriaProceso BMemoria propiaaisladoHilo 1pila propiaNo ve la memoriadel Proceso A
Los hilos del Proceso A ven la misma memoria. El Proceso B está aislado.

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ónElección
Programas que no pueden estorbarse entre sí, o código de tercerosProcesos
Muchas tareas que leen y escriben los mismos datosHilos
Una falla no puede derribar el restoProcesos
La creación tiene que ser rápida y barataHilos

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.