El caso
La memoria se acabó en medio de un pedido. Y el kernel eligió quién moría.
El servidor de la tienda de Isaac tenía 8 GB de RAM. Un viernes, un informe consumió casi todo, y el sistema de pedidos empezó a ir lento. En pocos minutos, el proceso de la base de datos fue cerrado, y los pedidos en curso se detuvieron.
La decisión la tomó el kernel, no el programa del informe.
Este post parte de Kernel: el núcleo del sistema operativo y de Procesos e hilos: cómo el sistema ejecuta tus programas: el kernel es quien gestiona la memoria y los archivos que usan esos procesos.
El problema
La memoria y el disco son finitos
Cada programa necesita memoria para guardar lo que está haciendo, y varios corren al mismo tiempo. La RAM es rápida, pero pequeña. El disco es grande, pero lento. Y los archivos, que viven en el disco, necesitan nombres, permisos y una forma de encontrar cada pedazo después.
Sin una capa que organice todo eso, un programa podría leer la memoria de otro, o sobrescribir el archivo de un compañero.
La solución
Memoria virtual
Con la memoria virtual, cada proceso ve un espacio de direcciones que es solo suyo, como si tuviera toda la memoria para él. El kernel traduce esas direcciones a la memoria física (la RAM) mediante una tabla de páginas. Cada página tiene un tamaño fijo, en general 4 KB.
Por esa traducción, dos procesos pueden usar la misma dirección virtual, y aun así cada uno accede a su propia área de la RAM. Un proceso que intenta leer la memoria de otro es bloqueado por el kernel.
Aislamiento
Cada proceso ve solo su espacio de direcciones.
En la tienda: el informe no puede leer la memoria del sistema de pedidos.
Más memoria que la RAM
Las páginas que no están en uso pueden ir al disco, y volver cuando se necesitan.
En la tienda: el servidor ejecuta más procesos de los que caben en la RAM, solo que más lento.
Compartición
Cuando dos procesos usan el mismo código, el kernel puede guardar una sola copia en la RAM.
En la tienda: varias instancias del mismo programa comparten el código.
Por dentro
Páginas y fallas de página
Cuando un programa accede a una página que no está en la RAM, ocurre una falla de página (page fault). El kernel pausa el proceso, trae la página del disco y reanuda la ejecución. Eso pasa sin que el programa lo note, y lleva tiempo.
Si el sistema pasa todo el tiempo intercambiando páginas entre la RAM y el disco, y casi no ejecuta trabajo útil, tenemos el thrashing: el equipo está ocupado solo en mover memoria.
No los confundas
RAM × swap
La RAM es la memoria física, rápida, donde los procesos realmente corren. El swap es un área del disco que se usa como extensión de la memoria cuando la RAM se acaba. Evita que el sistema se detenga por completo, pero es mucho más lento.
RAM (memoria física)
“¿El dato tiene que estar accesible ahora, lo más rápido posible?”
- Ejemplo
- Las páginas de la base de datos que se están consultando.
- Foco
- Rápida y limitada. Es donde el proceso ejecuta.
Swap (área de intercambio)
“¿Se acabó la RAM, y el sistema necesita mantener vivo el proceso?”
- Ejemplo
- Las páginas de un informe que quedó parado durante la noche.
- Foco
- Lenta, pero más grande. Evita la falla total, a costa del rendimiento.
Almacenamiento
Sistemas de archivos
Un sistema de archivos (file system) es la forma en que el kernel organiza el disco en archivos y directorios. Responde a tres preguntas: dónde está cada pedazo del archivo, quién puede leerlo o escribirlo, y qué hacer después de un corte de energía.
- Inodo (inode): la ficha de un archivo. Guarda el tamaño, los permisos, las fechas y dónde están los bloques del contenido. El nombre del archivo no se guarda en el inodo.
- Directorio: una tabla que liga nombres a inodos. Por eso, renombrar un archivo no toca su contenido.
- Permisos: quién es dueño del archivo y quién puede leerlo, escribirlo o ejecutarlo. El kernel verifica esa regla en cada acceso.
- Journaling (registro de cambios): antes de cambiar el disco, el sistema anota la intención en un diario. Si la energía se corta en medio, al volver completa o deshace la operación, sin dejar el disco inconsistente.
Linux usa, por ejemplo, ext4. Windows usa NTFS, y macOS usa APFS. Los nombres cambian; la idea es la misma.
En la práctica
Mirar la memoria y el disco
En Linux, dos comandos muestran el estado del sistema:
free -h
df -hfree -h muestra la RAM y el swap en uso. df -h muestra el espacio ocupado en cada sistema de archivos. Si el disco se llena, muchos servicios dejan de escribir, aunque haya memoria libre.
| Situación | Dónde mirar |
|---|---|
| El servidor va lento y el disco hace mucho ruido | free -h y el uso de swap |
| Un servicio deja de escribir logs | df -h, espacio libre en el disco |
| Un proceso fue terminado sin aviso | El log del kernel, que registra el motivo |
Términos clave
Seis términos para recordar
Toca la tarjeta para ver la definición.
Prueba rápida
Tres preguntas, estilo examen
01
Dos procesos usan la misma dirección virtual. ¿Por qué uno no lee los datos del otro?
02
Un programa accede a una página que no está en la RAM. ¿Qué hace el kernel?
03
Un archivo fue renombrado. ¿Qué cambió en el disco?
La memoria virtual y los sistemas de archivos son dos caras de la misma tarea del kernel: dar a cada programa un espacio seguro, y organizar el disco para que se pueda usar sin conflictos. Cuando la memoria se acaba, el kernel decide quién se queda. Cuando se corta la energía, el journaling decide qué sobrevive. Juntos son lo que mantiene funcionando una base de datos como la de la tienda de Isaac.