Существует ли Windows, эквивалентный readahead Linux syscall?
Править:
Я хотел бы полную функциональную подпись, если это возможно, показывая эквивалентные параметры смещения/количества (или более низкий/верхний).
Например: подпись функции 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
Да, это 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
, вот несколько ссылок, на которые стоит обратить внимание:
Я не уверен, правильно ли я понял, в том, что вы сказали 'Где "file" - это файловый дескриптор, ранее установленный функцией типа mmap. При этом вызове считывается 500 байт с индексом 100. ' Это подозрительно похоже на поиск смещения и чтение 500 байт... но вы хотите, чтобы он был предварительно получен...
В C-коде это выглядело бы примерно так:
fseek(fp, 100, SEEK_CUR); fread(&data, 500, 1, fp);
Но предварительная выборка, я думаю, вам захочется подключить какие-нибудь события с помощью хэндлов ожидания, и когда событие поднимается, данные сохраняются где-нибудь в буфере...
Честно говоря, я не сталкивался с такой вещью, которая делает предварительную выборку данных... но ответ Рэя удивил меня, но опять же, это только для Vista вверх, если вы хотите сохранить совместимость... это что-то, что нужно помнить... но ссылки ниже могут быть полезны...
Хорошо, был блог обсуждающий это, библиотека, написанная на Delphi, исходный код здесь , просматривая код здесь , хорошо, это может быть не то, что вы хотите, но это может помочь вам указать направление... Извините, если это не то, что вы ищете...
Надеюсь, это поможет, С наилучшими пожеланиями, Том.