int madvise(void *start, size_t length, int advice);
ОПИСАНИЕ
Системный вызов
madvise
выдает предложения ядру об использовании постраничного ввода/вывода
в диапазоне адресов, начинающегося со
start
и размером
length
байтов. Это позволяет приложениям передавать ядру информацию об
ожидаемом использовании размеченной или разделяемой области памяти
так, чтобы система сама могла выбрать оптимальный метод упреждающего чтения
и технологию кэширования. Этот вызов не влияет на семантику приложений,
но может повлиять на их производительность. Ядро может и проигнорировать
эти предложения.
Предложенеие указывается в параметре
advice;
он может принимать такие значения:
MADV_NORMAL
Нет никаких специальных условий. Это - параметр по умолчанию.
MADV_RANDOM
Ожидать обращение к страницам в случайном порядке
(здесь упреждающее чтение может быть менее эффективным).
MADV_SEQUENTIAL
Ожидать последовательного обращения к старницам
(здесь страницы в заданном диапазоне могут агрессивно упреждающе
считываться и быстро высвобождаться сразу после доступа к ним).
MADV_WILLNEED
Ожидать доступа в ближайшем будущем
(здесь может быть хорошей идеей упреждающе считать несколько страниц).
MADV_DONTNEED
Не ожидать доступа в ближайшем будущем
(приложение завершает работу с данной областью, так что система может
освободить ресурсы, связываемые с ней).
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При нормальном завершении работы
madvise
возвращает ноль. При ошибках возвращается -1 и соответственно устанавливается
errno.
НАЙДЕННЫЕ ОШИБКИ
EINVAL
значение
len
отрицательно,
start
не выровнено по страницам,
advice
имеет некорректное значение, или приложение пытается
освободить блокированные или разделенные страницы (с MADV_DONTNEED).
ENOMEM
адреса в указанном диапазоне на текущий момент не распределены,
или находятся вне адресного пространства процесса.
ENOMEM
(для MADV_WILLNEED) не хватает памяти - ошибка использования страниц.
EIO
(для MADV_WILLNEED) использование страниц в этой области приведет к
переполнению настроек максимального размера процесса.
EBADF
распределение существует, но область содержит что-то, не являющееся файлом.
EAGAIN
ресурсы ядра были временно недоступны.
ЗАМЕЧАНИЯ ПО LINUX
Текущая реалзация Linux (2.4.0) рассматривает этот системный вызов
не как указание на метод работы, а как совет, тем не менее возвращающий
ошибку при невозможности исполнить то, что предполагалось сделать по этому
предложению. (Смотрите выше описание раздела ОШИБКИ).
Это нестандартное поведение программы.
Реализация Linux требует, чтобы адрес
start
был выравненным по страницам и позволяет
length
иметь значение ноль. Если существуют несколько неразмеченных частей
указанного диапазона адресов, то Linux-версия
madvise
игнорирует их и применяет вызов на остальные части (но все равно возвращает
ENOMEM
на системный вызов, как и должно).
ПРИМЕЧАНИЯ ПО ИСТОРИИ
Функция
madvise
впервые появилась в 4.4BSD.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1b (POSIX.4).
POSIX 1003.1-2001 описывает
posix_madvise
с константами POSIX_MADV_NORMAL, и т.п.,
с поведением, похожим на описанное здесь. Также существует одинаковая
posix_fadvise
для доступа к файлу.