El sistema operativo y el hardware
Con el algoritmo FIFO, darle más memoria a un programa puede hacer que falle más. Es la anomalía de Belady, y se ve con doce referencias.
01Un sistema operativo de propósito general
Un sistema operativo de tiempo real promete plazos. Uno de propósito general, como Linux, Windows o macOS, promete otras cosas: que muchos programas compartan la máquina en forma justa, que ninguno pueda dañar a los demás ni al sistema, y que cada uno vea más memoria de la que hay. Cumplir esas promesas no es posible solo con software: necesita mecanismos del procesador. Los conceptos generales del sistema operativo se vieron en sistemas operativos, de Informática.
| Promesa del sistema | Mecanismo de hardware |
|---|---|
| Aislamiento entre programas y del núcleo | Modos de privilegio: el código de usuario no puede ejecutar instrucciones privilegiadas ni tocar el hardware |
| Reparto del procesador | Un temporizador que interrumpe y devuelve el control al planificador |
| Memoria propia para cada proceso | La unidad de manejo de memoria (MMU) traduce direcciones virtuales a físicas |
| Entrada y salida eficiente | Interrupciones de los periféricos y DMA |
02Modos, llamadas al sistema e interrupciones
El procesador tiene al menos dos modos. En modo usuario, una instrucción privilegiada o un acceso a una página protegida provocan una excepción que pasa el control al núcleo. Un programa pide servicios al núcleo con una llamada al sistema, una instrucción especial que cambia de modo y salta a una dirección fija. Los periféricos avisan con interrupciones: el procesador guarda su estado, ejecuta la rutina del controlador (driver) y vuelve. Para transferencias grandes, el DMA copia los datos entre el periférico y la memoria y solo interrumpe al terminar. Los registros de los periféricos se ven como direcciones de memoria, que el núcleo mapea y protege.
03Memoria virtual
Cada proceso ve un espacio de direcciones propio, dividido en páginas, típicamente de 4 KB. La MMU traduce cada dirección con la tabla de páginas del proceso, que dice en qué marco de la memoria física está cada página, con qué permisos, o si no está cargada. Como leer la tabla en cada acceso duplicaría el tiempo, la MMU guarda las traducciones recientes en una caché, la TLB. Si la página no está en memoria, ocurre un fallo de página: el núcleo la trae del disco, lo que cuesta millones de veces un acceso. Las memorias físicas se trataron en memorias electrónicas.
04Qué página sacar
Cuando la memoria está llena y hay un fallo, el sistema tiene que elegir una página para desalojar. El algoritmo óptimo, de Belady, saca la que se va a usar más tarde: no se puede implementar porque requiere conocer el futuro, pero sirve de referencia. FIFO saca la más antigua; LRU la usada hace más tiempo, y aprovecha la localidad de los programas, que tienden a volver a lo que usaron recién. Los sistemas reales aproximan LRU con un bit de referencia que pone la MMU, en el algoritmo del reloj.
Una secuencia de referencias a páginas y una cantidad de marcos de memoria física. Cada columna es una referencia; las celdas muestran qué página hay en cada marco, y las columnas resaltadas son fallos de página.
La secuencia de Belady muestra una sorpresa: con FIFO, agregar un marco puede aumentar los fallos. LRU y el óptimo no tienen esa anomalía. Con un lazo apenas más grande que la memoria, LRU y FIFO fallan en cada referencia.
05En el laboratorio
En Linux, medir los fallos de página de un programa que recorre una matriz grande por filas y por columnas, con el comando de estadísticas de rendimiento. Explicar la diferencia.
Rastrear las llamadas al sistema de un programa simple con strace y reconocer las de lectura, escritura y mapeo de memoria.
Escribir un controlador mínimo de Linux para un LED en una placa con procesador ARM, que exponga un archivo en /dev para encenderlo desde el espacio de usuario.
06Errores frecuentes
- Creer que la memoria virtual es solo para tener más memoria. Su función principal es aislar a los procesos.
- Ignorar el costo de un fallo de página. Un fallo cada cien mil accesos ya duplica el tiempo efectivo.
- Pensar que más memoria siempre reduce los fallos. Con FIFO puede no ser así.
- Acceder al hardware desde un programa de usuario. Se hace con un controlador en el núcleo o mapeando la memoria con permisos.
07Autoevaluación
¿Cuántas entradas tiene la tabla de páginas de un espacio de 4 GB con páginas de 4 KB, en un solo nivel?
\( 2^{32}/2^{12} = 2^{20} \), un millón.
Con 100 ns de memoria y 95 % de aciertos en la TLB, sin fallos de página, ¿cuál es el tiempo efectivo?
\( 0{,}95 \cdot 100 + 0{,}05 \cdot 200 = 105 \) ns, despreciando la TLB.
¿Qué es la anomalía de Belady?
Que con FIFO, más marcos de memoria pueden producir más fallos de página.
¿Qué mecanismo del procesador impide que un programa de usuario apague las interrupciones?
Los modos de privilegio: esa instrucción solo se ejecuta en modo núcleo.
08Para ampliar
- Abraham Silberschatz, Peter B. Galvin y Greg Gagne. Operating System Concepts. 10.ª ed., Wiley, 2018. La memoria virtual, el reemplazo de páginas y la relación con el hardware.
- Remzi H. Arpaci-Dusseau y Andrea C. Arpaci-Dusseau. Operating Systems: Three Easy Pieces. Arpaci-Dusseau Books, 2018. Un libro claro y de acceso libre, con capítulos sobre la TLB y el reemplazo.
- Jonathan Corbet, Alessandro Rubini y Greg Kroah-Hartman. Linux Device Drivers. 3.ª ed., O'Reilly, 2005. Cómo se escriben los controladores del núcleo de Linux.