kernel - ejercicios - memoria virtual
¿Cómo sabe Kernel qué páginas del espacio de direcciones virtuales corresponden a un marco de página físico intercambiado? (1)
Linux:
Cuando se usa el archivo de intercambio, la Entrada de la tabla de la página se actualiza con una marcada como no válida y contiene información sobre dónde se guarda en el archivo de intercambio. Es decir: un índice para el conjunto swap_info
y un desplazamiento dentro del swap_map
.
Ejemplo de (un poco viejo) Tipo de Entrada de la Tabla de Página ( pte_t
) en un x86. Algunos de los bits son utilizados como indicadores por el hardware:
Bit Function
_PAGE_PRESENT Page is resident in memory and not swapped out
_PAGE_PROTNONE Page is resident but not accessable
_PAGE_RW Set if the page may be written to
_PAGE_USER Set if the page is accessible from user space
_PAGE_DIRTY Set if the page is written to
_PAGE_ACCESSED Set if the page is accessed
Tabla 3.1: Bits de estado y protección de entrada de tabla de página
Vea también otra respuesta SO con un diagrama del formato de tabla de página x86-64. Cuando el bit bajo = 0, el hardware ignora todos los otros bits, por lo que el kernel puede usarlos para cualquier cosa. Incluso en una entrada "presente", hay algunos bits ignorados garantizados que no están reservados para el uso futuro del hardware, por lo que el kernel puede usarlos para sus propios fines.
Es de suponer que otras arquitecturas son similares.
En términos simples: un proceso apunta a una página, la página se actualiza. Por lo tanto, los procesos son, en efecto, también actualizados. Cuando se solicita la página física, se intercambia y, por lo tanto, también todos los procesos. El punto es que la entrada de la tabla de páginas no se elimina cuando se intercambia la memoria.
Puede encontrar algo de esto útil:
- Gustavo Duarte: Cómo administra el kernel tu memoria .
La documentación del kernel incluye el libro de Mel Gorman (2007):
Considere la siguiente situación: el kernel ha agotado la RAM física y necesita cambiar una página. Selecciona el marco de página usado menos recientemente y quiere intercambiar su contenido en el disco y asignar ese marco a otro proceso.
Lo que me molesta es que este marco de página ya estaba mapeado, en términos generales, varias páginas (idénticas) de varios procesos. El núcleo tiene que encontrar de alguna manera todos esos procesos y marcar la página como intercambiada. ¿Cómo lo lleva a cabo?
Gracias.
EDITAR: Ilustraciones a la pregunta:
Antes de que los procesos de intercambio 1 y 2 tuvieran una Página compartida, que residía en el marco de la memoria física 1:
Ahora, la memoria en el sistema se agota y kernel asigna memoria para el proceso 3 intercambiando la Página 1 del cuadro 1 y reemplazándolo con la Página 2. Para hacer eso, tiene que
1) encuentre todos los procesos, refiriéndose a la página 1 (proceso 1 y proceso 2 en nuestro caso)
2) modifique sus entradas de la tabla de la página, estableciendo el bit "Presente" en 0 y estableciendo la ubicación de la página 1 en el intercambio
Entonces, no entiendo, cómo se lleva a cabo el paso 1. Kernel no podía estar mirando iterativamente las Tablas de Página de cada proceso para encontrar la Entrada de la Tabla de Página, apuntando al cuadro 1. Debería haber algún tipo de mapeo inverso desde los marcos de página a las Entradas de la Tabla de Página.
LA RESPUESTA ES:
"El cambio más significativo e importante para la gestión de la tabla de páginas es la introducción de Mapeo Inverso (rmap). Referirse a él como" rmap "es deliberado ya que es el uso común del" acrónimo "y no debe confundirse con el -rmap árbol desarrollado por Rik van Riel que tiene muchas más alteraciones en la VM de valores que solo el mapeo inverso.
En una sola oración, rmap otorga la capacidad de ubicar todas las PTE que mapean una página en particular dada solo la página struct. En 2.4, la única forma de encontrar todas las PTE que mapean una página compartida, como una biblioteca compartida correlacionada de memoria, es buscar linealmente todas las tablas de páginas que pertenecen a todos los procesos. Esto es demasiado caro y Linux intenta evitar el problema utilizando la caché de intercambio (ver la Sección 11.4). Esto significa que con muchas páginas compartidas, Linux puede tener que cambiar procesos completos independientemente de la edad de la página y los patrones de uso. 2.6 en su lugar tiene una cadena de PTE asociada con cada página de estructura que puede atravesar para eliminar una página de todas las tablas de página que hacen referencia a ella. De esta forma, las páginas de la LRU pueden intercambiarse de manera inteligente sin recurrir al intercambio de procesos completos ".
de Understanding the Linux Memory Management , "novedades en Linux2.6"