lunes, 31 de octubre de 2011

Gestión de memoria Linux Windows

Linux

Memoria Virtual
Direccionamiento de la memoria virtual: Linux utiliza una tabla de página de 3 niveles, cada tabla en particular tiene el tamaño de una página:
  • Directorio de páginas: Los procesos activos tienen un directorio de páginas único que tiene el tamaño de página. El directorio de páginas debe recidir en la memoria principal para todo proceso activo.
  • Directorio intermedio de páginas: Este directorio se expande a múltiples páginas. Cada entrada en la tabla de páginas apunta a una página que contiene una tabla de páginas.
  • Tabla de páginas: Cada entrada en la tabla hace referencia a una página virtual del proceso.
Algoritmo de reemplazo de páginas
Linux se basa en el algoritmo de Reloj, como ya expliqué este algoritmo consiste en asociar un bit de usado y otro de modificado con cada una de las páginas de memoria principal. En Linux el usado se reemplaza por una variable de 8 bits. Cada vez que se accede a la página la variable se incrementa. Después Linux recorre periódicamente la lista completa de páginas y decrementa la variable de edad de cada página a medida que va rotando por todas ellas en memoria principal. Una página que tiene un 0 es una "página vieja" es decir no se ha hecho referencia a ella desde hace ya algún tiempo y es el mejor candidato para el reemplazo. Cuando el valor de edad es más alto, la frecuencia con la que se ha accedido a la página recientemente es mayor y por lo tanto tiene un a posibilidad menor de elegirse para el reemplazo. Este algoritmo es una variante de la política LRU.

Reserva de memoria del núcleo
La gestión de memoria del núcleo se realiza en base a los marcos de página de la memoria principal. Su función básica es asignar y liberar marcos para los distintos usos.
Los fundamentos de la reserva de memoria en Linux son los mecánismos de reservas de páginas ya usados para le gestión de memoria virtual de usuario. Como se utiliza el algoritmo buddy, se puede reservar y liberar unidades de una o más páginas. Debido a que el tamaño mínimo de memoria que se puede reservar es de una página, la reserva de páginas no sería muy adecuada ya que el núcleo requiere pequeños fragmentos que se utilizarán por poco tiempo y que son de distintos tamaños. Es poreso que Linux utiliza un esquema conocido como "asignación de láminas". En una máquina Pentium/x64, el tamaño de página es de 4 Kbytes y los fragmentos dentro de una página se pueden asignar en tamaños de 32, 64, 128, 252, 508, 2040 y 4080 bytes.



Windows

El gestor de memoria esta diseñado para trabajar con páginas que van desde los 4 Kbytes hasta 64Kbytes. Las plataformas Intel, PowerPC, y MIPS tienen 4096 bytes por página y las plataformas DEC Alpha tienen 8192 bytes por página.

Mapa de direcciones virtuales en Windows
Los procesos de usuario en Windows puede ver un espacio de direcciones independientemente de 32 bits, permitiendo 4Gbytes de memoria por proceso. Por defecto una parte de esta memoria se reserva para el SO de manera que cada usuario dispone de 2Gbytes de espacio de direcciones posibles y todos los procesos lo comparten.
Se puede modificar esto restringiendo al SO a solo 1Gbyte y 3Gbytes para el usuario, esto viene explicado en la documentación de Windows.
Espacio de direcciones en Windows:
  • 0x00000000 a 0x0000FFFF reservada para ayudar a los programadores a capturar asignaciones de punteros Nulos.
  • 0x00010000 a 0x7FFEFFFF espacio de direcciones disponible para el usuario. Este espacio de encuentra dividido en páginas que se pueden cargar a la memoria principal.
  • 0x7FFF0000 a 0x7FFFFFFF una página de guarda, no accesible para el usuario. Lo que hace es verificar referencias a punteros fuera del rango.
  • 0x80000000 a 0xFFFFFFFF espacio de direcciones del sistema. Esta área es de 2Gbytes se utiliza por parte del ejecutivo de Windows, el micronúcleo y los manejadores de dispositivos.

Paginación
Cuando se crea un proceso, puede, en principio utilizar todo el espacio de usuario de 2Gbytes(menos 128 Kbytes). Este espacio se encuentra dividido en páginas de tamaño fijo, cualquiera de las cuales se puede cargar en la memoria principal. Estados de las páginas:
  • Disponible: Páginas que no están actualmente usadas por este proceso.
  • Reservada: Conjunto de páginas contiguas que el gestor de memoria virtual separa para un proceso pero que no se cuentan para la cuota
  • Asignada: Las páginas para las cuales el gestor de la memoria virtual ha reservado espacio en el fichero de paginación.
La distinción entre memoria reservada y asignada es muy útil debido a que minimiza la cantidad de espacio de disco que debe guardarse para un proceso en particular, manteniendo espacio libre en disco para otros procesos; y permite que un hilo o un proceso declare una petición de una cantidad de memoria que puede proporcionarse rápidamente si se necesita.

En Windows cuando se activa un proceso por primera vez se le asigna un cierto numero de marcos de página de la memoria principal como conjunto de trabajo. Cuando un proceso hace referencia ha un proceso que no esta en memoria principal, una de las páginas de dicho proceso se expulsa, y se trae la nueva página.
Cuando hay espacio disponible en la memoria, el gestor de memoria virtual permite que los conjuntos residentes de los procesos activos crezcan. Entonces se trae una nueva página a la memoria sin expulsar ninguna.
Cuando la memoria empieza a escasear, el gestor de memoria virtual mueve las páginas que se han utilizado hace más tiempo de cada uno de los procesos hacia swap, liberando así memoria principal.

Referencias
William Stallings (2005). Sistemas Operativos. España: Pearson. 384-388

6 comentarios:

  1. Cecy, disculpa, a que version de Linux y Windows se refiere el libro de Stallings?

    ResponderEliminar
  2. Cuiden los acentos. En la entrada de Roberto también faltaban algunos. David: este tipo de funciones típicamente no se cambian mucho de una versión a otra, aunque de vez en cuando sí hay grandes cambios de arquitectura.
    Esta entrada también entra en "Estudios sobre el desempeño de memoria virtual" y otorga un punto en ese rubro.

    ResponderEliminar
  3. Si normalmente no hay grandes cambios hasta que la arquitectura del hardware lo motive, como por ejemplo, el cambio de 32 a 64 bits.

    ResponderEliminar
  4. hola escribi un programa en c++ y al ejecutarlo en Linux la direccion de memoria es diferente a la de windows que es esta 000000000062FE44 es este otro formato hexadecimal o octal?

    ResponderEliminar