GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué las regiones mapeadas en memoria de solo lectura tienen páginas sucias?

Una página sucia no requiere necesariamente una reescritura. Una página sucia es aquella en la que se escribió desde la última vez que el núcleo la marcó como limpia. No siempre es necesario volver a guardar los datos en el archivo original.

Las páginas son privadas, no compartidas, por lo que no se guardarán en el archivo original. Sería imposible tener una página sucia respaldada por un archivo de solo lectura. Si es necesario eliminar la página de la RAM, se guardará en intercambio.

Las páginas que son de solo lectura, privadas y sucias, pero que se encuentran dentro del rango de un archivo asignado en memoria, suelen ser páginas de datos que contienen constantes que deben inicializarse en tiempo de ejecución, pero que no cambian una vez inicializadas. Por ejemplo, pueden contener datos estáticos que incrustan punteros; los valores del puntero dependen de la dirección en la que se asigna el programa o la biblioteca, por lo que debe calcularse después de que se haya iniciado el programa, con la página siendo de lectura y escritura en esta etapa. Después de calcular los punteros, el contenido de la página nunca cambiará en esta instancia del programa, por lo que la página se puede cambiar a solo lectura. Consulte "Buscando páginas de memoria sucias" de stosb para ver un ejemplo con fragmentos de código.

Es posible que, con menos frecuencia, vea páginas sucias, privadas, ejecutables y de solo lectura; esto sucede con algunos enlazadores que mezclan código y datos más libremente, o con compilación justo a tiempo.


Además de los casos que Gilles enumera:

Cuando un proceso se bifurca, el kernel puede marcar todas sus páginas sucias como de solo lectura y se compartirán entre el padre y el hijo. Cuando uno de los procesos escribe en la página, se producirá una excepción y el kernel copiará la página y la marcará como de escritura. Esto ahorra el trabajo de copiar páginas que finalmente no se modifican nuevamente por ninguno de los dos procesos. (Tenga en cuenta que en esta situación, las páginas están marcadas como de solo lectura en el hardware, pero el kernel sabe que se pueden escribir).


Linux
  1. ¿Por qué Rm puede eliminar archivos de solo lectura?

  2. ¿Por qué las páginas 'man' tienen muchas líneas adicionales?

  3. ¿Por qué '/' tiene una entrada '..'?

  4. ¿Por qué mmap() es más rápido que IO secuencial?

  5. ¿Una forma más rápida de mover la página de memoria que mremap ()?

¿Caracteres de cita de la página de manual?

Linux:¿cómo garantizar que una biblioteca compartida tendrá sus páginas de memoria compartidas por varios procesos?

6 razones por las que Linux no tiene más aplicaciones

Envío TCP de espacio de usuario de copia cero de la memoria asignada dma_mmap_coherent()

¿Por qué la memoria compartida del kernel es 0 en Ubuntu 12.04?

¿Por qué mi sistema muestra solo 3,2 GiB de RAM cuando definitivamente tengo 4,0 GiB?