Una página , página de memoria o página virtual es un bloque contiguo de memoria virtual de longitud fija , descrito por una única entrada en una tabla de páginas . Es la unidad de datos más pequeña para la gestión de memoria en un sistema operativo que utiliza memoria virtual. De manera similar, un marco de página es el bloque contiguo de memoria física de longitud fija más pequeño en el que el sistema operativo asigna páginas de memoria. [1] [2] [3]
La transferencia de páginas entre la memoria principal y un almacenamiento auxiliar, como una unidad de disco duro , se denomina paginación o intercambio. [4]
La memoria de la computadora está dividida en páginas para que la información se pueda encontrar más rápidamente.
El concepto recibe su nombre por analogía con las páginas de un libro impreso. Si un lector quisiera encontrar, por ejemplo, la palabra número 5000 del libro, podría contar desde la primera palabra. Esto llevaría mucho tiempo. Sería mucho más rápido si el lector tuviera una lista de cuántas palabras hay en cada página. A partir de esta lista, podría determinar en qué página aparece la palabra número 5000 y cuántas palabras contar en esa página. Esta lista de palabras por página del libro es análoga a una tabla de páginas de un sistema de archivos de computadora . [5]
El tamaño de página suele estar determinado por la arquitectura del procesador. Tradicionalmente, las páginas de un sistema tenían un tamaño uniforme, como 4096 bytes . Sin embargo, los diseños de procesadores suelen permitir dos o más tamaños de página, a veces simultáneos, debido a sus ventajas. Hay varios puntos que pueden influir en la elección del mejor tamaño de página. [6]
Un sistema con un tamaño de página más pequeño utiliza más páginas, lo que requiere una tabla de páginas que ocupe más espacio. Por ejemplo, si un espacio de dirección virtual de 2 32 se asigna a páginas de 4 KiB (2 12 bytes), la cantidad de páginas virtuales es 2 20 = (2 32 / 2 12 ). Sin embargo, si el tamaño de página se incrementa a 32 KiB (2 15 bytes), solo se requieren 2 17 páginas. Un algoritmo de paginación de varios niveles puede reducir el costo de memoria de asignar una tabla de páginas grande para cada proceso al dividir aún más la tabla de páginas en tablas más pequeñas, lo que pagina efectivamente la tabla de páginas.
Dado que cada acceso a la memoria debe asignarse de una dirección virtual a una física, leer la tabla de páginas cada vez puede resultar bastante costoso. Por lo tanto, a menudo se utiliza un tipo de caché muy rápido, el búfer de traducción de búsqueda lateral (TLB). El TLB tiene un tamaño limitado y, cuando no puede satisfacer una solicitud determinada (un error de TLB ), se deben buscar las tablas de páginas manualmente (ya sea en hardware o software, según la arquitectura) para obtener el mapeo correcto. Los tamaños de página más grandes significan que un caché TLB del mismo tamaño puede realizar un seguimiento de mayores cantidades de memoria, lo que evita los costosos errores de TLB.
En raras ocasiones, los procesos requieren el uso de una cantidad exacta de páginas. Como resultado, es probable que la última página solo esté parcialmente llena, lo que desperdiciará cierta cantidad de memoria. Los tamaños de página más grandes generan una gran cantidad de memoria desperdiciada, ya que se cargan más porciones de memoria potencialmente no utilizadas en la memoria principal. Los tamaños de página más pequeños garantizan una coincidencia más cercana con la cantidad real de memoria requerida en una asignación.
A modo de ejemplo, supongamos que el tamaño de la página es 1024 B. Si un proceso asigna 1025 B, se deben utilizar dos páginas, lo que da como resultado 1023 B de espacio sin utilizar (donde una página consume completamente 1024 B y la otra solo 1 B).
Al transferir desde un disco giratorio, gran parte del retraso se debe al tiempo de búsqueda, el tiempo que lleva posicionar correctamente los cabezales de lectura/escritura sobre los platos del disco. Por este motivo, las transferencias secuenciales de gran tamaño son más eficientes que varias transferencias más pequeñas. Transferir la misma cantidad de datos desde el disco a la memoria suele requerir menos tiempo con páginas más grandes que con páginas más pequeñas.
La mayoría de los sistemas operativos permiten que los programas descubran el tamaño de la página en tiempo de ejecución . Esto permite que los programas utilicen la memoria de manera más eficiente al alinear las asignaciones a este tamaño y reducir la fragmentación interna general de las páginas.
Los sistemas basados en Unix y POSIX pueden utilizar la función del sistema sysconf()
, [7] [8] [9] [10] [11] como se ilustra en el siguiente ejemplo escrito en el lenguaje de programación C.
#include <stdio.h> #include <unistd.h> /* sysconf(3) */ int main ( void ) { printf ( "El tamaño de página para este sistema es %ld bytes. \n " , sysconf ( _SC_PAGESIZE )); /* _SC_PAGE_SIZE también está bien. */ devuelve 0 ; }
getconf
En muchos sistemas Unix, se puede utilizar la utilidad de línea de comandos . [12] [13] [14]
Por ejemplo, getconf PAGESIZE
devolverá el tamaño de la página en bytes.
Los sistemas operativos basados en Win32 , como los de las familias Windows 9x y Windows NT , pueden utilizar la función del sistema GetSystemInfo()
[15] [16] de kernel32.dll
.
#include <stdio.h> #include <windows.h> int main ( void ) { SYSTEM_INFO si ; GetSystemInfo ( & si ); printf ( "El tamaño de página para este sistema es %u bytes. \n " , si . dwPageSize ); devuelve 0 ; }
Algunas arquitecturas de conjuntos de instrucciones pueden admitir varios tamaños de página, incluidas páginas significativamente más grandes que el tamaño de página estándar. Los tamaños de página disponibles dependen de la arquitectura del conjunto de instrucciones, el tipo de procesador y el modo operativo (direccionamiento). El sistema operativo selecciona uno o más tamaños de los tamaños admitidos por la arquitectura. Tenga en cuenta que no todos los procesadores implementan todos los tamaños de página más grandes definidos. Esta compatibilidad con páginas más grandes (conocidas como "páginas enormes" en Linux , "superpáginas" en FreeBSD y "páginas grandes" en la terminología de Microsoft Windows e IBM AIX ) permite "lo mejor de ambos mundos", reduciendo la presión sobre la caché TLB (a veces aumentando la velocidad hasta en un 15 %) para asignaciones grandes mientras se mantiene el uso de memoria a un nivel razonable para asignaciones pequeñas.
A partir del Pentium Pro y el AMD Athlon , los procesadores x86 admiten páginas de 4 MiB (llamadas Page Size Extension ) (páginas de 2 MiB si se usa PAE ) además de sus páginas estándar de 4 KiB; los procesadores x86-64 más nuevos , como los procesadores AMD64 más nuevos de AMD y los procesadores Westmere [27] y Xeon posteriores de Intel pueden usar páginas de 1 GiB en modo largo . IA-64 admite hasta ocho tamaños de página diferentes, desde 4 KiB hasta 256 MiB, y algunas otras arquitecturas tienen características similares. [ especificar ]
Las páginas más grandes, a pesar de estar disponibles en los procesadores que se utilizan en la mayoría de las computadoras personales contemporáneas , no son de uso común excepto en aplicaciones a gran escala, las aplicaciones que se encuentran típicamente en servidores grandes y en clústeres computacionales , y en el propio sistema operativo. Comúnmente, su uso requiere privilegios elevados, cooperación de la aplicación que realiza la asignación grande (generalmente estableciendo un indicador para solicitar al sistema operativo páginas grandes) o configuración manual del administrador; los sistemas operativos comúnmente, a veces por diseño, no pueden paginarlas al disco.
Sin embargo, SGI IRIX tiene soporte de propósito general para múltiples tamaños de página. Cada proceso individual puede proporcionar sugerencias y el sistema operativo usará automáticamente el tamaño de página más grande posible para una región dada del espacio de direcciones. [28] Trabajos posteriores propusieron soporte transparente del sistema operativo para usar una mezcla de tamaños de página para aplicaciones no modificadas a través de reservas preemptivas, promociones oportunistas, degradaciones especulativas y control de fragmentación. [29]
Linux ha soportado páginas enormes en varias arquitecturas desde la serie 2.6 a través del hugetlbfs
sistema de archivos [30] y sin él hugetlbfs
desde la versión 2.6.38. [31] Windows Server 2003 (SP1 y posteriores), Windows Vista y Windows Server 2008 soportan páginas enormes bajo el nombre de páginas grandes. [32] Windows 2000 y Windows XP soportan páginas grandes internamente, pero no las exponen a las aplicaciones. [33] Reservar páginas grandes en Windows requiere un derecho correspondiente que el administrador del sistema debe conceder al usuario porque las páginas grandes no se pueden intercambiar en Windows. A partir de la versión 9, Solaris soporta páginas grandes en SPARC y x86. [34] [35]
FreeBSD 7.2-RELEASE cuenta con superpáginas. [36] Nótese que hasta hace poco en Linux, las aplicaciones necesitaban ser modificadas para poder usar páginas enormes. El núcleo 2.6.38 introdujo soporte para el uso transparente de páginas enormes. [31] En los núcleos Linux que admiten páginas enormes transparentes, así como FreeBSD y Solaris , las aplicaciones aprovechan las páginas enormes automáticamente, sin necesidad de modificaciones. [36]
[…] La ROM se divide en páginas, cada una de las cuales contiene 256 bytes. Por lo tanto, las ubicaciones 0 a 255 comprenden la página 0 de la ROM, las ubicaciones 256 a 511 comprenden la página 1, y así sucesivamente. […] La memoria de acceso aleatorio de programa (RAM) está organizada exactamente como la ROM. […]