POSIX_FADVISE(2) | Руководство программиста Linux | POSIX_FADVISE(2) |
posix_fadvise - предварительно декларирует вариант доступа для данных файла
#include <fcntl.h>
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
posix_fadvise():
Программы могут использовать posix_fadvise() для объявления намерений осуществить доступ к файлу данных в скором будущем определённым образом, тем самым позволяя ядру выполнить некоторые операции по оптимизации.
Аргумент advice применяется к (не обязательно существующей) области, начинающейся с offset, длиной len байт (или до конца файла, если len равно 0) внутри файла, на который ссылается fd. Аргумент advice не является привязкой; он всего лишь выражает ожидание приложения.
Допустимые значения advice:
При успешном выполнении возвращается 0. В случае ошибки возвращается номер ошибки.
Поддержка в ядре впервые появилась в Linux 2.5.60; используемый системный вызов называется fadvise64(). Поддержка в библиотеке glibc появилась в версии 2.2; обёрточная функция называется posix_fadvise().
Начиная с Linux 3.18 поддержка данного системного вызова необязательна, она зависит от того, собрано ли ядро с параметром CONFIG_ADVISE_SYSCALLS.
POSIX.1-2001, POSIX.1-2008. Заметим, что в POSIX.1-2003 TC1 тип аргумента len был изменён с size_t на off_t.
В Linux POSIX_FADV_NORMAL устанавливает окно упреждающего чтения согласно используемому размеру по умолчанию для ниже лежащего устройства; POSIX_FADV_SEQUENTIAL удваивает этот размер, а POSIX_FADV_RANDOM отменяет упреждающее чтение вообще. Эти изменения влияют на весь файл, а не только на указанную его область (но другие открытые обработчики файлов на этом файле не изменяются).
Содержимое буферного кэша ядра может быть очищено через интерфейс /proc/sys/vm/drop_caches, описанный в proc(5).
Можно получить снимок страниц файла, которые располагаются в буферном кэше: открыть файл, отобразить его через mmap(2) и затем применить mincore(2) к отображению.
Обёрточная функция в библиотеке C называется posix_fadvise(). Используемый ей системный вызов называется fadvise64() (на некоторых архитектурах — fadvise64_64()); разница между ними в том, что в библиотечной функциитип аргумента len равен size_t, а у системного вызова — loff_t.
На некоторых архитектурах требуется, чтобы 64-битные аргументы были выровнены в подходящей паре регистров (подробности в syscall(2)). На таких архитектурах показанная в СИНТАКСИСЕ форма вызова posix_fadvise() приводила бы пустой трате регистра для заполнения между аргументами fd и offset. Поэтому на этих архитектурах определена версия системного вызова с исправленным порядком аргументов, иначе используется формат как у posix_fadvise().
Например, начиная с Linux 2.6.14, в ARM есть следующий системный вызов:
long arm_fadvise64_64(int fd, int advice, loff_t offset, loff_t len);
Данные, зависящие от архитектуры, детали, обычно, скрываются от приложений в обёрточной функции glibc posix_fadvise(), которая использует соответствующий архитектуре системный вызов.
В ядрах до версии 2.6.6, если значение len равнялось 0, то это воспринималось дословно как «ноль байт», а не как «все байты до конца файла».
fincore(1), mincore(2), readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)
2019-03-06 | Linux |