NOMBRE
madvise − aconseja sobre el uso de memoria
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).
HISTORIA
La función madvise apareció por primera vez en 4.4BSD.
CONFORME A
POSIX.1b (POSIX.4). POSIX 1003.1-2001 describe posix_madvise con las constantes POSIX_MADV_NORMAL, etc., con un comportamiento parecido al descrito aquí. Hay un posix_fadvise similar para acceso a ficheros.
VÉASE TAMBIÉN
getrlimit(2), mmap(2), mincore(2), mprotect(2), msync(2), munmap(2)