SINOPSIS
#include <sys/mman.h>
int madvise(void *start, size_t length, int advice);
DESCRIPCIÓN
La llamada al sistema madvise aconseja al núcleo sobre como manejar la paginación de entrada/salida en el rango de direcciones que comienza en start y tiene de longitud length bytes. Permite a una aplicación decirle al núcleo como espera usar algunas zonas de memoria compartida o mapeada, para que así el núcleo pueda elegir las técnicas apropiadas de pre-lectura y caché. Esta llamada no influye en la semántica de la aplicación (excepto en el caso de MADV_DONTNEED), pero puede influir en su rendimiento. El núcleo puede ignorar libremente este consejo.El consejo se indica en el parámetro advice que puede tomar los valores
- MADV_NORMAL
- Trato no especial. Éste es el valor por defecto.
- MADV_RANDOM
- Espera las referencias a páginas en orden aleatorio. (Por tanto, la pre-lectura puede ser menos útil de lo habitual.)
- MADV_SEQUENTIAL
- Espera las referencias a páginas en orden secuencial. (Por tanto, las páginas en el rango dado pueden ser accedidas con pre-lectura y liberadas poco después del acceso.)
- MADV_WILLNEED
- Espera algún acceso en un futuro cercano. (Por tanto, sería buena idea leer algunas páginas por adelantado.)
- MADV_DONTNEED
- No esperes ningún acceso en un futuro cercano (por el momento, la aplicación ha terminado de usar el rango especificado, por lo que el núcleo puede liberar recursos asociados a la misma). Los accesos siguientes a páginas en este rango tendrán exito, pero producirán o bien que se vuelva a cargar el contenido de memoria desde el fichero mapeado subyacente (véase mmap) o bien páginas llenas de ceros para mapeos sin fichero subyacente.
VALOR DEVUELTO
En caso de éxito madvise devuelve cero. En caso de error, devuelve -1 y modifica errno con el valor apropiado.ERRORES
- EINVAL
- el valor len es negativo, start no se encuentra en un límite de página, advice no es un valor válido, o la aplicación está intentado liberar páginas bloqueadas o compartidas (con MADV_DONTNEED).
- ENOMEM
- las direcciones en el rango especificado no están mapeadas actualmente, o están fuera del rango de direcciones del proceso.
- ENOMEM
- (para MADV_WILLNEED) Memoria insuficiente - paginación fallida.
- EIO
- (para MADV_WILLNEED) La paginación de esta área excedería el tamaño máximo para el conjunto residente.
- EBADF
- existe la correspondencia, pero el área mapeada no se corresponde con un fichero.
- EAGAIN
- un recurso del núcleo está temporalmente no disponible.
OBSERVACIONES LINUX
La implementación actual de Linux (2.4.0) ve esta llamada al sistema más como una orden que como un consejo y por lo tanto puede devolver un error cuando no puede llevar a cabo lo que habitualmente podría en respuesta a este consejo. (Véase la descripción de ERRORES arriba.) Éste es un comportamiento no éstandar.
La implementación de Linux requiere que la dirección start comienze en un límite de página, y permite que length sea cero. Si algunas partes del rango de direcciones especificado no están mapeadas, la versión de Linux de madvise las ignora y aplica la llamada sobre el resto (pero devuelve ENOMEM como debería ser).