Windows эквивалентна командной строке Linux readahead?
Есть ли эквивалент Windows для системного вызова readahead Linux?
EDIT:
Я хотел бы получить полную функциональную подпись, если это возможно, показывая эквивалентные параметры смещения/счета (или нижний/верхний).
Например:
Подпись функции Linux:
ssize_t readahead(int fd, off64_t *offset, size_t count);
и пример использования -
readahead(file, 100, 500);
Где "файл" - это файловый дескриптор, ранее заданный функцией mmap. Этот вызов считывает 500 байтов с индексом 100.
ИЗМЕНИТЬ 2:
Пожалуйста, прочтите это, если вы не знаете, что такое readahead: http://linux.die.net/man/2/readahead
Ответы
Ответ 1
Да. Это FileSystemControl FSCTL_FILE_PREFETCH
.
Он используется в Windows Vista и выше для предварительной загрузки как при запуске приложения, так и во время загрузки.
Он также используется технологией SuperFetch, которая использует эвристику для загрузки приложений примерно в то время, когда вы обычно используете их.
FSCTL_FILE_PREFETCH
сам не задокументирован в MSDN, но легко определить формат параметра, исследуя вызовы DeviceIoControl
, сделанные при запуске приложения. Просто запустите приложение в отладчике, у которого уже есть .pf файл в каталог c:\Windows\Prefetch
и перерыв на DeviceIoControl
(или если вы используете отладчик ядра, перерыв, когда драйвер NTFS получает свой первый FSCTL_FILE_PREFETCH). Изучите полученный буфер и сравните его с файлом .pf и диапазоном, фактически используемым позже. Я сделал это однажды из любопытства, но не записал детали.
Если вы не знакомы с DeviceIoControl
и IRP_MJ_FILESYSTEM_CONTROL
, вот несколько ссылок, на которые можно посмотреть:
Ответ 2
Я не уверен, правильно ли я понимаю, в том, что вы сказали "Где" файл "- это файловый дескриптор, ранее заданный функцией mmap. Этот вызов составляет 500 байтов при индексе 100. ' Это звучит подозрительно, как поиск смещения и чтение 500 байтов... но вы хотите, чтобы он был предварительно запрограммирован впереди...
В коде C он выглядит примерно так:
fseek(fp, 100, SEEK_CUR);
fread(&data, 500, 1, fp);
Но, предваряя его, я думаю, вы захотите подключить какие-то события, используя waithandles, и когда событие будет поднято, данные будут храниться где-то в буфере...
Честно говоря, я не сталкивался с такой ситуацией, которая делает предварительную выборку данных... но ответ Ray удивил меня, но опять же, это только для Vista вверх, если вы хотите поддерживать совместимость... что что-то иметь в виду... но ссылки ниже могут помочь...
Хорошо, здесь обсуждался blog, библиотека, написанная в Delphi, исходный код здесь, просматривая код здесь, хорошо, это может быть не то, что вы хотите но это может помочь вам указать направление... Извините, если это не то, что вы ищете...
Надеюсь, это поможет,
С наилучшими пожеланиями,
Том.
Ответ 3
Как и в Windows 8, существует более или менее прямой эквивалент madvise(MADV_WILLNEED)
, что фактически одно и то же (Windows имеет унифицированную систему VM/cache).
Предполагая, что у вас есть файл с памятью, вы можете использовать PrefetchVirtualMemory для предварительной выборки.
Это еще немного сложнее, чем вы хотели бы, но не так резко, как DeviceIoControl
. Также обратите внимание, что вы можете легко предварительно выбрать несколько независимых прерывистых диапазонов.