Forzar la carga de las páginas de mmap'ed

He mapeado un archivo en la memoria usando mmap. Ahora me gustaría asegurarme de que no habrá errores de página al acceder a esta memoria, es decir, quiero obligar al sistema a leer los datos del disco duro y almacenarlos en la RAM. Creo que una vez que los datos están allí, puedo evitar el intercambio con mlockall. Pero cual es el apropiado forma de hacer que el sistema cargue los datos?

Obviamente, podría hacer lecturas ficticias de todas las páginas, pero esto parece un truco feo. Además, no quiero preocuparme de que el compilador sea demasiado inteligente y optimice las lecturas ficticias.

¿Alguna sugerencia?

preguntado el 03 de mayo de 12 a las 16:05

¿Por qué quieres hacer esto? Si quiere hacer lecturas ficticias, simplemente hágalas a través de un volatile puntero, que evitará que el compilador los optimice. -

@AdamRosenfield Necesito rendimiento en tiempo real. volatile probablemente funcionaría, pero el punto de mi pregunta es realmente cómo evitar lecturas ficticias. -

¿Por qué piensas mlock()/mlockall() no funcionaria? Garantizar que las páginas afectadas están en RAM es exactamente para lo que sirve. -

@Celada: Aseguran que las páginas no serán cambiados, pero no aseguran que serán leer en. -

Suponiendo que no va a escribir en el archivo, me pregunto si su objetivo quizás sea anular la mayor parte del propósito de mmap(). Parece que desea bloquear la flexibilidad que mmap() le da al sistema sobre el enfoque de asignar memoria y leer explícitamente el archivo en él. ¿Qué ve como el valor residual del enfoque mmap() después de lograr su objetivo? -

2 Respuestas

¿Por qué piensas mlock() or mlockall() no funcionaria? Garantizar que las páginas afectadas estén en RAM es exactamente cuál es su propósito. Citando de la página de manual:

Se garantiza que todas las páginas que contienen una parte del rango de direcciones especificado residirán en la RAM cuando la llamada se devuelva con éxito; Se garantiza que las páginas permanecerán en la RAM hasta que se desbloqueen más tarde.

Puedes usar otros métodos como madvise() a pregúntenos para que las páginas se carguen en la RAM, pero no se garantiza que el kernel cumpla con eso y no se garantiza que permanezcan en la RAM incluso si el kernel las trae. Creo mmap(MAP_POPULATE) tampoco garantiza que las páginas permanecerán en la RAM.

contestado el 03 de mayo de 12 a las 16:05

Estas buscando MAP_POPULATE.

contestado el 03 de mayo de 12 a las 16:05

Efectivamente eso es lo que quiero, gracias! Es un poco molesto que entre en conflicto con MAP_SHARED aunque. - nikratio

@Nikratio: ¿Dónde ves que entran en conflicto? - Ignacio Vázquez-Abrams

mmap manpage: "MAP_POPULATE solo es compatible con asignaciones privadas desde Linux 2.6.23". - nikratio

por supuesto, eso tiene mucho más sentido, por lo que probablemente sea eso lo que se quiere decir. - nikratio

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.