~/si/ud03 $ cat 05-memoria-y-paginacion.md
- Sistemas Informáticos
- UD03
- lección 05/06
Gestión de memoria y paginación
Abrir las diapositivas de apoyo: Gestión de memoria y paginación (pantalla completa)
El planificador reparte el tiempo de CPU entre el editor y el navegador. Mientras trabajan, ambos necesitan mantener instrucciones y datos en RAM. ¿Cómo encuentra cada proceso sus datos y cómo evita el sistema operativo que uno acceda sin permiso a los del otro?
5.1. Asignar, proteger y liberar memoria
Section titled “5.1. Asignar, proteger y liberar memoria”El sistema operativo (SO) asigna memoria cuando un proceso la necesita y la recupera cuando deja de usarla. También controla los accesos para que, por ejemplo, el editor no pueda escribir sin permiso en la memoria del navegador.
5.2. Direcciones virtuales y físicas
Section titled “5.2. Direcciones virtuales y físicas”El editor quiere leer un carácter del texto. El navegador quiere leer un dato de una web. En este ejemplo, los dos piden la dirección 8195 y cada uno recibe su propio dato. ¿Cómo sabe el ordenador cuál tiene que leer?
8195 es una dirección virtual. Es el número que usa el proceso para pedir un dato de su memoria. Para encontrarlo, el hardware traduce ese número a una dirección física, que indica el lugar real del dato en RAM.
El espacio de direcciones virtuales, o espacio virtual, es el conjunto de direcciones de memoria propio de cada proceso. El editor usa sus direcciones para localizar sus instrucciones y datos; el navegador tiene las suyas. Por eso el número 8195 puede aparecer en ambos espacios y corresponder a lugares distintos de RAM. El SO determina qué zonas de ese espacio están asignadas y con qué permisos se pueden utilizar.
Sigue primero la fila del editor. El SO ha preparado una tabla que indica dónde están sus datos en RAM y qué accesos permite. Cuando el editor pide leer la dirección 8195, la MMU (unidad de gestión de memoria, una parte del hardware) usa esa tabla y encuentra el carácter en la dirección física 28675. En la segunda fila, la MMU usa la tabla del navegador y encuentra el dato de la web en la dirección física 16387.
La MMU también comprueba qué operación permite la tabla. Por ejemplo, si una zona es de solo lectura, puede leer el dato, pero bloquea un intento de escribir en ella. En el siguiente apartado veremos qué información usa la tabla para localizar el dato.
5.3. Páginas, marcos y tabla de páginas
Section titled “5.3. Páginas, marcos y tabla de páginas”Para organizar las direcciones de cada proceso, la paginación divide su espacio virtual en bloques de tamaño fijo llamados páginas. La RAM se divide en bloques del mismo tamaño llamados marcos. La tabla de páginas de cada proceso indica qué páginas están en RAM y qué marco ocupa cada una. Así, páginas consecutivas pueden ocupar marcos separados.
Volvamos a la lectura del editor. En el ejemplo, su dirección 8195 señala la página 2, posición 3. Seguimos ese mismo acceso para ver cómo funciona la tabla:
- La MMU identifica en 8195 dos datos: la página que busca el editor (2) y la posición dentro de ella (3).
- La MMU usa la tabla del editor. Allí figura que la página 2 está en el marco 7.
- La MMU conserva la posición 3, llamada desplazamiento. El marco 7, posición 3 corresponde a 28675, la dirección física que vimos en 5.2.
5.4. Cuando una página no está en RAM
Section titled “5.4. Cuando una página no está en RAM”Si el editor intenta acceder a una página que aún no está en RAM, se produce un fallo de página. El SO comprueba el acceso. Si está permitido, prepara la página en un marco, actualiza la tabla y el proceso puede volver a intentar el acceso. A veces hay que leer datos del almacenamiento. Otras veces basta con preparar una página nueva. Si el proceso pide un acceso que sus permisos prohíben o usa una dirección que no tiene asignada, el SO rechaza el acceso.
5.5. Intercambio (swap) y rendimiento
Section titled “5.5. Intercambio (swap) y rendimiento”El área de intercambio o swap es un espacio del disco duro o SSD donde el SO puede guardar temporalmente ciertas páginas para liberar RAM. Por ejemplo, mientras trabajas con el editor, el SO puede trasladar al disco páginas de otra aplicación que llevan un tiempo sin utilizarse.
El recorrido es el siguiente:
- El SO guarda una página en el área de intercambio y puede reutilizar el marco de RAM que ocupaba.
- Si la aplicación vuelve a necesitar esa página, se produce un fallo de página.
- El SO la lee del disco y la coloca en un marco de RAM. Después actualiza la tabla y permite continuar el acceso.
Leer y escribir en el disco, incluso en un SSD, introduce más espera que acceder a la RAM. Por eso, si el sistema necesita mover páginas continuamente, los programas pueden responder más despacio. Una VM con 2 GiB de RAM y 8 GiB de intercambio tiene que hacer estas transferencias cuando necesita datos que están en el disco.
Los sistemas operativos organizan este espacio de distintas formas:
- Windows usa un archivo de paginación, normalmente llamado
pagefile.sys, en una unidad de almacenamiento. Windows puede gestionar automáticamente su tamaño. Documentación de Microsoft. - Linux puede usar un archivo de intercambio dentro de un sistema de archivos o una partición de intercambio, una zona del disco dedicada a esta función. Documentación de Debian.
- macOS gestiona automáticamente el intercambio en el disco de arranque. En Monitor de Actividad, el dato «Intercambio usado» muestra cuánto espacio de disco está utilizando para ello. También puede comprimir datos dentro de la RAM para aprovecharla mejor. Documentación de Apple.
Un proceso trabaja con sus direcciones virtuales tanto si sus datos están en RAM como si algunas de sus páginas están guardadas en el disco. El espacio virtual organiza las direcciones que usa el proceso; la RAM y el swap son lugares donde pueden estar los datos correspondientes.
Por ejemplo, de tres páginas del editor, dos pueden estar cargadas en RAM y la tercera guardada en swap. Las tres siguen formando parte del espacio virtual del editor. Si necesita acceder a la tercera, el SO debe traerla a RAM y actualizar su tabla de páginas antes de continuar. Así, un proceso puede tener unas páginas en RAM y otras en swap al mismo tiempo.
5.6. Desbordamiento de búfer (buffer overflow)
Section titled “5.6. Desbordamiento de búfer (buffer overflow)”Ampliación
Dentro de la memoria asignada a un proceso, el programa reserva zonas para sus distintos datos. Un búfer es una de esas zonas, con una capacidad determinada, que se usa para guardar datos temporalmente.
Imagina que el programa reserva un búfer de 8 bytes dentro de su memoria, pero intenta escribir 12 sin comprobar cuánto espacio tiene. Si la escritura continúa, los 4 bytes que sobran pueden alcanzar datos vecinos del mismo proceso y alterarlos. Esto es un desbordamiento de búfer. Puede ocurrir aunque al equipo le sobre RAM, porque el límite que se rebasa es el de los 8 bytes reservados para ese búfer.
La MMU comprueba los permisos de las páginas. Si el búfer y los datos vecinos están en la misma página y esta permite la escritura, ese permiso por sí solo no impide que el programa se salga del búfer. Por eso el programa debe comprobar cuánto espacio tiene antes de escribir.
En hacking, un desbordamiento de búfer puede ser una vulnerabilidad si alguien consigue provocar el fallo para alterar el comportamiento del programa. En hacking ético se buscan estos fallos con autorización para que puedan corregirse.
En Java, puedes probar el mismo caso en JShell:
import java.nio.ByteBuffer;
ByteBuffer buffer = ByteBuffer.allocate(8);buffer.put(new byte[12]); // Lanza BufferOverflowExceptionByteBuffer comprueba cuánto espacio queda y rechaza la escritura antes de copiar los datos. Así evita que se sobrescriba memoria fuera del búfer.
5.7. Localizar un dato en RAM
Section titled “5.7. Localizar un dato en RAM”RA2.b.
Usa esta parte de la tabla de páginas del editor. Los dos accesos están permitidos.
| Página | ¿Está en RAM? | Marco |
|---|---|---|
| 0 | Sí | 3 |
| 1 | No | — |
| 2 | Sí | 7 |
Completa las dos filas. Si falta la página, indica qué debe hacer el SO antes de que el acceso pueda continuar.
| Página | Posición dentro de la página | Marco y posición, o explicación si falta la página |
|---|---|---|
| 0 | 5 | |
| 1 | 4 |
Reutiliza la tabla en el apartado 6.8.3 de la práctica integrada de funcionamiento del SO.
5.8. Diagnosticar una idea equivocada
Section titled “5.8. Diagnosticar una idea equivocada”RA2.b.
Un compañero dice que su VM con 2 GiB de RAM y 8 GiB de swap irá igual que una VM con 10 GiB de RAM. Responde en una o dos frases por pregunta.
- ¿Por qué puede ir más lenta si necesita recurrir al swap continuamente?
- ¿Puede faltar una página en RAM aunque el acceso esté permitido? ¿Qué hace el SO en ese caso?
En el siguiente bloque veremos cómo el SO ayuda a guardar el trabajo en archivos y a comunicarse con los dispositivos.