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.
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)