GNU/Linux >> Tutoriales Linux >  >> Linux

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

Qué te hace pensar mremap ¿Podría alguna vez ser eficiente para intercambiar páginas individuales de 4k? Como mínimo, un viaje de ida y vuelta al kernelspace, incluso solo para leer un solo valor (como pid) y devolverlo, costará más que mover 4k de datos. Y eso es antes de que lleguemos a los costos de invalidación de caché/TLB de la reasignación de memoria, que no entiendo lo suficientemente bien como para abordarlos en esta respuesta, pero que deberían tener un costo importante.

mremap es útil básicamente para una cosa:implementar realloc para grande asignaciones que fueron atendidas por mmap . Y por grande, me refiero probablemente al menos a 100k.


Parece que no existe un mecanismo de usuario más rápido para reordenar las páginas de memoria que memcpy(). mremap() es mucho más lento y, por lo tanto, solo es útil para cambiar el tamaño de un área de memoria previamente asignada mediante mmap().

¡Pero las tablas de páginas deben ser extremadamente rápidas, te escucho decir! ¡Y es posible que user-land llame a las funciones del kernel millones de veces por segundo! Las siguientes referencias ayudan a explicar por qué mremap() es tan lento:

"Una introducción a la administración de memoria de Intel" es una buena introducción a la teoría del mapeo de páginas de memoria.

"Conceptos clave de la memoria virtual de Intel" muestra cómo funciona todo con más detalle, en caso de que planee escribir su propio sistema operativo :-)

"Compartir tablas de páginas en el kernel de Linux" muestra algunas de las difíciles decisiones arquitectónicas de asignación de páginas de memoria de Linux y su efecto en el rendimiento.

Si observamos las tres referencias juntas, podemos ver que, hasta ahora, los arquitectos del núcleo han realizado pocos esfuerzos para exponer el mapeo de páginas de memoria a la tierra del usuario de una manera eficiente. Incluso en el kernel, la manipulación de la tabla de páginas debe realizarse utilizando hasta tres bloqueos, lo que será lento.

En el futuro, dado que la tabla de páginas en sí está compuesta por páginas de 4k, es posible cambiar el kernel para que las páginas de la tabla de páginas en particular sean únicas para un hilo en particular y se pueda asumir que tienen acceso sin bloqueo durante la duración del proceso. Esto facilitaría una manipulación muy eficiente de esa página de tabla de páginas en particular a través del espacio del usuario. Pero esto se sale del alcance de la pregunta original.


Linux
  1. ¿Por qué Wget es mucho más rápido que descargar a través de Chrome?

  2. Gestión de memoria de Linux:intercambio, cachés y VM compartida

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

  4. ¿Qué son la página mapeada en memoria y la página anónima?

  5. ¿Hay alguna manera de buscar una bandera en una página de manual?

Descubra por qué el comando "menos" es más rápido que el comando "más" para una navegación de archivos eficaz

Gestión de memoria de Linux:memoria virtual y paginación de demanda

Java usa mucha más memoria que el tamaño del montón (o el tamaño correcto del límite de memoria de Docker)

¿Hay algo más rápido que `find . | wc -l` para contar archivos en un directorio?

Forma más rápida de eliminar una gran cantidad de archivos

En Linux, ¿cuál es una forma más rápida que `find` o `diff -r` para ver si algo dentro de un directorio ha cambiado?