¿Por qué Linux usa una partición de intercambio cuando el núcleo admite paginación / memoria virtual de todos modos?

23

Hasta donde entiendo la paginación y el intercambio, son conceptos completamente diferentes. Si bien el intercambio significa que un proceso está completamente en la memoria física o en el disco duro, las partes de un proceso pueden estar en la memoria física y otras partes pueden estar en el disco duro.

Pero, ¿por qué Linux necesita una partición de intercambio entonces? Si la memoria física está llena, algunos procesos se externalizarán al disco duro y se asignará un nuevo proceso desde la memoria virtual a la memoria física.

Simplemente no entiendo por qué uno necesita una partición de intercambio (o intercambio en general) entonces?

¿O es solo una cuestión de terminología y swap partition == virtual memory?

JohnnyFromBF
fuente
55
Tenga en cuenta que la "memoria virtual" en la arquitectura de la computadora es una técnica, mientras que MS Windows (incorrectamente IMO) la define como "La memoria virtual es el espacio de almacenamiento en el disco duro de su computadora que Windows usa junto con la memoria de acceso aleatorio (RAM)". IE "memoria virtual" de
serrín

Respuestas:

25

Sí, es solo una cuestión de terminología, en muchos casos se utiliza una partición de intercambio como memoria virtual.

La razón por la cual los sistemas UNIX y similares a UNIX prefieren las particiones de intercambio a los archivos de página es que pueden ser contiguos, lo que resulta en tiempos de búsqueda más bajos en comparación con un archivo de página que puede estar fragmentado.

Patuck
fuente
66
Y de esta manera también es más fácil compartir una única partición de intercambio entre instalaciones de Linux.
oKtosiTe
3
por lo general, un archivo de paginación se crea por completo en el primer arranque, por lo que no se fragmentará (bueno ... todavía hay algunas posibilidades ...)
AndreaCi
12
Los primeros UNIX solo tenían intercambio, no paginación, y solo podían cambiar a una partición dedicada. La paginación se implementó tan pronto como el hardware lo admitió, pero el nombre de "partición de intercambio" se atascó. La paginación a un archivo es más reciente y tiene una mayor sobrecarga del sistema operativo, así como un riesgo de fragmentación, por lo que todavía se desaconseja.
zwol
1
"la partición de intercambio se utiliza como memoria virtual". - Solo Microsoft Windows define el almacenamiento secundario (por ejemplo, el archivo de página en el disco) como "memoria virtual". Pero incluso ellos están tratando de alejarse de este uso. Intenta buscar en Google "memoria virtual" y la sinopsis del primer resultado ("La memoria virtual es espacio de almacenamiento ...") no coincide con el contenido de la página. Una declaración correcta sería una "partición de intercambio utilizada por la memoria virtual".
aserrín
14

No sé de dónde sacaste la idea de que "intercambiar significa que un proceso está completamente en la memoria física o en el disco duro". Ese significado no se ha utilizado durante algunas décadas. Citando Wikipedia :

Históricamente, el intercambio se refería al traslado desde / hacia el almacenamiento secundario de un programa completo a la vez, en un esquema conocido como roll-in / roll-out. En la década de 1960, después de que se introdujera el concepto de memoria virtual, en dos variantes, ya sea usando segmentos o páginas, el término intercambio se aplicó a mover, respectivamente, segmentos o páginas, entre el disco y la memoria. Hoy en día, con la memoria virtual basada principalmente en páginas, no en segmentos, el intercambio se convirtió en un sinónimo cercano de paginación, aunque con una diferencia. [Dudoso - discuta]

De hecho, en cualquier contexto que involucre Linux (u otros sistemas Unix), paginación e intercambio son prácticamente sinónimos. Ambos se refieren al uso de la memoria virtual donde los datos de la página pueden almacenarse en la RAM o en el disco. (Una página es de 4kB en cualquier dispositivo que pueda encontrar). Al programa que usa la página de memoria no le importa o ni siquiera sabe dónde se almacenan los datos, simplemente sigue usando la dirección virtual. El núcleo transfiere datos entre la RAM y el disco y actualiza las tablas MMU a medida que avanza, de modo que la entrada para la dirección virtual apunta a una página física en la memoria o contiene un valor especial que hace que el procesador ejecute algún código del núcleo que cargará los datos apropiados del disco.

La paginación se refiere a este proceso genérico. El intercambio se refiere al caso donde los datos en el disco están en un área dedicada: el área de intercambio (una partición de intercambio o archivo de intercambio). La paginación también se puede hacer entre la RAM y un archivo, y en este caso generalmente no se conoce como intercambio . Por ejemplo, cuando ejecuta un programa, el código debe cargarse en la memoria para ejecutarse; Si una página de códigos necesita ser expulsada de la RAM para dejar espacio para otra cosa, entonces no hay necesidad de escribir esta página en el área de intercambio, ya que se puede volver a cargar desde el archivo del programa. (Esto se puede hacer para todos los datos de solo lectura, no solo para el código del programa).

Si la memoria física está (casi) llena, el núcleo busca una página en RAM (no un proceso completo) que no se haya utilizado recientemente. Si esa página reproduce el contenido de un archivo de disco (hay tablas en el núcleo para indicar esto), la página puede ser reclamada. Si no, la página se escribe para intercambiar, luego se recupera. De cualquier manera, el kernel actualiza la entrada en la tabla de memoria virtual del proceso (que se convierte en la tabla MMU mientras se ejecuta el proceso) para marcarla como no en la RAM y luego puede reutilizar la página física para otra cosa (un programa diferente u otra página de el mismo programa)

Gilles 'SO- deja de ser malvado'
fuente
El primer párrafo de su respuesta le dice de dónde sacó la idea: documentos antiguos . (Recuerdo cuando también había una diferencia entre el intercambio y la paginación.)
RonJohn
9

La función de memoria virtual / paginación permite que un núcleo "virtualice" la memoria a los procesos del espacio de usuario. El núcleo puede tomar páginas de la memoria física y organizarlas mediante paginación para que parezcan contiguas a un proceso de espacio de usuario.

Se puede establecer un límite en la memoria de un proceso de espacio de usuario y si el proceso va más allá se produce un "error de página", lo que provoca una excepción de CPU que se devuelve al núcleo. Esto evita que el programa de espacio de usuario se meta con la memoria asignada al núcleo u otros programas, sin el permiso del núcleo.

Por lo general, los programas de espacio de usuario solicitan al núcleo que extienda este límite a través de interfaces bien definidas (llamadas por las funciones C malloc()y, free()por ejemplo). El núcleo es responsable de realizar un seguimiento de la cantidad y la memoria que se asigna a un programa.

Este mecanismo de "falla de página" también puede permitir que el kernel intercambie la página a la que el proceso intentaba acceder con una desde el disco, si el kernel puede sobreaprovisionar memoria (y tanto Windows como Linux lo admiten), de ahí por qué se llama intercambio. Si el acceso a la memoria era realmente inválido (es decir, el proceso está intentando acceder a la memoria que no solicitó primero), normalmente el proceso se eliminará con un SIGSEGV.

Por lo tanto, el "intercambio" es una característica adicional (en Linux puede deshabilitarla por completo si lo desea) que depende de la memoria virtual / paginación, pero no es necesaria solo porque una CPU tiene memoria / paginación virtual. Los conceptos no son los mismos, pero el intercambio depende de la paginación / memoria virtual que exista.


Además, después de leer más de cerca su pregunta, "paginación" a veces se utiliza como sinónimo de "intercambio", pero nunca he oído hablar de "intercambio", lo que significa que la memoria de todo el proceso se intercambia frente a "paginación", lo que significa solo parte de Se ha cambiado.

Pero, ¿por qué Linux necesita una partición de intercambio entonces? Si la memoria física está llena, algunos procesos se externalizarán al disco duro y se asignará un nuevo proceso desde la memoria virtual a la memoria física.

La "memoria virtual" es memoria física, simplemente "reasignada". El hardware MMU no se puede asignar directamente a ningún dispositivo de almacenamiento. La MMU puede generar una falla que le dice al núcleo que un proceso intentó acceder a la memoria que no debería tener, y el núcleo puede usar este mecanismo para ver que un proceso quiere recuperar algo del disco que creía que estaba en la memoria y luego hacer el " intercambiar". El punto es que es el sistema operativo el que decide guardar páginas en el disco para que pueda usar esas páginas para otros procesos, no el hardware.

LawrenceC
fuente
2

En general, la partición de intercambio no es igual a la memoria virtual.

Los procesos pueden necesitar más memoria que la memoria física real, por lo que los desarrolladores de sistemas operativos decidieron asumir que hay más memoria en el sistema que se llama "memoria virtual".

Esta memoria virtual es básicamente memoria física y una parte del disco. Esta parte del disco se llama "intercambio" en Linux.

También los desarrolladores propusieron que el uso de la parte de la memoria virtual que se encuentra en el disco duro debe ser lo más bajo posible. En aras de ello, toda la memoria virtual se dividió en pequeñas porciones que se llaman "páginas". Se utilizan muchas páginas a baja velocidad, estas páginas deben escribirse en la parte de la memoria virtual del disco duro. Esta operación se llama "intercambio". El sistema operativo debe realizar un seguimiento de las páginas que no están en la memoria física para encontrarlas cuando sea necesario. El error de página ocurre cuando un programa quiere escribir / leer una parte de la memoria que se intercambia.

Para responder a su pregunta: Linux necesita una partición de intercambio para intercambiar algunas páginas de memoria y puede ver una estadística del uso de memoria virtual con vmstat:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

La columna 'intercambio' muestra intercambio y en estadística. También este enlace explica la memoria virtual y el uso de vmstat.

soroosh
fuente