Windows, эквивалентный readahead Linux syscall?

Существует ли 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

15
задан caf 26 January 2010 в 23:01
поделиться

2 ответа

Да, это 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, вот несколько ссылок, на которые стоит обратить внимание:

11
ответ дан 1 December 2019 в 04:47
поделиться

Я не уверен, правильно ли я понял, в том, что вы сказали 'Где "file" - это файловый дескриптор, ранее установленный функцией типа mmap. При этом вызове считывается 500 байт с индексом 100. ' Это подозрительно похоже на поиск смещения и чтение 500 байт... но вы хотите, чтобы он был предварительно получен...

В C-коде это выглядело бы примерно так:

fseek(fp, 100, SEEK_CUR);
fread(&data, 500, 1, fp);

Но предварительная выборка, я думаю, вам захочется подключить какие-нибудь события с помощью хэндлов ожидания, и когда событие поднимается, данные сохраняются где-нибудь в буфере...

Честно говоря, я не сталкивался с такой вещью, которая делает предварительную выборку данных... но ответ Рэя удивил меня, но опять же, это только для Vista вверх, если вы хотите сохранить совместимость... это что-то, что нужно помнить... но ссылки ниже могут быть полезны...

Хорошо, был блог обсуждающий это, библиотека, написанная на Delphi, исходный код здесь , просматривая код здесь , хорошо, это может быть не то, что вы хотите, но это может помочь вам указать направление... Извините, если это не то, что вы ищете...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0
ответ дан 1 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: