Una página, página dememoria o página virtual es un bloque contiguo de memoria virtual de longitud fija, descrito por una sola entrada en la tabla de paginación. Es la unidad de datos más pequeña para la administración de memoria en un sistema operativo de 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 las páginas de memoria.[1][2][3]
Una transferencia de páginas entre la memoria principal y un almacenamiento auxiliar, tal como una unidad de disco duro, se denomina paginación o intercambio.[4]
Intercambio de tamaño de página
El tamaño de la página suele estar determinado por la arquitectura del procesador. Tradicionalmente, las páginas en un sistema tenían un tamaño uniforme, por ejemplo, 384987247 bytes. Sin embargo, los diseños de procesadores a menudo permiten dos o más tamaños de página, a veces simultáneos, debido a sus beneficios. Hay varios puntos que pueden influir en la elección del mejor tamaño de página.[5]
Tamaño de la página versus tamaño de la tabla de paginación
Un sistema con un tamaño de paginación más pequeño usa más páginas, lo que requiere una tabla de paginación que ocupa más espacio. Por ejemplo, si un espacio de direcciones virtuales 2 32 se asigna a 4 KiB (2 12 bytes) páginas, el número de páginas virtuales es 2 20 = (2 32 / 2 12 ). Sin embargo, si el tamaño de la página se incrementa a 32 KiB (2 15 bytes), solo se requieren 2 17 páginas. Un algoritmo de paginación multinivel puede disminuir el costo de memoria de asignar una tabla de páginas grande para cada proceso al dividir la tabla de páginas en tablas más pequeñas, paginando efectivamente la tabla de páginas.
Tamaño de página versus uso de TLB
Dado que cada acceso a la memoria debe asignarse desde la dirección virtual a la física, leer la tabla de paginación de a una, puede ser bastante costoso. Por lo tanto, a menudo se usa un tipo de caché muy rápido, el Translation Lookaside Buffer (TLB).[6] El TLB tiene un tamaño limitado, y cuando no puede satisfacer una solicitud determinada (un fallo de TLB ), las tablas de paginación deben buscarse manualmente (ya sea en hardware o software, según la arquitectura) para la asignación correcta. Los tamaños de página más grandes significan que un caché de TLB del mismo tamaño puede realizar un seguimiento de grandes cantidades de memoria, lo que evita los costosos errores de TLB.
Fragmentación interna de páginas.
Rara vez los procesos requieren el uso de un número exacto de páginas. Como resultado, es probable que la última página solo esté parcialmente llena, desperdiciando cierta cantidad de memoria. Los tamaños de página más grandes conducen a una gran cantidad de memoria desperdiciada, ya que en la memoria principal se cargan porciones de memoria potencialmente no utilizadas. Los tamaños de página más pequeños aseguran una mayor coincidencia con la cantidad real de memoria requerida en una asignación.
Como ejemplo, supongamos que el tamaño de la página es 1024 KiB. Si un proceso asigna 1025 KiB, se deben usar dos páginas, resultando en 1023 KiB de espacio no utilizado (donde una página consume 1024 KiB y el otro solo 1 KiB).
Tamaño de página versus acceso al disco
Cuando se transfiere desde un disco rotativo, gran parte del retraso se debe al tiempo de búsqueda, el tiempo que lleva colocar correctamente las cabezas de lectura / escritura por encima de los discos. Debido a esto, las transferencias secuenciales grandes son más eficientes que varias transferencias más pequeñas. La transferencia de la misma cantidad de datos del disco a la memoria a menudo requiere menos tiempo con páginas más grandes que con páginas más pequeñas.
Determinación del tamaño de página en un programa.
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.
#include<stdio.h>#include<unistd.h> /* sysconf(3) */intmain(void){printf("The page size for this system is %ld bytes.\n",sysconf(_SC_PAGESIZE));/* _SC_PAGE_SIZE is OK too. */return0;}
En muchos sistemas Unix, se puede usar la utilidad de línea de comandos getconf .[12][13][14] Por ejemplo, getconf PAGESIZE devolverá el tamaño de la página en bytes.
Sistemas operativos basados en Windows
Los sistemas operativos basados en Win32 , como los de las familias Windows 9x y Windows NT , pueden usar la función del sistema GetSystemInfo()[15][16] de kernel32.dll .
#include<stdio.h>#include<windows.h>intmain(void){SYSTEM_INFOsi;GetSystemInfo(&si);printf("The page size for this system is %u bytes.\n",si.dwPageSize);return0;}
Tamaños de página múltiple
Algunas arquitecturas de conjuntos de instrucciones pueden admitir tamaños de página múltiples, 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. No todos los procesadores implementan todos los tamaños de página más grandes definidos. Este soporte para páginas más grandes (conocidas como páginas grandes en Linux, súper páginas en FreeBSD y páginas grandes en la terminología de Microsoft Windows ) permite «lo mejor de ambos mundos», reduciendo la presión sobre el caché TLB (a veces incrementando la velocidad hasta en 15%, dependiendo de la aplicación y el tamaño de la asignación) para asignaciones grandes, mientras se mantiene el uso de la memoria en un nivel razonable para asignaciones pequeñas.[6]