Entiendo que la memoria virtual engaña al programa al mostrar más memoria de la que está realmente disponible.
Pero en última instancia, tiene que asignar la dirección lógica a la dirección física real. Ahora, ¿cómo está aumentando la memoria?
Entiendo que la memoria virtual engaña al programa al mostrar más memoria de la que está realmente disponible.
Pero en última instancia, tiene que asignar la dirección lógica a la dirección física real. Ahora, ¿cómo está aumentando la memoria?
Respuestas:
No está aumentando la memoria física en absoluto. Su propósito es algo completamente diferente. Lo que puede hacer es poner a disposición otras tiendas de respaldo que permitan a los programas usar más memoria de la que está físicamente disponible.
La memoria virtual se utiliza para separar y aislar procesos entre sí y también permite que el acceso a la memoria se desvíe a ubicaciones alternativas.
La memoria virtual permite que el sistema dé a cada proceso su propio espacio de memoria aislado de otros procesos. Con programas que operan efectivamente en su propio espacio, les da acceso completo al espacio de direcciones completo en lugar de tener que trabajar con otros programas que también podrían necesitar usar las "mismas" direcciones. Esto tiene el efecto secundario de aumentar la fiabilidad y la seguridad, ya que los procesos no pueden interferir fácilmente entre sí.
El espacio de memoria virtual de una aplicación se construye según sea necesario. Una aplicación parece (para sí misma) estar en un solo bloque contiguo de memoria, pero en realidad podría estar completamente dispersa en la memoria física.
La memoria virtual también permite que los accesos a la memoria sean atrapados y desviados, lo que nos permite usar funciones como un archivo de intercambio. Lo que esto significa es que podemos insertar partes de la memoria que no se han utilizado recientemente en el disco y configurar un puntero que dice "este bloque de memoria está en el archivo x en la ubicación y" y luego podemos liberar la memoria física área para uso de otra aplicación. Cuando una aplicación necesita esa memoria, puede leerse desde el disco, colocarse en alguna ubicación de la RAM física (potencialmente diferente de donde estaba antes) y mapearse nuevamente en la misma ubicación de memoria virtual que antes.
De la misma manera que se usa el archivo de página, la memoria virtual también puede permitir que el sistema operativo haga lo que es efectivamente una carga "lenta" de bibliotecas compartidas para un programa. Cuando el programa principal le dice al sistema operativo que quiere usar una biblioteca en particular, entonces el sistema operativo puede ahorrar tiempo al verificar los requisitos de la biblioteca, asignar el espacio en el área de memoria virtual para la aplicación, pero en lugar de cargar toda la biblioteca en él puede diferir la carga de páginas de la biblioteca desde el disco hasta que realmente se necesiten. De esta manera, las únicas partes de la biblioteca que se cargan en la RAM son las partes que realmente utiliza el programa, las partes que nunca se usan nunca se cargan y, por lo tanto, no desperdician RAM.
Usando estas técnicas, mejoramos la estabilidad del sistema y permitimos que se ejecuten más procesos en un espacio confinado sin que se afecten indebidamente. No "aumenta la memoria", sino que nos permite usar más efectivamente lo que tenemos.
El archivo de intercambio está habilitado de sistemas de memoria virtual, pero en el pasado se confunde como siendo la memoria virtual.
El sistema tendrá que asignar cada dirección virtual a una dirección física cuando se use esa memoria, pero no toda la memoria se usa al mismo tiempo . Por ejemplo, suponga que tiene 20 pestañas en su navegador, cada una con 1 GB de memoria. En el sistema operativo sin soporte de memoria virtual, necesitaría 20 GB de RAM para que esto funcione. El truco es que no explora las 20 pestañas al mismo tiempo, por lo que el sistema operativo con memoria virtual le permitirá usar su navegador de esa manera con solo un par de GB de RAM, intercambiando pestañas inactivas en el disco.
La memoria virtual no se usa exclusivamente para el intercambio. Su objetivo principal es en realidad evitar la fragmentación de RAM, lo cual es un gran problema en los sistemas sin administración de memoria virtual: es posible que tenga 1 GB de RAM libre, pero si viene en trozos de 10 MB, una aplicación que solicite 100 MB no podrá funcionar .
Con el tiempo, la memoria virtual encontró aún más usos, especialmente el acceso aleatorio a archivos: muchas aplicaciones, como las bases de datos, se volverán extremadamente lentas si se ven obligadas a leer los archivos secuencialmente, y funcionarán mucho más rápido si el sistema operativo les permite fingir que todo el archivo se encuentra en (virtual ) memoria y optimice la E / S del disco y el almacenamiento en caché según los patrones de acceso.
La memoria virtual no aumenta la memoria, en el sentido de agregar realmente más hardware de memoria principal. Pero PUEDE aumentar el rango de direcciones utilizables . Por lo tanto, uno podría tener un programa en ejecución que consta de un segmento de código y un segmento de datos (pila y montón), y ambos podrían ocupar un rango de direcciones virtuales mayor que el rango de direcciones físicas proporcionadas por el espacio de almacenamiento físicamente real del máquina. El truco es que solo una pequeña fracción de esas direcciones virtuales está respaldada por la memoria principal física en cualquier momento [pero todo está respaldado por el almacenamiento en disco] . Esto funciona debido al fenómeno de la localidad de referencia.: En cualquier momento, solo se ejecutan las instrucciones en una o más secciones contiguas pequeñas del segmento del programa, y solo se operan los datos en una o más secciones contiguas pequeñas del segmento de datos [por supuesto, el comportamiento es en realidad más complejo , pero sigue este patrón durante una gran parte del tiempo]
Entiendo que la memoria virtual engaña al programa al mostrar más memoria de la que está realmente disponible.
La motivación original para la memoria virtual era una forma de gestión de memoria para proporcionar un espacio de direcciones más grande que la memoria física.
El software podría utilizar el espacio de direcciones completo de la CPU (por ejemplo, 2 ^ 32 espacios de direcciones) mientras que la memoria física instalada real era solo una fracción de ese número.
Los programas grandes pueden ser portátiles entre las computadoras que usan memoria virtual sin imponer requisitos de memoria enormes (instalados).
Este uso de la memoria virtual fue en el día de las computadoras centrales y la memoria de núcleo de ferrita (que era de baja densidad física y costosa).
Pero en última instancia, tiene que asignar la dirección lógica a la dirección física real. Ahora, ¿cómo está aumentando la memoria?
La memoria virtual ha evolucionado desde una simple técnica para proporcionar más espacio de direcciones para el programa.
La memoria virtual es un componente clave para proporcionar seguridad a cada proceso en los sistemas operativos modernos, de modo que un proceso no pueda interferir con otro proceso, ni verse comprometido por otro proceso.
Pero multiprocesamiento (no confundir con multiproceso ORS ) con la memoria virtual sigue proporcionar memoria más evidente para el sistema de memoria física.
Cada proceso creado se proporciona con su propio espacio de dirección virtual, es decir, su propia memoria virtual.
La cantidad de memoria física que realmente se usa (y se asigna a la memoria virtual) para cada proceso es dinámica. Por lo general, solo la memoria virtual que contiene el código (también conocido como texto) y las páginas / segmentos de datos para realizar la ejecución del proceso se asigna a la memoria física (también conocida como residente en la memoria).
El código no esencial (porque no se ejecuta actualmente) y los datos (porque no se hace referencia / procesado) no tienen que ser residentes en la memoria todo el tiempo. El código y / o las páginas / segmentos de datos se pueden "intercambiar" al almacén de respaldo (por ejemplo, espacio de intercambio o archivo de página en un HDD o SSD), y luego "intercambiar (volver) en" según sea necesario (también conocido como "a pedido" )
La memoria virtual facilita el uso eficiente de la memoria física finita entre numerosos procesos, cada uno con su propio espacio de direcciones virtuales protegido. La suma de estas memorias virtuales normalmente sería mayor que la memoria física instalada.
La "memoria aumentada" ahora es desde la perspectiva del sistema, y no solo desde la perspectiva del programa.
La memoria virtual aumenta la cantidad de datos que un programa puede abordar. Desde el punto de vista del software, (generalmente) no nos importa dónde se almacenan sus datos. Se podría almacenar en la memoria DRAM física, se podría almacenar en una unidad flash conectada a la máquina, o incluso se podría almacenar en una bandeja giratoria. Lo que le importa al software es que, cuando solicita acceder a esos datos, tiene éxito.
En la práctica, también queremos que los programas se ejecuten rápidamente. Por consideraciones de velocidad , nos importa dónde están los datos. Queremos que los datos a los que accedemos con mayor frecuencia se almacenen en hardware que permita el acceso más rápido. A nuestros programas les gustaría quedarse completamente sin DRAM. Sin embargo, a menudo no tenemos suficiente DRAM para hacer esto. La memoria virtual es una solución.
Con la memoria virtual, el sistema operativo "pagina" datos que no se han utilizado durante un tiempo, almacenándolos en un disco duro. Esto todavía es accesible, solo lento. Si el programa solicita datos que están en el disco duro, el sistema operativo debe tomarse el tiempo de leer los datos del disco y volver a colocarlos en la DRAM.
En teoría, podría leer los datos directamente del disco. Sin embargo, hay razones por las que no se hace de esa manera. Los programas no quieren tener que estar al tanto de todas estas complicaciones. Podemos y escribimos software que pone datos de forma inteligente en el disco (se llama almacenamiento en caché). Sin embargo, se necesita mucho trabajo extra. Lo más rápido que podemos hacerlo en código es:
if data is not in memory
read data from disk into memory
operate on data
Un lector astuto notará que, incluso si los datos están en la memoria, teníamos que tener un condicional para verificar si están allí. ¡Esto es mucho más lento que solo operar directamente en la memoria!
La memoria virtual resuelve este problema haciendo la comprobación del hardware en la CPU. La CPU está en condiciones de realizar esta operación de memoria virtual extremadamente rápido porque puede dedicarle hardware. Cualquier intento de hacer esto solo en software debe utilizar las partes de propósito general de la CPU, que son naturalmente más lentas que los transistores dedicados.
Esto lleva a por qué siempre volvemos a buscar los datos en la memoria en lugar de simplemente leerlos desde el disco y dejarlos así. Dividimos la memoria en "páginas", cada una de las cuales está marcada como presente o no presente en la memoria. El sistema operativo mantiene esta tabla en un formato conveniente para que la CPU lo use directamente. Cada vez que un programa accede a datos que están presentes, el hardware en la CPU les da acceso a los datos en DRAM directamente. Cuando los datos no están presentes, se emite un "error de página", que le indica al sistema operativo que cargue esa página del disco en alguna página física de la memoria y actualice la tabla para que la CPU apunte a esta nueva página física.
La clave de todo este problema es minimizar su uso. En la práctica, descubrimos que los sistemas operativos son muy buenos para elegir qué datos mantener en la memoria y qué datos enviar a la página en el disco, por lo que la gran mayoría de los accesos a la memoria se producen sin causar un error de página.
Lo hace haciendo que las entradas del mapa sean temporales.
Cuando un programa accede a una dirección lógica, la CPU busca en el mapa una dirección física correspondiente. Si se encuentra, el acceso a la memoria continúa como se esperaba; si no se encuentra, se debe asignar una dirección física y cargar el contenido desde otro almacenamiento: el "espacio de intercambio". Si cada dirección física ya ha sido asignada a alguna dirección lógica, entonces algunas direcciones lógicas deben ser "intercambiadas" (su contenido guardado nuevamente en el espacio de intercambio) para que las direcciones físicas estén disponibles.
La memoria máxima asignada es el tamaño del espacio de intercambio, que puede ser mucho mayor que la memoria instalada. Puede ser útil pensar en el espacio de intercambio como la memoria "real", y en la RAM como un caché de alta velocidad para el espacio de intercambio.
(Esto está lejos de ser una descripción exhaustiva, está destinado a responder la pregunta inmediata sin entrar en detalles relevantes pero innecesarios).
El concepto básico se basa en el hecho de que una CPU moderna puede administrar tablas de traducción haciendo un seguimiento de "qué rangos de direcciones se ha asignado un determinado proceso para usar, y qué direcciones físicas (piense en las líneas A00..Axx en un bus de memoria), SI CUALQUIERA , actualmente se utilizan para almacenar realmente los datos. "SI CUALQUIERA" porque "ninguno en absoluto" es un estado posible y aceptable: en este caso, se generará una condición de error (un llamado "fallo de página") a nivel de hardware - y este error activará un controlador de nivel de sistema operativo que puede, por ejemplo, cargar el contenido de la memoria que se ha escrito en un archivo de intercambio en cualquier ubicación libre en la memoria física (en caso de una lectura) o encontrar una ubicación real para colocar cosas (en caso de una escritura), actualice la tabla de traducción mencionada anteriormente,y solo ENTONCES vuelva a controlar el proceso que intentó acceder a esa memoria ... y que no será más sabio de lo que sucedió.
Memoria virtual:
1) permite que se asigne un gran espacio de direcciones virtuales a una cantidad menor de memoria física, con el exceso "intercambiado" en el disco, SSD o, posiblemente, en NVRAM y otros dispositivos.
2) permite asignar un espacio de dirección virtual más grande (por ejemplo, 64 bits) a un espacio de dirección física más pequeño (por ejemplo, 32 o 64 bits)
3) permite que se asigne un espacio de dirección virtual más pequeño (por ejemplo, 32 bits) a un espacio de dirección física más grande (por ejemplo, 40 bits) y, por lo tanto, permite que las aplicaciones más antiguas aprovechen más DRAM física.
4) permite que la memoria física fragmentada y no contigua en el espacio de direcciones físicas se vuelva contigua en el espacio de direcciones virtuales.
5) permite que los procesos reciban sus propios espacios de direcciones virtuales y, por lo tanto, estén aislados unos de otros.
6) permite que diferentes direcciones virtuales que comparten los mismos valores de datos asignen una sola página física.
Esto puede suceder dentro de un único proceso o sistema operativo: la mayoría de los sistemas operativos derivados de BSD UNIX tienen una sola página de ceros de solo lectura, que se puede asignar a cualquier página virtual llena de cero, generalmente COW (Copy On Write - read only ceros, escrituras atrapadas y página no compartida y se puede escribir).
Puede suceder entre procesos, por ejemplo, UNIX fork () crea procesos secundarios que comparten casi toda la memoria virtual de una manera COW.
Puede suceder entre sistemas operativos, por ejemplo, los sistemas operativos invitados en un host de máquina virtual pueden tener páginas deduplicadas, vacas compartidas, etc. (Algunos ataques de seguridad recientes se han aprovechado de esto).
7) la memoria virtual puede permitir que partes del espacio de direcciones virtuales se asignen a archivos o a la memoria asignada en otros procesadores, ya sea en el mismo sistema multiprocesador o en Internet.