La gestión de la memoria es una de las actividades más complejas que realiza el kernel de Linux. Tiene varios conceptos/problemas asociados con él.
Este artículo es parte de nuestra serie actual de descripción general del kernel de UNIX.
En el artículo anterior de la serie kernel, hablamos sobre la descripción general del proceso UNIX y los kernels reentrantes.
En este artículo, intentaremos tocar la base de la memoria virtual y la paginación por demanda, ya que estos son algunos de los conceptos importantes relacionados con la administración de la memoria.
Memoria virtual
El concepto de memoria virtual es uno de los aspectos más poderosos de la gestión de la memoria. Desde la era inicial de las computadoras se ha sentido la necesidad de memoria más que la memoria física existente. A lo largo de los años, se utilizaron muchas soluciones para superar este problema y la más exitosa de ellas ha sido el concepto de memoria virtual.
La memoria virtual hace que su sistema parezca tener más memoria de la que realmente tiene. Esto puede sonar interesante y puede incitar a uno a saber cómo es esto posible. Entonces, entendamos el concepto.
- Para empezar, primero debemos comprender que la memoria virtual es una capa de direcciones de memoria que se asignan a direcciones físicas.
- En el modelo de memoria virtual, cuando un procesador ejecuta una instrucción de programa, lee la instrucción de la memoria virtual y la ejecuta.
- Pero antes de ejecutar la instrucción, primero convierte la dirección de memoria virtual en una dirección física.
- Esta conversión se realiza en función de la asignación de direcciones virtuales a físicas que se realiza en función de la información de asignación contenida en las tablas de páginas (que son mantenidas por el sistema operativo).
La memoria virtual y física se divide en fragmentos de longitud fija conocidos como páginas. En este modelo paginado, una dirección virtual se puede dividir en dos partes:
- Un desplazamiento (los 12 bits más bajos)
- Un número de marco de página virtual (resto de los bits)
Cada vez que el procesador encuentra una dirección virtual, extrae el número de marco de la página virtual. Luego, traduce este número de marco de página virtual a un número de marco de página física y las partes compensadas lo ayudan a ir a la dirección exacta en la página física. Esta traducción de direcciones se realiza a través de las tablas de páginas.
En teoría, podemos considerar que una tabla de páginas contiene la siguiente información:
- Una bandera que describe si la entrada es válida o no
- El número de marco de la página física como se describe en esta entrada
- Acceder a información sobre la página (como solo lectura, lectura-escritura, etc.)
Se accede a una tabla de páginas a través del número de marco de página virtual usándolo como compensación para las entradas en la tabla de páginas. Por ejemplo, un número de marco de página virtual de '2' apunta a la entrada '1' en la tabla de páginas (los números de entrada comienzan con '0').
En la imagen a continuación, VPFN significa número de marco de página virtual y PFN indica el número de marco de página física.
Puede suceder que un procesador vaya a una entrada de la tabla de páginas de procesos con un número de marco de página virtual y encuentre que la entrada no es válida. En este caso, es responsabilidad del procesador pasar el control al kernel y pedirle que solucione el problema. Los diferentes procesadores pasan el control de diferentes maneras, pero este fenómeno se conoce como "fallo de página". Pero si la entrada era válida, el procesador toma el número de marco de la página física, lo multiplica por el tamaño de la página para obtener la dirección base de la página física y luego suma el desplazamiento para llegar a la dirección física exacta.
Así que ahora entendemos que a través del concepto de memoria virtual, cada proceso piensa que tiene todo el rango de direcciones virtuales a su disposición y, por lo tanto, estos conceptos hacen que el sistema parezca tener más memoria física de la que realmente está disponible.
Paginación de demanda
En la sección anterior aprendimos que si el procesador va a la tabla de páginas de procesos con un número de marco de página virtual para el cual no había ninguna entrada presente en la tabla, surgen dos casos.
- O el proceso ha intentado acceder a una dirección de memoria no válida
- La página física correspondiente a la dirección virtual no se cargó en la memoria física
De los dos casos anteriores, el caso 1 es el caso en el que el proceso intenta acceder a una dirección de memoria que no está permitida. En este caso, se genera un error de página y el kernel finaliza el proceso.
Mientras que en el caso '2', como ya se explicó, la página física correspondiente a la dirección virtual aún no se carga en la memoria física. En este caso, también se genera una falla de página y el kernel intenta traer la página de memoria requerida a la memoria física desde el disco duro.
Dado que esta operación de llevar una página del disco duro a la memoria física lleva mucho tiempo, en ese momento se produce un cambio de contexto entre procesos y se ejecuta algún otro proceso. Mientras tanto, la página del proceso anterior se lleva a la memoria física y las tablas de páginas se actualizan y luego este proceso vuelve a ejecutarse desde la misma instrucción que causó la "falla de página".
Esto se conoce como paginación por demanda, donde todas las páginas de memoria correspondientes a un proceso no están presentes en la memoria física en un momento dado. Esto evita que la memoria física se obstruya con páginas de memoria no requeridas, mientras que, cuando sea necesario, estas páginas se pueden traer a la memoria física a través de un error de página (como se explicó anteriormente).