paging - segmentacion - Entender la dirección virtual, la memoria virtual y la paginación
paginacion de memoria ejemplos (2)
Algunas personas usan el término "memoria virtual" como si fuera sinónimo del archivo de página, ya que el archivo de página representa la parte de la memoria asignada que no es la memoria "real" (es decir, la memoria RAM). Pero la mayoría de las personas consideran que la "Memoria virtual" es la capa de abstracción completa que el Sistema Operativo otorga a los programas, que combina la RAM y el archivo de página.
No estoy seguro de cuál de estas definiciones es favorecida por Mac OS, aunque parece poco probable que su computadora no tenga asignada ninguna memoria paginada, por lo que supongo que probablemente está agregando 8GB de memoria paginada a sus 8GB de RAM real , para un total de 16GB de memoria disponible (virtual).
Recuerde que debido a que el sistema operativo administra las solicitudes de asignación de memoria y de desasignación, es libre de hacer lo que quiera. Mi entendimiento es que la mayoría de los sistemas operativos tienen diferentes tablas de asignación de memoria para cada proceso, por lo que literalmente podrían dar la misma dirección de memoria virtual a múltiples programas, pero esas direcciones de memoria se asignarían a diferentes bloques reales en la memoria. Por lo tanto, un sistema operativo de 64 bits puede asignar la cantidad máxima de direcciones de 32 bits a múltiples programas de 32 bits; no todos están limitados a las mismas direcciones de memoria de 32 bits.
Sin embargo, hay límites: el sistema operativo puede tener límites establecidos en el tamaño que el archivo de página puede crecer. Entonces, a menos que le haya dicho deliberadamente a su sistema operativo que lo haga, es probable que no tenga 64 GB de memoria virtual total. E incluso si lo hiciera, no puede asignar los 64 GB a todos los programas, por lo que lo más probable es que tenga un error OutOfMemory
antes de que el sistema operativo asigne una dirección virtual a 0xFFFFFFFFF
a su programa. (De hecho, no me sorprendería saber que 0xFFFFFFFFF
es en realidad una ubicación de código de error reservada, similar a 0x0
). Pero como las direcciones que su programa conoce no tienen correlación con las verdaderas direcciones de memoria, existe la posibilidad de que Al final, se le asigna una dirección de memoria que su programa considera como 0xFFFFFFFFF
, incluso si el sistema operativo no utiliza ninguna memoria cercana.
¿Hay una gran tabla de páginas gigantes que incluya todas las páginas para cada proceso o cada proceso tiene su propia tabla de páginas?
Probablemente ambos ... y luego algunos.
- Cada proceso tiene su tabla de memoria privada, y el SO evitará activamente que su programa acceda a una dirección de memoria que no haya sido asignada a esta tabla.
- También existe la memoria compartida, por lo que dos procesos que necesitan usar la misma información pueden crear un área de memoria compartida y tener acceso a las direcciones en ese espacio de memoria para que ambos puedan acceder.
- Obviamente, el sistema operativo en sí mismo necesita tener alguna forma de rastrear cuánta memoria general está disponible, qué espacios de direcciones son gratuitos / utilizados y qué bloques de memoria virtual se han asignado a qué ubicaciones en la RAM o en el archivo de la página.
Entonces, suponiendo que a un proceso se le ha asignado memoria en la dirección 0x00000002
, cuando se va a cargar el valor de esa dirección de memoria, el sistema operativo puede reconocer que en realidad se asigna a la dirección de memoria real 0x00000F23
, y esa es la dirección de memoria cuyo valor en realidad será recuperado en el registro de la CPU. O bien, podría darse cuenta de que ha movido la página que contiene esa dirección al disco en algún lugar, en cuyo caso el sistema operativo encontrará una parte vacía de la memoria y cargará primero los datos de la página desde el disco a esa memoria. (De nuevo, esta dirección de memoria no tiene ninguna correlación con la dirección de memoria original que solicitó el programa).
Si no hay ninguna memoria vacía para extraer la página, el sistema operativo primero tendrá que mover algunos datos de la memoria al archivo de la página. Intenta determinar de forma inteligente qué memoria es menos probable que se utilice en un futuro próximo. Pero a veces se termina solicitando memoria poco después de que se intercambie en el disco, solo para reemplazar la siguiente parte de memoria que un programa estaba a punto de solicitar. Esta "paliza" es lo que hace que las computadoras con memoria insuficiente vayan realmente, realmente lentas, ya que los accesos a los discos son más lentos que los accesos a la memoria.
He estado aprendiendo estos temas y leí muchos artículos y libros, pero a todos les falta información complementaria y me confunden aún más. Entonces, me gustaría explicar lo que sé mientras hago mis preguntas. Con suerte, este tema será útil para muchos como yo. También me gustaría aprender la validez de mis conocimientos y correcciones si es necesario.
Memoria virtual
Algunos artículos dicen "La memoria virtual es un espacio del disco duro que emula la memoria física para que podamos tener más memoria de la que realmente tenemos". Algunos otros artículos dicen "La memoria virtual es la combinación de la memoria física (RAM), una sección del disco duro que actúa como memoria física y tablas de páginas". Sin embargo, son cosas diferentes y no entiendo por qué hay diferentes explicaciones como esa. .
Vayamos con la segunda explicación, ya que también es así como Wikipedia describe la memoria virtual. En este punto, la dirección virtual tiene sentido ya que usamos la dirección en la memoria virtual en lugar de la memoria física directamente.
Por cierto, mi Mac dice que tengo 8 GB de memoria física y 8 GB de memoria virtual. En este caso, ¿la VM incluye la memoria física o es la cantidad de espacio en HD utilizada como memoria? ¿Tengo memoria de 16GB disponible para mis programas?
Pregunta 1:
Intel i5 tiene un bus de dirección de 36 bits y esto significa que puede direccionar memoria de 64GB. Digamos que instalé 4GB de RAM en mi computadora. Sin embargo, es posible que mis programas no sepan el tamaño de la memoria instalada, ya que se utilizará en muchos sistemas diferentes con diferentes tamaños de memoria. Aquí es donde la memoria virtual se vuelve práctica. Se abstrae el tamaño real de la memoria instalada.
Sin embargo, ¿qué sucede cuando mis programas desean acceder a la dirección de memoria 0xFFFFFFFFF? Solo tengo 4GB instalados y quizás algo de espacio de memoria en HD.
Tengo dos teorías para esta pregunta:
1. Dado que OS mantiene las tablas de páginas, el sistema operativo decodifica esa dirección y descubre qué página es y comprueba esa página en la tabla de páginas para ver si tienen una dirección física asociada (marcas válidas e inválidas), en caso afirmativo luego pasa a la dirección física a la que los puntos de entrada de la página se encuentran en la memoria física + desplazamiento definido en la dirección virtual y aporta ese valor. De lo contrario, se produce un error de página y el sistema operativo busca esa página en el almacenamiento secundario, la busca y la guarda en la memoria y actualiza la tabla de páginas.
2. Lanza un tipo de excepción OutOfMemory que dice que no tengo ningún tipo de memoria que pueda abordar la dirección dada.
La desventaja de la primera teoría es que ¿qué sucede cuando un programa quiere usar una memoria de 64GB? Entonces necesitamos tener un espacio de memoria de 60GB en HD ya que solo tenemos 4GB. Sin embargo, en la captura de pantalla a continuación, MAC me dice que solo hay 8 GB de memoria virtual.
Pregunta 2:
¿Cómo se ponen los procesos en la memoria virtual? Quiero decir, ¿cada proceso tiene 0x0 - 0xFFFFFFFFF espacio de memoria virtual disponible para ellos o solo hay un espacio de direcciones de Memoria Virtual donde se coloca todo el proceso?
Si cada proceso asume que tienen toda la memoria disponible para ellos, entonces las memorias tienen el siguiente aspecto:
Si solo hay un concepto de memoria virtual, se vería así:
Tabla de páginas
Por lo tanto, la tabla de páginas es una estructura de datos que se ubica entre las direcciones físicas y las virtuales. Es una matriz asociativa (o como un diccionario) que para cada página (clave), hay una dirección física asociada (valor).
El sistema operativo utiliza MMU (Unidad de gestión de memoria) para realizar esta traducción de la dirección virtual a la dirección física.
Pregunta 3:
¿Hay una gran tabla de páginas gigantes que incluya todas las páginas para cada proceso o cada proceso tiene su propia tabla de páginas?
Paginacion
La paginación es un método de gestión de memoria. La memoria virtual y la memoria física se dividen en páginas (que son bloques fijos y del mismo tamaño) por la Unidad de administración de memoria. Esta técnica es útil cuando intercambias páginas entre la memoria y el almacenamiento secundario para que puedas intercambiar páginas entre ellas. Su programa, por ejemplo, solicita un dato ubicado en una dirección. Sin embargo, esa dirección que usa su programa es una dirección virtual y MMU la traduce usando la tabla de páginas. Durante esto, la MMU verifica la tabla de páginas si la solicitada está presente en la tabla de páginas y si el sistema operativo la obtiene del almacenamiento secundario, si no, y actualiza la tabla de páginas.
Pregunta 4:
Digamos que un proceso solicita los datos de una dirección que se convierte en una dirección física que ya tiene algunos datos. ¿Cómo se sabe que los datos no pertenecen a los procesos del solicitante y deben reemplazarse con el que se encuentra en el almacenamiento secundario?
Hay un bit sucio, por ejemplo, que se usa para escribir esa página en el disco duro o no, pero no creo que sea lo que determine el proceso del propietario.
Antes de responder a sus preguntas (espero que lo haga), aquí hay algunos comentarios introductorios:
Observaciones
El problema aquí es que la "memoria virtual" tiene dos sentidos. "Memoria virtual" como término técnico utilizado por los programadores de bajo nivel no tiene (casi) nada que ver con "memoria virtual", como se explica a los consumidores.
En el sentido técnico, la "memoria virtual" es un sistema de administración de memoria por el cual cada proceso tiene su propio espacio de direcciones virtuales, y las direcciones de memoria en ese espacio de direcciones se asignan a las direcciones de memoria física por el kernel del sistema operativo con soporte de hardware (usa términos como TLB, tablas de páginas de niveles múltiples, fallas de página y paseos, etc.). Este es el sentido de VM que le interesa (descrito a continuación).
En el sentido no técnico, "memoria virtual" es el espacio en disco utilizado en lugar de RAM (utiliza términos como swap, almacén de respaldo, etc.). Este es el sentido de VM en el que no estás particularmente interesado, pero parece que has visto algún material que trata principalmente con este sentido del término o confunde los dos.
Pregunta 1
¿Qué sucede cuando mis programas desean acceder a la dirección de memoria 0xFFFFFFFFF? Yo solo tengo 4GB
En este caso, su "Teoría 1" está más cerca.
La VM desacopla las direcciones que su programa "ve" y trabaja con las direcciones virtuales de las direcciones físicas. Su 4GiB de memoria puede estar en direcciones físicas de 0x0 a 0xFFFFFFFF (8 F''s), pero la dirección 0xFFFFFFFFF (9 F''s) está en el espacio de usuario (en diseño canónico) de direcciones virtuales . Siempre que 0xFFFFFFFFF esté en un bloque asignado al proceso, la CPU y el kernel (en concierto) traducirán la dirección de la página 0xFFFFFF000 (asumiendo una página de 4k, simplemente cortaremos los 12 bits inferiores) a una página física real, que podría tener (Casi) cualquier dirección de base física. Supongamos que la dirección física de esa página es 0xeac000 (una relación establecida cuando el núcleo le dio la página virtual 0xFFFFFF000), entonces el byte en la dirección virtual 0xFFFFFFFFF está en la dirección física 0x00eacfff.
Cuando elimina la referencia a 0xFFFFFFFFF (asumiendo 4k páginas), el kernel "solicita" a la CPU que acceda a esa dirección virtual, y la CPU corta los 12 bits inferiores y busca la página en el dTLB (los búferes de traducción son virtuales para cachés de mapeo de páginas físicas; hay al menos una para datos y otra para instrucciones). Si hay un golpe, la CPU construye la dirección física real y recupera el valor. Si hay una falla de TLB, la CPU genera un error de página, lo que hace que el kernel consulte (o “camine”) las tablas de la página para determinar la página física correcta, y “devuelve” ese valor a la CPU, que la almacena en la memoria caché. dTLB (es muy probable que se reutilice casi de inmediato). Luego, el kernel le pide a la CPU esa dirección nuevamente y esta vez, tendrá éxito sin activar un paseo.
Admito que esta descripción es bastante desagradable (refleja mi propio nivel de conocimiento). En particular, la forma exacta en que se identifica un proceso en particular en el TLB no es 100% clara para mí y al menos algo específica del hardware. Solía ser que cada cambio de contexto necesitaba una descarga TLB completa, pero las CPU Intel más recientes tienen un campo "PID" de 6 bits, lo que significa que las descargas, aunque aún se requieren algunas veces, no siempre son necesarias en un cambio de contexto. Más fallas surgen de mi incapacidad para describir TLB de múltiples niveles, PTE (entradas de tabla de páginas) y abordar el significado de esto en el almacenamiento en caché de datos e instrucciones (aunque sé que el hardware moderno puede ver si es posible que una dirección sea en algún nivel de caché al mismo tiempo que la búsqueda de TLB).
Pregunta 2
¿Cómo se ponen los procesos en la memoria virtual? Quiero decir, ¿cada proceso tiene 0x0 - 0xFFFFFFFFF espacio de memoria virtual disponible para ellos o solo hay un espacio de direcciones de Memoria Virtual donde se coloca todo el proceso?
Cada proceso tiene su propio espacio de memoria virtual completamente distinto. Esto es (casi) todo el punto de VM.
En los viejos tiempos, el TLB no era "consciente del proceso" en ningún sentido. Cada cambio de contexto significaba que los TLB debían eliminarse por completo. Hoy en día, las entradas de TLB tienen un campo de "contexto de proceso" (PCID?) Corto y son compatibles con el vaciado selectivo, por lo que puede pensar un poco / sorta en esto como el PID (o, más bien, el PCID: algún tipo de hash del PID) se adjunta a la dirección de la página virtual, por lo que el TLB es más consciente del proceso, y solo se deben vaciar esas entradas cuando hay una colisión de PCID con otro proceso (dos procesos se asignan al mismo PCID).
Pregunta 3
¿Hay una gran tabla de páginas gigantes que incluya todas las páginas para cada proceso o cada proceso tiene su propia tabla de páginas?
Por supuesto, esto es específico del sistema operativo, pero mi entendimiento es que Linux tiene un conjunto de tablas de páginas de varios niveles donde las entradas (PTE) están etiquetadas con el PID, en lugar de que haya tablas de páginas separadas por proceso. Creo que la razón básica de esto es que muchas asignaciones de virtual a físico son n : 1 en lugar de 1: 1, ya que todas ellas 1: 1 anularían en gran medida un objetivo principal de VM: pensar en las páginas de solo lectura compartidas que contienen las instrucciones para bibliotecas como libc
, o páginas de datos de copia en escritura compartidas entre padres e hijos después de una bifurcación. Duplicar estas entradas para cada proceso en las tablas de páginas por proceso es menos eficiente que agregar / eliminar las entradas específicas del proceso a / desde un conjunto común de tablas de páginas cuando se crea / sale un proceso.
Donde entra el disco
Una vez que tiene un sistema VM, se vuelve casi trivial agregar la capacidad de recuperar una página del disco cuando se produce un error en la página e implementar el "vencimiento" de las PTE para que las páginas menos usadas recientemente se puedan colocar en el disco. Aunque esta es una característica importante en los sistemas con limitaciones de memoria, es casi totalmente irrelevante para comprender cómo funciona realmente un sistema VM.