mmap es básicamente el acceso programático al subsistema de memoria virtual.
Cuando tiene, por ejemplo, un archivo 1G, y lo mapea, obtiene un puntero a "todo el archivo" como si estuviera en la memoria.
Sin embargo, en este momento no ha sucedido nada excepto la operación de asignación real de reservar páginas para el archivo en la máquina virtual. (Cuanto mayor sea el archivo, más larga será la operación de mapeo, por supuesto).
Para comenzar a leer datos del archivo, simplemente acceda a través del puntero que se le devolvió en la llamada a mmap.
Si desea "precargar" partes del archivo, simplemente visite el área que desea cargar. Asegúrese de visitar TODAS las páginas que desea cargar, ya que la VM solo cargará las páginas a las que acceda. Por ejemplo, digamos dentro de su archivo 1G, tiene un área de "índice" de 10 MB en la que le gustaría asignar. La manera más sencilla sería simplemente "recorrer su índice", o cualquier estructura de datos que tenga, dejando que la página VM en datos según sea necesario. O bien, si "sabe" que son los "primeros 10MB" del archivo, y que el tamaño de su página para su máquina virtual es, digamos, 4K, entonces puede simplemente convertir el puntero mmap en un puntero de char, y simplemente iterar a través del páginas.
void load_mmap(char *mmapPtr) {
// We'll load 10MB of data from mmap
int offset = 0;
for(int offset = 0; offset < 10 * 1024 * 1024; offset += 4 * 1024) {
char *p = mmapPtr + offset;
// deref pointer to force mmap load
char c = *p;
}
}
En cuanto a cachés L1 y L2, mmap no tiene nada que ver con eso, eso es todo acerca de cómo se accede a los datos.
Dado que está utilizando el sistema VM subyacente, todo lo que resuelva los datos dentro del bloque mmap'd funcionará (desde el ensamblaje).
Si no cambia ninguno de los datos de mmap, la máquina virtual eliminará automáticamente las páginas antiguas a medida que se necesiten nuevas páginas. Si realmente las cambia, la máquina virtual las volverá a escribir.
No sería char "c = p *" ser optimizado de distancia? ¿Debería c declararse volátil? –
En versiones recientes de Linux, puede establecer MAP_POPULATE en el argumento flags en mmap() y las páginas se extraerán antes de que la llamada regrese. Esto bloqueará la llamada durante un período de tiempo que es una función del tamaño del archivo, por lo que ejecutar la función load_mmap() de ejemplo en un subproceso separado mejoraría el rendimiento si hay otro trabajo que pueda realizarse en paralelo antes de que el contenido del archivo lo necesite para ser leído, especialmente porque la mayor parte del trabajo se realiza en el lado del kernel. –
¿'mlock' no precarga las páginas? –