Duda sobre Teorico de Memoria Virtual

Duda sobre Teorico de Memoria Virtual

de Martin Pacheco -
Número de respuestas: 1

Entendí que cuando se usa memoria virtual, no se carga todo el proceso a memoria pero hay ciertos detalles particulales que quisiera entender mejor.


Cuando un proceso es cargado, se hace una carga "perezosa" que solo carga a memoria lo que se necesite del proceso al momento de la carga.

Luego a medida si el proceso necesita paginas que aun no estan cargadas, se va a dar cuenta porque al intentar acceder a una página, se va a dar una trap a causa de tene el valid bit seteado a invalido, y se va a realizar la carga de esa página.


Mi duda es: Cual es la diferencia entre que la página no haya sido cargada nunca desde el archivo ejecutable a memoria, o que la página si haya sido cargado pero ahora esté en el swap? Cambia el bit de validez en alguno de los dos casos o en ambos está como invalido?


O la otra interpetacion posible que le puedo dar al asunto (y no se si esta bien) es que en realidad lo que dijé arriba en negrita no es así y cuando se carga el proceso, SI solo se carga a memoria lo que se necesite, pero las demas páginas van a swap?


Es algo que no me termina de cerrar respecto a esta parte del teórico.

En respuesta a Martin Pacheco

Re: Duda sobre Teorico de Memoria Virtual

de Gustavo Brown -

Sobre "Cuando un proceso es cargado, se hace una carga "perezosa" que solo carga a memoria lo que se necesite del proceso al momento de la carga."

eso es técnicamente correcto. La cuestión es definir ahora qué quiere decir "lo que se necesite".

El sistema operativo puede decidir cargar algunas páginas (las que va a necesitar para iniciar o continuar la ejecucion), pero también puede decidir no cargar absolutamente nada y que se generen fallos de página hasta que las páginas que se precisan se hayan cargado. Esto último es la denominada "paginación bajo demanda pura".

Lo importante es que el SO debe implementar una rutina de atención al fallo de página para cuando la MMU genera la trap porque la página que se quiere acceder no está mapeada a memoria fisica. 

Esta rutina debe chequear si la página es válida en el sentido de que forma parte del espacio virtual del proceso. Si no forma parte es un acceso erróneo y normalmente mataría al proceso.

Si la página es válida pero no esta cargada en memoria física (esto lo sabe porque si bien tiene el bit de válido/inválido en inválido, la información de la entrada en la tabla de páginas indica que en realidad lo que pasa es que está en disco) entonces tiene que traerla del disco. La ubicación de la página en el disco puede estar o bien en el Backing store (espacio de swap del disco) o bien en algún archivo que forme parte del programa (por ejemplo el ejecutable o una biblioteca). La información en la entrada de la tabla de páginas asociada a la página en cuestión le dice al SO de dónde obtener la página.

O sea, no importa si la página esta en espacio de swap o en un archivo, si la página no está en memoria residente (marco) entonces el bit de válido/inválido va a indicar que es inválido. De esa manera la MMU puede generar la trap cuando se intente acceder a dicha página.

Si se trata de memoria privada del proceso (por ejemplo el heap o el stack), entonces va a estar siempre en el espacio de swap (porque es la única copia de la página).

Si se trata de parte del código entonces puede estar en el espacio de swap o en el ejecutable. El SO puede decidir mantener una copia de las páginas "ejecutables" en el swap o directamente obtenerlas del propio archivo ejecutable.

Saludos,
  Gustavo