# data[].attributes.body
Cuando hablamos de memoria virtual, no estamos hablando de un módulo de RAM que podamos visualizar entre las piezas de nuestra computadora, sino que hablamos de una técnica de gestión de la memoria que permite que el sistema operativo disponga, tanto para el software del usuario como para sí mismo, de mayor cantidad de memoria que esté disponible físicamente, la mayoría de las computadoras tiene 4 tipos de memorias: registros en la C.P.U, La Memoria Cache (tanto dentro como fuera de C.P.U), La memoria RAM y el disco duro.

De esta forma el usuario ya no debe preocuparse por las limitaciones de memoria física. Cada proceso tiene su propio espacio de direccionamiento virtual (o lógico) y La MMU es la encargada de mapear las direcciones virtuales (o lógicas) a físicas.

# data[].attributes.body
La memoria virtual surgió como uno de estos métodos de ahorro y descarga, permitiéndonos hacer más en equipos con poca memoria disponible, sin necesidad de adquirir más unidades de memoria adicionales. Generalmente caras en el pasado. Era una medida muy útil en casos de necesidad, o para llevar a cabo trabajos que no podríamos hacer en un equipo con cierta cantidad de memoria.

Debido a su utilidad, es una función que seguimos viendo aún hoy en sistemas operativos modernos, aunque con el tamaño de cantidad de memoria que manejan los equipos modernos y la facilidad de adquirir hoy en día más RAM debido a su bajo precio a comparación de antes, no solemos requerir de la ayuda de la memoria virtual para agilizar la capacidad del equipo.

# data[].attributes.body
La implementación de memoria virtual es realizada a través de la técnica de paginación bajo demanda. En la paginación bajo demanda los procesos residen en un dispositivo de disco y son puestos en memoria principal cuando es necesario cargarlos para ejecutar. La carga del proceso en memoria no es total, sino que implementa un cargador “perezoso” (lazy swapper), que cargará las páginas según se vayan necesitando.

Utilizar un esquema de este tipo requiere el conocimiento de las páginas que están activas en memoria. Para ello se utiliza el valid-invalid bit, que consiste en agregar a la tabla de páginas un nuevo campo (bit de validez), que indique para cada entrada, si la página se encuentra o no en memoria. Al inicio, la tabla de páginas indicará que ninguna página está en memoria (todos los bits de validez se encontrarán en i (invalid)).

# data[].attributes.attachment_link.title
2021-10-04 15_09_47-Microsoft Word - Memoria virtual.doc - Brave

# data[].attributes.body
La memoria cargada en memoria principal se le denomina memoria residente. El acceso a memoria residente por parte de un proceso es tomado como un acceso normal, pero el acceso a memoria no residente genera un fallo de página. El fallo de página genera un trap a nivel del sistema operativo, que activa una rutina de atención que carga la página en memoria principal.

# data[].attributes.body
El acceso a memoria genera la siguiente secuencia de pasos:

Verificar que el proceso referencia una página correcta dentro de su espacio virtual, ya que no todas las direcciones dentro de su espacio son válidas. Por ejemplo, el acceso fuera de un arreglo puede generar un acceso a una página virtual que no fue asignada al proceso. Si el proceso referencia a una página incorrecta, se genera un error y el proceso termina.

Si el acceso fue correcto, se busca en la tabla de páginas el frame correspondiente, verificando el bit de validez-invalidez.

Si el bit es de validez se accede al frame correspondiente y se termina el acceso.

Sino se genera el trap de page fault, que involucra los siguientes pasos:

Se busca frame libre en memoria principal, si no hay se ejecuta el algoritmo de reemplazo.

. Se lee de disco la página a cargar, y se carga en el frame obtenido en el paso anterior.

Se actualiza la tabla de páginas, indicando que la página está disponible en memoria principal.

Se devuelve el control a la instrucción que fue interrumpida por el PF.

Si se aplica este método se tendrá un sistema puro de paginación bajo demanda. Tener en cuenta que para poder llevarlo a cabo se precisa una tabla de páginas y espacio swap de disco.

# data[].attributes.body
La necesidad de traer a memoria principal una página en una memoria principal llena, genera la búsqueda de un frame a remplazar, mediante un algoritmo de remplazo. El mal algoritmo de remplazo puede generar un impacto significativo de degradación del sistema, y es por esto que los estudiaremos.

Cuando se elige un frame a remplazar (la víctima), este será puesto en memoria swap, y ante un eventual uso en el futuro, volverá a memoria principal a través de un page fault. Los pasos a seguir cuando remplazamos frames son los siguientes:

Elegir la víctima mediante algún algoritmo de remplazo

Escribir la víctima en memoria swap (swap out) y ajustar la tabla de páginas

Cargar la página en el frame correspondiente (swap in)

Ajustar la tabla de página

# data[].attributes.attachment_link.title
2021-10-04 15_16_24-Microsoft Word - Memoria virtual.doc - Brave

# data[].attributes.headline
5_  Asignación de frames a procesos e hiperpaginación

# data[].attributes.subject
5_  Asignación de frames a procesos e hiperpaginación

# data[].attributes.body
Si el SO no implementa una estrategia de asignación de memoria, un proceso que requiera mucha memoria puede hacer colapsar el sistema.

Una forma de asignar frames a procesos podría ser dividir la cantidad de frames del sistema en partes iguales para cada proceso. Este método puede ser ineficiente ya que no todos los procesos consumen la misma cantidad de memoria.

Si un proceso utiliza en forma activa una cantidad mayor de frames de los asignados por el sistema, tendrá un alto porcentaje de fallos de página, dando lugar a que el proceso esté continuamente realizando PF, pasando mas tiempo paginando que ejecutando, lo que se conoce como hiperpaginación. Se degrada significativamente el rendimiento del sistema.

# data[].attributes.headline
Los problemas que surgen al implementarlo

# data[].attributes.subject
Los problemas que surgen al implementarlo

# data[].attributes.body
Aunque la integración de la memoria virtual en nuestro equipo es completa, y el sistema trata a este espacio adicional como memoria adicional; la velocidad que alcanzan nuestros sistemas de almacenamiento, así como la latencia de estas, no puede equipararse a la de una memoria preparada como la memoria RAM.

Los equipos que requieran el acceso a información ubicada en la memoria virtual porque el resto de memoria del sistema esté en uso se verán afectados por este hecho; siendo más lentos a la hora de tratar estos datos que en un equipo que disponga de más espacio “físico” en su memoria.

Por más rápidos que sean los almacenamientos SSD Nvme m.2 Pcie 4.0 de la actualidad o los futuros Pcie 5.0, no podrán igualar la velocidad de la memoria RAM

# data[].attributes.headline
Algunos de los algoritmos que se utilizan

# data[].attributes.subject
Algunos de los algoritmos que se utilizan

# data[].attributes.body
FIFO (First in First out)

Segunda Chance

Óptimo

LRU (Least Recently Used – recientemente menos usada)

NRU (No Recientemente Usada)