madvise - выдает предложения об использовании памяти
НАЗВАНИЕmadvise - выдает предложения об использовании памяти
СИНТАКСИС
#include
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 NOTES
Текущая реалзация 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 для доступа к файлу.