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.