Comprender los conceptos de memoria implementados en Windows es una parte fundamental para evidenciar problemas de performance y actuar en consecuencia.

Muchas veces se suele confundir Memoria Física con el concepto de Memoria Virtual.

Memoria Física y Memoria Virtual

La Memoria Física (RAM) es manejada directamente por el Administrador de Memoria de Windows (Windows Memory Manager). Cada proceso tiene su propio espacio de memoria y sus propias direcciones privadas en memoria, las cuales solo pueden ser accedidas por el mismo proceso, la excepción es la de la memoria compartida (Shared Memory), la cual puede ser accedida por uno o varios procesos.

La Memoria Física se puede encontrar en 3 estados: Free, Reserved y Committed. En el estado Free la memoria está libre y no puede ser usada por los procesos, en estado Reserved la memoria se encuentra reservada para un proceso, y en estado Committed, la memoria que se reservada es usada por el proceso y por lo tanto es respaldada por memoria física. Para que la memoria vuelva a estar en estado libre, el proceso que la tiene reservada debe liberarla.

Parte de la Memoria Física, es también el archivo de paginación (page file) el cual va a estar ubicado por defecto en la unidad de disco del sistema. Este archivo (pagefile.sys), se utiliza como si fuera memoria del tipo RAM, de tal manera que si un proceso necesita espacio en memoria y no lo tiene, el Administrador de Memoria consigue ese espacio pasando datos que no están siendo utilizados al page file, y cuando estos datos se requieran nuevamente, se hará el proceso inverso, del page file a memoria (RAM).

Ahora bien, la Memoria Virtual es una técnica que permite a un proceso tener la impresión de que tiene un espacio de memoria que es contiguo, por lo tanto si existiese fragmentación, para el proceso es transparente. Podemos definir como Memoria Virtual utilizada, al conjunto de Memoria Física + Page file, dicha memoria siempre tiene un estado committed.

Para comprender mejor la Memoria Virtual, es conveniente verla en términos de Espacio de Direcciones Virtuales (VAS). A cada proceso se le asigna un espacio privado virtual de memoria también llamado Espacio de Direcciones Virtuales (Virtual Address Space, VAS). Este mecanismo previene que los procesos accedan espacios de memoria de otros procesos. Y es justamente VAS, un recurso de memoria que generalmente se pasa por alto cuando hay problemas de memoria.

VAS es un espacio lógico y virtual de memoria el cual es mapeado a la Memoria Física (no sólo RAM, sino también el page file) por el Sistema Operativo para hacer un mapa de direcciones de memoria. De esta manera se restringe el acceso directo a la Memoria Física, proporcionando un aislamiento a cada proceso.

VAS dependiendo de la tecnología

  • En 32 bits, VAS se encuentra limitado a 4Gb dividido en 2 regiones de 2Gb cada una: Modo Usuario y Modo Kernel.
  • En WoW (Windows on Windows), que implica el Sistema Operativo en 64-bits y la aplicación que ejecuta un proceso en 32-bits, el VAS es de 4Gb también, pero como el kernel es de 64-bits, no ocupa el mismo VAS que en 32-bits, por lo que los 4Gb quedan completamente para el Modo Usuario.
  • En 64-bits, VAS está limitado a 16Tb (terabytes), siendo 8Tb para el Modo Kernel y 8Tb para el Modo Usuario (7Tb en IA64).

Partes del VAS

  • El Modo Usuario es la porción de VAS que los procesos de las aplicaciones van a utilizar, mientras que el Modo Kernel, es la porción de VAS que el Sistema Operativo utiliza para correr DLLs, archivos de sistema y demás.
  • El VAS del Modo Kernel se divide en 4 partes: Paged Pool, Non-Paged Pool, PTEs y el espacio para el cache del sistema, drivers, kernel del Sistema Operativo, etc.

El Modo Kernel es una parte muy importante al momento de hacer un análisis de la performance de un servidor. Esto lo veremos en otro post, dedicado al Modo Kernel.

Modificadores de Memoria

Los modificadores de memoria una arquitectura de 32 bits son: 3GB, PAE y AWE.

Suele suceder que se confunda el uso de 3GB y PAE, si bien ambos se agregan en el archivo boot.ini (Windows 2003) o con el comando bcdedit (Windows 2008), se utilizan para diferentes propósitos:

  • 3GB se usa para modificar el tamaño del VAS del Modo Usuario, modificandolo a 3Gb en vez de 2Gb de tamaño, lo que implica que el VAS del modo kernel quedará con 1Gb de tamaño. En WoW no es necesario el uso de 3GB, ya que el Modo Usuario puede hacer uso de los 4Gb del VAS, puesto que el Modo Kernel en 64-bits usa un espacio de direcciones diferentes.
  • PAE se usa para permitirle al procesador el acceso a más Memoria Física, pudiendo direccionar una mayor cantidad de direcciones de memoria, haciendo que en vez de usar punteros de 32, use punteros de 36 bits. Lo cual permite superar el límite de 32 bits de 4Gb de Memoria Física (2^32=4.294.967.296 (4Gb)) y usar un límite de 36 bits el cual es de 64Gb de Memoria Física (2^36=68.719.476.736(64Gb)).
  • AWE se utiliza comúnmente en SQL para que este pueda acceder a más de 4Gb de Memoria Fisica, hasta 64Gb. La forma en que funciona AWE es a través de APIs al permitir asignar directamente páginas de memoria usando un mecanismo de ventanas a la memoria fisica. Para que este fincione correctamente se debe de habilitar el permiso de “Lock Pages in Memory” para la cuenta que corre el servicio de SQL.

Los Anteriores switches son solo relevantes en arquitecturas de 32 bits, con el uso de tecnologías de 64-bits dichos switches no son necesarios.

 

“Las opiniones e ideas expresadas en este blog son las de los Autores y no necesariamente declaran o reflejan la opinión de Microsoft”