Página de memoria

La traducción de memoria paginada toma la dirección lógica y por medio de la tabla de página se obtiene la dirección física real.

Una página, página de memoria 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.

Sistemas operativos basados en Unix y POSIX

Los sistemas basados en Unix y POSIX pueden usar 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("The page size for this system is %ld bytes.\n",
	       sysconf(_SC_PAGESIZE)); /* _SC_PAGE_SIZE is OK too. */
	return 0;
}

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>

int main(void) {
	SYSTEM_INFO si;
	GetSystemInfo(&si);
	printf("The page size for this system is %u bytes.\n", si.dwPageSize);
	return 0;
}

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]

Tamaños de página según las arquitecturas[17]
Arquitectura Tamaño de página más pequeño Tamaños de página más grandes
X86 de 32 bits[18] 4   KiB 4   MiB en modo PSE, 2   MiB en modo PAE[19]
x86-64[18] 4   KiB 2   MiB, 1   GiB (solo cuando la CPU tiene el indicador PDPE1GB )
IA-64 ( Itanio )[20] 4   KiB 8   KiB, 64   KiB, 256   KiB, 1   Mib, 4   MiB, 16   MiB, 256   MiB[19]
Arquitectura de poder[21] 4   KiB 64   KiB, 16   MiB, 16   Gibraltar
SPARC v8 con MMU de referencia SPARC[22] 4   KiB 256   KiB, 16   MiB
Arquitectura UltraSPARC 2007[23] 8   KiB 64   KiB, 512   KiB (opcional), 4   MiB, 32   MiB (opcional), 256   MiB (opcional), 2   GiB (opcional), 16   GiB (opcional)
ARMv7[24] 4   KiB 64   KiB, 1   MiB ("sección"), 16   MiB ("supersección") (definido por una implementación particular)

Véase también

Referencias

  1. Christopher Kruegel (3 de diciembre de 2012). «Operating Systems (CS170-08 course)» (PDF). cs.ucsb.edu. Archivado desde el original el 10 de agosto de 2016. Consultado el 13 de junio de 2016. 
  2. Martin C. Rinard (22 de agosto de 1998). «Operating Systems Lecture Notes, Lecture 9. Introduction to Paging». people.csail.mit.edu. Archivado desde el original el 1 de junio de 2016. Consultado el 13 de junio de 2016. 
  3. «Virtual Memory: pages and page frames». cs.miami.edu. 31 de octubre de 2012. Archivado desde el original el 11 de junio de 2016. Consultado el 13 de junio de 2016. 
  4. Belzer, Jack; Holzman; Kent, eds. (1981), «Virtual memory systems», Encyclopedia of computer science and technology 14, CRC Press, p. 32, ISBN 0-8247-2214-0 .
  5. Using 4KB Page Size for Virtual Memory is Obsolete. IEEE. 10 de agosto de 2009. 
  6. a b
    " Una encuesta de técnicas para la arquitectura de TLB ", concurrencia y computación: práctica y experiencia, 2016.
  7. limits.h – Definiciones base Referencia, Single Unix Specification, Issue 7 de The Open Group
  8. sysconf – Interfaces Referencia, Single Unix Specification, Issue 7 de The Open Group
  9. sysconf(3) – Funciones de bibliotecas en el manual de Linux (en inglés)
  10. sysconf(3) – Funciones de biblioteca en el manual de Darwin BSD y Mac OS X (en inglés)
  11. sysconf(3C) – Funciones de biblioteca básicas en el manual de Solaris 10 (en inglés)
  12. getconf – Comandos y utilidades Referencia, Single Unix Specification, Issue 7 de The Open Group
  13. getconf(1) – Comandos de usuario en el manual de Linux (en inglés)
  14. getconf(1) – Comandos generales en el manual de Darwin BSD y Mac OS X (en inglés)
  15. «GetSystemInfo function». Microsoft. 
  16. «SYSTEM_INFO structure». Microsoft. 
  17. «Hugepages - Debian Wiki». Wiki.debian.org. 21 de junio de 2011. Consultado el 6 de febrero de 2014. 
  18. a b «Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide». December 2016. 
  19. a b «Documentation/vm/hugetlbpage.txt». Linux kernel documentation. kernel.org. Consultado el 6 de febrero de 2014. 
  20. «Intel Itanium Architecture Software Developer’s Manual Volume 2: System Architecture». May 2010. 
  21. IBM Power Systems Performance Guide: Implementing and Optimizing. IBM Redbooks. February 2013. Consultado el 17 de marzo de 2014. 
  22. «The SPARC Architecture Manual, Version 8». 1992. 
  23. «UltraSPARC Architecture 2007». 27 de septiembre de 2010. 
  24. «ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition». 20 de mayo de 2014. 

Bibliografía