En los sistemas operativos de las computadoras , la paginación de memoria (o intercambio en algunos sistemas tipo Unix ) es un esquema de administración de memoria mediante el cual una computadora almacena y recupera datos del almacenamiento secundario [a] para su uso en la memoria principal . [ cita requerida ] En este esquema, el sistema operativo recupera datos del almacenamiento secundario en bloques del mismo tamaño llamados páginas . La paginación es una parte importante de las implementaciones de memoria virtual en los sistemas operativos modernos, que utilizan el almacenamiento secundario para permitir que los programas excedan el tamaño de la memoria física disponible.
Para simplificar, la memoria principal se denomina "RAM" (un acrónimo de memoria de acceso aleatorio ) y el almacenamiento secundario se denomina "disco" (una abreviatura de unidad de disco duro , memoria de tambor o unidad de estado sólido , etc.), pero como ocurre con muchos aspectos de la informática, los conceptos son independientes de la tecnología utilizada.
Dependiendo del modelo de memoria , la funcionalidad de memoria paginada generalmente está incorporada en una CPU/MCU mediante una Unidad de administración de memoria (MMU) o una Unidad de protección de memoria (MPU) y se habilita por separado mediante un código de sistema privilegiado en el núcleo del sistema operativo . En las CPU que implementan la arquitectura del conjunto de instrucciones (ISA) x86 , por ejemplo, la paginación de memoria se habilita a través del registro de control CR0 .
En la década de 1960, el intercambio era una de las primeras técnicas de memoria virtual. Un programa completo o un segmento completo se "extraía" (o "extraía") de la RAM al disco o tambor, y se introducía ( o extraía ) otro. [1] [2] Un programa extraído con intercambio estaría en curso, pero su ejecución se suspendería mientras otro programa utilizara su RAM; un programa con un segmento extraído con intercambio podría seguir ejecutándose hasta que necesitara ese segmento, momento en el que se suspendería hasta que se extrajera el segmento.
Un programa puede incluir múltiples superposiciones que ocupan la misma memoria en diferentes momentos. Las superposiciones no son un método para paginar la RAM en el disco, sino simplemente para minimizar el uso de la RAM del programa. Las arquitecturas posteriores utilizaron la segmentación de memoria y los segmentos de programa individuales se convirtieron en las unidades intercambiadas entre el disco y la RAM. Un segmento era el segmento de código o segmento de datos completo del programa, o a veces otras estructuras de datos grandes. Estos segmentos tenían que ser contiguos cuando residían en la RAM, lo que requería computación y movimiento adicionales para remediar la fragmentación . [3]
El Atlas de Ferranti y el Supervisor Atlas desarrollado en la Universidad de Manchester [ 4] (1962) fueron los primeros sistemas en implementar paginación de memoria. Las primeras máquinas posteriores y sus sistemas operativos que soportaban paginación incluyen el IBM M44/44X y su sistema operativo MOS (1964), [5] el SDS 940 [6] y el Berkeley Timesharing System (1966), un IBM System/360 Model 40 modificado y el sistema operativo CP-40 (1967), el IBM System/360 Model 67 y sistemas operativos como TSS/360 y CP/CMS (1967), el RCA 70/46 y el Time Sharing Operating System (1967), el GE 645 y Multics (1969), y el PDP-10 con hardware de paginación diseñado por BBN y el sistema operativo TENEX (1969).
Esas máquinas, y las máquinas posteriores que admiten paginación de memoria, utilizan un conjunto de registros de direcciones de página o tablas de páginas en memoria [d] para permitir que el procesador opere en páginas arbitrarias en cualquier lugar de la RAM como un espacio de direcciones lógicas aparentemente contiguos . Estas páginas se convirtieron en las unidades intercambiadas entre el disco y la RAM.
Cuando un proceso intenta hacer referencia a una página que no está asignada actualmente a un marco de página en la RAM, el procesador trata esta referencia de memoria no válida como un error de página y transfiere el control del programa al sistema operativo. El sistema operativo debe:
Cuando todos los marcos de página están en uso, el sistema operativo debe seleccionar un marco de página para reutilizarlo en la página que el programa necesita ahora. Si el marco de página expulsado fue asignado dinámicamente por un programa para almacenar datos, o si un programa lo modificó desde que se leyó en la RAM (en otras palabras, si se ha vuelto "sucio"), debe escribirse en el disco antes de liberarse. Si un programa hace referencia posteriormente a la página expulsada, se produce otro error de página y la página debe volver a leerse en la RAM.
El método que utiliza el sistema operativo para seleccionar el marco de página que se va a reutilizar, que es su algoritmo de reemplazo de página , es importante para la eficiencia. El sistema operativo predice el marco de página que es menos probable que se necesite pronto, a menudo mediante el algoritmo LRU ( menos usado recientemente ) o un algoritmo basado en el conjunto de trabajo del programa . Para aumentar aún más la capacidad de respuesta, los sistemas de paginación pueden predecir qué páginas se necesitarán pronto, cargándolas preventivamente en la RAM antes de que un programa las haga referencia, y pueden robar marcos de página de páginas que no han sido referenciadas durante mucho tiempo, dejándolas disponibles. Algunos sistemas limpian las páginas nuevas para evitar fugas de datos que comprometan la seguridad; algunos las configuran con valores definidos por la instalación o aleatorios para facilitar la depuración.
Cuando se utiliza la paginación por demanda pura, las páginas se cargan solo cuando se hace referencia a ellas. Un programa de un archivo asignado a la memoria comienza a ejecutarse sin ninguna de sus páginas en la RAM. A medida que el programa comete errores de página, el sistema operativo copia las páginas necesarias de un archivo, por ejemplo, un archivo asignado a la memoria , un archivo de paginación o una partición de intercambio que contiene los datos de la página en la RAM.
Algunos sistemas sólo utilizan paginación bajo demanda , es decir, esperan hasta que se solicita realmente una página antes de cargarla en la RAM.
Otros sistemas intentan reducir la latencia adivinando qué páginas que no están en la RAM es probable que se necesiten pronto y precargando dichas páginas en la RAM antes de que se soliciten. (Esto suele combinarse con una limpieza previa, que adivina qué páginas que están actualmente en la RAM es probable que no se necesiten pronto y las preescribe en el almacenamiento).
Cuando se produce un fallo de página, los sistemas de paginación anticipatoria no sólo traerán la página referenciada, sino también otras páginas que probablemente serán referenciadas pronto. Un algoritmo de paginación anticipatoria simple traerá las siguientes páginas consecutivas aunque todavía no sean necesarias (una predicción que utiliza la localidad de referencia ); esto es análogo a una cola de entrada de precarga en una CPU. La precarga de intercambio precargará las páginas intercambiadas recientemente si hay suficientes páginas libres para ellas. [7]
Si un programa finaliza, el sistema operativo puede retrasar la liberación de sus páginas, en caso de que el usuario vuelva a ejecutar el mismo programa.
La cola de páginas libres es una lista de marcos de páginas que están disponibles para su asignación. Evitar que esta cola esté vacía minimiza el cálculo necesario para dar servicio a un fallo de página. Algunos sistemas operativos buscan periódicamente páginas a las que no se ha hecho referencia recientemente y luego liberan el marco de página y lo añaden a la cola de páginas libres, un proceso conocido como "robo de páginas". Algunos sistemas operativos [e] admiten la recuperación de páginas ; si un programa comete un fallo de página haciendo referencia a una página que fue robada, el sistema operativo lo detecta y restaura el marco de página sin tener que volver a leer el contenido en la RAM.
El sistema operativo puede limpiar previamente periódicamente las páginas sucias: escribir las páginas modificadas en el disco aunque puedan modificarse más. Esto minimiza la cantidad de limpieza necesaria para obtener nuevos marcos de página en el momento en que se inicia un nuevo programa o se abre un nuevo archivo de datos, y mejora la capacidad de respuesta. (Los sistemas operativos Unix utilizan periódicamente la sincronización para limpiar previamente todas las páginas sucias; los sistemas operativos Windows utilizan subprocesos de "escritor de páginas modificadas").
Después de completar la inicialización, la mayoría de los programas operan en una pequeña cantidad de páginas de código y datos en comparación con la memoria total que requiere el programa. Las páginas a las que se accede con más frecuencia se denominan conjunto de trabajo .
Cuando el conjunto de trabajo es un pequeño porcentaje del número total de páginas del sistema, los sistemas de memoria virtual funcionan de manera más eficiente y se gasta una cantidad insignificante de tiempo en resolver los fallos de página. A medida que el conjunto de trabajo crece, la resolución de los fallos de página sigue siendo manejable hasta que el crecimiento alcanza un punto crítico. Luego, los fallos aumentan drásticamente y el tiempo que se dedica a resolverlos supera el tiempo que se dedica al cálculo para el que se escribió el programa. Esta condición se conoce como thrashing . El thrashing se produce en un programa que trabaja con estructuras de datos enormes, ya que su gran conjunto de trabajo provoca fallos de página continuos que ralentizan drásticamente el sistema. Satisfacer los fallos de página puede requerir liberar páginas que pronto tendrán que volver a leerse desde el disco. "Thrashing" también se utiliza en contextos distintos a los de los sistemas de memoria virtual; por ejemplo, para describir problemas de caché en informática o el síndrome de la ventana tonta en redes.
Un caso peor podría ocurrir en procesadores VAX . Un único MOVL que cruza un límite de página podría tener un operando de origen que utiliza un modo de direccionamiento diferido por desplazamiento, donde la palabra larga que contiene la dirección del operando cruza un límite de página, y un operando de destino que utiliza un modo de direccionamiento diferido por desplazamiento, donde la palabra larga que contiene la dirección del operando cruza un límite de página, y tanto el origen como el destino podrían cruzar los límites de página. Esta única instrucción hace referencia a diez páginas; si no todas están en la RAM, cada una provocará un fallo de página. A medida que se produce cada fallo, el sistema operativo necesita pasar por las extensas rutinas de gestión de memoria, lo que puede provocar múltiples E/S que pueden incluir la escritura de otras páginas de proceso en el disco y la lectura de páginas del proceso activo desde el disco. Si el sistema operativo no pudiera asignar diez páginas a este programa, entonces remediar el fallo de página descartaría otra página que la instrucción necesita, y cualquier reinicio de la instrucción volvería a generar un fallo.
Para disminuir la paginación excesiva y resolver problemas de tráfico, un usuario puede aumentar la cantidad de páginas disponibles por programa, ya sea ejecutando menos programas simultáneamente o aumentando la cantidad de RAM en la computadora.
En un entorno multiprogramado o multiusuario , muchos usuarios pueden ejecutar el mismo programa, escrito de forma que el código y los datos estén en páginas separadas. Para minimizar el uso de RAM, todos los usuarios comparten una única copia del programa. La tabla de páginas de cada proceso está configurada de forma que las páginas que contienen el código apunten a la única copia compartida, mientras que las páginas que contienen los datos apunten a distintas páginas físicas para cada proceso.
Diferentes programas también pueden usar las mismas bibliotecas. Para ahorrar espacio, solo se carga una copia de la biblioteca compartida en la memoria física. Los programas que usan la misma biblioteca tienen direcciones virtuales que se asignan a las mismas páginas (que contienen el código y los datos de la biblioteca). Cuando los programas quieren modificar el código de la biblioteca, usan la función de copia en escritura , por lo que la memoria solo se asigna cuando es necesario.
La memoria compartida es un medio eficaz de comunicación entre programas. Los programas pueden compartir páginas en la memoria y luego escribir y leer para intercambiar datos.
El primer ordenador que admitió paginación fue el superordenador Atlas , [8] [9] [10] desarrollado conjuntamente por Ferranti , la Universidad de Manchester y Plessey en 1963. La máquina tenía una memoria asociativa ( direccionable por contenido ) con una entrada para cada página de 512 palabras. El Supervisor [11] manejaba las interrupciones de no equivalencia [f] y gestionaba la transferencia de páginas entre el núcleo y el tambor para proporcionar un almacenamiento de un nivel [12] a los programas.
La paginación ha sido una característica de Microsoft Windows desde Windows 3.0 en 1990. Windows 3.x crea un archivo oculto llamado 386SPART.PAR
o WIN386.SWP
para usarse como archivo de intercambio. Generalmente se encuentra en el directorio raíz , pero puede aparecer en otro lugar (normalmente en el directorio WINDOWS). Su tamaño depende de cuánto espacio de intercambio tenga el sistema (una configuración seleccionada por el usuario en Panel de control → Mejorado en "Memoria virtual"). Si el usuario mueve o elimina este archivo, aparecerá una pantalla azul la próxima vez que se inicie Windows, con el mensaje de error "El archivo de intercambio permanente está dañado". Se le solicitará al usuario que elija si desea eliminar o no el archivo (incluso si no existe).
Windows 95 , Windows 98 y Windows Me utilizan un archivo similar, y sus configuraciones se encuentran en Panel de control → Sistema → pestaña Rendimiento → Memoria virtual. Windows establece automáticamente el tamaño del archivo de paginación para que comience en 1,5 veces el tamaño de la memoria física y se amplíe hasta 3 veces la memoria física si es necesario. Si un usuario ejecuta aplicaciones que consumen mucha memoria en un sistema con poca memoria física, es preferible establecer manualmente estos tamaños en un valor mayor que el predeterminado.
El archivo utilizado para la paginación en la familia Windows NTpagefile.sys
es . La ubicación predeterminada del archivo de paginación es el directorio raíz de la partición donde está instalado Windows. Windows se puede configurar para utilizar el espacio libre en cualquier unidad disponible para los archivos de paginación. Sin embargo, es necesario que la partición de arranque (es decir, la unidad que contiene el directorio de Windows) tenga un archivo de paginación si el sistema está configurado para escribir volcados de memoria completa o de núcleo después de una pantalla azul de la muerte . Windows utiliza el archivo de paginación como almacenamiento temporal para el volcado de memoria. Cuando se reinicia el sistema, Windows copia el volcado de memoria del archivo de paginación a un archivo separado y libera el espacio que se utilizó en el archivo de paginación. [13]
En la configuración predeterminada de Windows, se permite que el archivo de paginación se expanda más allá de su asignación inicial cuando sea necesario. Si esto sucede gradualmente, puede fragmentarse en gran medida , lo que puede causar problemas de rendimiento. [14] El consejo común que se da para evitar esto es establecer un único tamaño de archivo de paginación "bloqueado" para que Windows no lo expanda. Sin embargo, el archivo de paginación solo se expande cuando se ha llenado, lo que, en su configuración predeterminada, es el 150% de la cantidad total de memoria física. [ cita requerida ] Por lo tanto, la demanda total de memoria virtual respaldada por archivos de paginación debe superar el 250% de la memoria física de la computadora antes de que el archivo de paginación se expanda.
La fragmentación del archivo de paginación que se produce cuando se expande es temporal. En cuanto las regiones expandidas ya no se utilizan (en el siguiente reinicio, o antes), se liberan las asignaciones de espacio en disco adicionales y el archivo de paginación vuelve a su estado original.
El bloqueo del tamaño de un archivo de paginación puede ser problemático si una aplicación de Windows solicita más memoria que el tamaño total de la memoria física y el archivo de paginación, lo que genera solicitudes fallidas para asignar memoria que pueden provocar que las aplicaciones y los procesos del sistema fallen. Además, el archivo de paginación rara vez se lee o escribe en orden secuencial, por lo que la ventaja de rendimiento de tener un archivo de paginación completamente secuencial es mínima. Sin embargo, un archivo de paginación grande generalmente permite el uso de aplicaciones que consumen mucha memoria, sin penalizaciones además de usar más espacio en disco. Si bien un archivo de paginación fragmentado puede no ser un problema en sí mismo, la fragmentación de un archivo de paginación de tamaño variable creará con el tiempo varios bloques fragmentados en la unidad, lo que hará que otros archivos se fragmenten. Por este motivo, es mejor un archivo de paginación contiguo de tamaño fijo, siempre que el tamaño asignado sea lo suficientemente grande como para satisfacer las necesidades de todas las aplicaciones.
El espacio de disco necesario se puede asignar fácilmente en sistemas con especificaciones más recientes (es decir, un sistema con 3 GB de memoria que tiene un archivo de paginación de tamaño fijo de 6 GB en una unidad de disco de 750 GB, o un sistema con 6 GB de memoria y un archivo de paginación de tamaño fijo de 16 GB y 2 TB de espacio de disco). En ambos ejemplos, el sistema utiliza aproximadamente el 0,8 % del espacio de disco con el archivo de paginación preextendido a su máximo.
En ocasiones, también se recomienda desfragmentar el archivo de paginación para mejorar el rendimiento cuando un sistema Windows utiliza crónicamente mucha más memoria que su memoria física total. [ cita requerida ] Este punto de vista ignora el hecho de que, además de los resultados temporales de la expansión, el archivo de paginación no se fragmenta con el tiempo. En general, los problemas de rendimiento relacionados con el acceso al archivo de paginación se solucionan de manera mucho más efectiva agregando más memoria física.
Los sistemas Unix y otros sistemas operativos similares a Unix utilizan el término "swap" para describir el acto de sustituir el espacio en disco por RAM cuando la RAM física está llena. [15] En algunos de esos sistemas, es común dedicar una partición entera de un disco duro al intercambio. Estas particiones se denominan particiones swap . Muchos sistemas tienen un disco duro entero dedicado al intercambio, separado de las unidades de datos, que contiene solo una partición swap. Un disco duro dedicado al intercambio se denomina "unidad swap" o "unidad scratch" o " disco scratch ". Algunos de esos sistemas solo admiten el intercambio a una partición swap; otros también admiten el intercambio a archivos.
El núcleo Linux admite una cantidad prácticamente ilimitada de backends de intercambio (dispositivos o archivos) y también admite la asignación de prioridades de backend. Cuando el núcleo intercambia páginas de la memoria física, utiliza el backend de mayor prioridad con espacio libre disponible. Si se asigna la misma prioridad a varios backends de intercambio, se utilizan en forma de round-robin (que es algo similar a los diseños de almacenamiento RAID 0 ), lo que proporciona un rendimiento mejorado siempre que se pueda acceder de manera eficiente a los dispositivos subyacentes en paralelo. [16]
Desde la perspectiva del usuario final, los archivos de intercambio en las versiones 2.6.x y posteriores del núcleo Linux son prácticamente tan rápidos como las particiones de intercambio; la limitación es que los archivos de intercambio deben asignarse de forma contigua en sus sistemas de archivos subyacentes. Para aumentar el rendimiento de los archivos de intercambio, el núcleo mantiene un mapa de dónde se colocan en los dispositivos subyacentes y accede a ellos directamente, evitando así la caché y evitando la sobrecarga del sistema de archivos. [17] [18] Cuando residen en discos duros, que son dispositivos de medios magnéticos rotatorios, un beneficio de usar particiones de intercambio es la capacidad de colocarlas en áreas de discos duros contiguas que brindan un mayor rendimiento de datos o un tiempo de búsqueda más rápido. Sin embargo, la flexibilidad administrativa de los archivos de intercambio puede superar ciertas ventajas de las particiones de intercambio. Por ejemplo, un archivo de intercambio se puede colocar en cualquier sistema de archivos montado, se puede configurar en cualquier tamaño deseado y se puede agregar o cambiar según sea necesario. Las particiones de intercambio no son tan flexibles; no se pueden ampliar sin usar herramientas de particionamiento o administración de volúmenes , que introducen varias complejidades y posibles tiempos de inactividad.
Swappiness es un parámetro del kernel de Linux que controla el peso relativo que se le da al intercambio de la memoria de tiempo de ejecución , en lugar de eliminar páginas del caché de páginas del sistema , siempre que no se pueda satisfacer una solicitud de asignación de memoria desde la memoria libre. Swappiness se puede establecer en un valor de 0 a 200. [19] Un valor bajo hace que el kernel prefiera expulsar páginas del caché de páginas, mientras que un valor más alto hace que el kernel prefiera intercambiar páginas de memoria "frías". El valor predeterminado es 60
; establecerlo más alto puede causar una alta latencia si las páginas frías necesitan ser intercambiadas nuevamente (al interactuar con un programa que había estado inactivo, por ejemplo), mientras que establecerlo más bajo (incluso 0) puede causar una alta latencia cuando los archivos que habían sido expulsados del caché necesitan ser leídos nuevamente, pero hará que los programas interactivos respondan mejor, ya que será menos probable que necesiten intercambiar páginas frías. El intercambio también puede ralentizar aún más los HDD porque involucra muchas escrituras aleatorias, mientras que los SSD no tienen este problema. Sin duda, los valores predeterminados funcionan bien en la mayoría de las cargas de trabajo, pero los equipos de escritorio y los sistemas interactivos para cualquier tarea prevista pueden querer reducir la configuración, mientras que el procesamiento por lotes y los sistemas menos interactivos pueden querer aumentarla. [20]
Cuando la memoria del sistema es muy insuficiente para las tareas actuales y una gran parte de la actividad de la memoria pasa por un intercambio lento, el sistema puede llegar a ser prácticamente incapaz de ejecutar ninguna tarea, incluso si la CPU está inactiva. Cuando todos los procesos están esperando en el intercambio, se considera que el sistema está en estado de muerte de intercambio . [21] [22]
La muerte del intercambio puede ocurrir debido a una sobreasignación de memoria configurada incorrectamente . [23] [24] [25]
La descripción original del problema de "intercambio hasta la muerte" se relaciona con el servidor X. Si el código o los datos utilizados por el servidor X para responder a una pulsación de tecla no están en la memoria principal, entonces, si el usuario introduce una pulsación de tecla, el servidor tendrá uno o más fallos de página, lo que requerirá que esas páginas se lean desde el intercambio antes de que se pueda procesar la pulsación de tecla, lo que ralentiza la respuesta a la misma. Si esas páginas no permanecen en la memoria, tendrán que volver a introducirse fallos en ellas para gestionar la siguiente pulsación de tecla, lo que hará que el sistema prácticamente no responda incluso si en realidad está ejecutando otras tareas con normalidad. [26]
macOS utiliza varios archivos de intercambio. La instalación predeterminada (y recomendada por Apple) los coloca en la partición raíz, aunque es posible colocarlos en una partición o dispositivo independiente. [27]
AmigaOS 4.0 introdujo un nuevo sistema para asignar RAM y desfragmentar la memoria física. Todavía utiliza un espacio de direcciones compartido plano que no se puede desfragmentar. Se basa en el método de asignación de bloques y en la memoria de paginación que permite el intercambio. La paginación se implementó en AmigaOS 4.1, pero puede bloquear el sistema si se agota toda la memoria física. [28] La memoria de intercambio se puede activar y desactivar en cualquier momento, lo que permite al usuario elegir utilizar solo RAM física.
El almacenamiento de respaldo de un sistema operativo con memoria virtual suele ser mucho más lento que la RAM . Además, el uso de dispositivos de almacenamiento mecánicos genera un retraso de varios milisegundos en el caso de un disco duro. Por lo tanto, es conveniente reducir o eliminar el intercambio, siempre que sea posible. Algunos sistemas operativos ofrecen configuraciones para influir en las decisiones del núcleo.
/proc/sys/vm/swappiness
DisablePagingExecutive
configuración de registro, que controla si el código y los datos en modo kernel pueden ser elegibles para la paginación.Muchos sistemas operativos tipo Unix (por ejemplo, AIX , Linux y Solaris ) permiten utilizar múltiples dispositivos de almacenamiento para espacio de intercambio en paralelo, para aumentar el rendimiento.
En algunos sistemas operativos de memoria virtual más antiguos, el espacio en la memoria de respaldo de intercambio se reserva cuando los programas asignan memoria para datos de tiempo de ejecución. Los proveedores de sistemas operativos suelen emitir pautas sobre cuánto espacio de intercambio se debe asignar.
La paginación es una forma de permitir que el tamaño de las direcciones utilizadas por un proceso, que es el "espacio de direcciones virtuales" o "espacio de direcciones lógicas" del proceso, sea diferente de la cantidad de memoria principal realmente instalada en una computadora en particular, que es el espacio de direcciones físicas.
En la mayoría de los sistemas, el tamaño del espacio de direcciones virtuales de un proceso es mucho mayor que la memoria principal disponible. [31] Por ejemplo:
Una computadora con direccionamiento de n bits verdadero puede tener instaladas 2 n unidades direccionables de RAM. Un ejemplo es un procesador x86 de 32 bits con 4 GB y sin extensión de dirección física (PAE). En este caso, el procesador puede direccionar toda la RAM instalada y no más.
Sin embargo, incluso en este caso, la paginación se puede utilizar para admitir más memoria virtual que memoria física. Por ejemplo, pueden ejecutarse muchos programas simultáneamente. Juntos, pueden requerir más memoria física de la que se puede instalar en el sistema, pero no toda ella tendrá que estar en la RAM a la vez. Un sistema de paginación toma decisiones eficientes sobre qué memoria relegar al almacenamiento secundario, lo que conduce al mejor uso de la RAM instalada.
Además, el sistema operativo puede proporcionar servicios a programas que prevén una memoria más grande, como archivos que pueden crecer más allá del límite de la RAM instalada. No todo el archivo se puede mapear simultáneamente en el espacio de direcciones de un proceso, pero el sistema operativo puede permitir que se mapeen regiones del archivo en el espacio de direcciones y que se desasignen si es necesario mapear otra región.
Algunas computadoras tienen una memoria principal más grande que el espacio de direcciones virtuales de un proceso, como Magic-1, [31] algunas máquinas PDP-11 y algunos sistemas que usan procesadores x86 de 32 bits con extensión de dirección física . Esto anula una ventaja significativa de la paginación, ya que un solo proceso no puede usar más memoria principal que la cantidad de su espacio de direcciones virtuales. Dichos sistemas a menudo usan técnicas de paginación para obtener beneficios secundarios:
El tamaño del total acumulado de espacios de direcciones virtuales todavía está limitado por la cantidad de almacenamiento secundario disponible.