Windows эквивалентна системному вызову readahead в Linux? - PullRequest
15 голосов
/ 26 января 2010

Существует ли Windows, эквивалентная системному вызову readahead в Linux?

EDIT:

Я хотел бы, чтобы, если это возможно, подпись полной функции, показывающая эквивалентные параметры смещения / счетчика (или ниже / выше).

Например: Подпись функции Linux:

ssize_t readahead(int fd, off64_t *offset, size_t count);

и пример его использования:

readahead(file, 100, 500);

Где «file» - дескриптор файла, ранее установленный функцией, такой как mmap. Этот вызов читает 500 байтов в индексе 100.

РЕДАКТИРОВАТЬ 2: Пожалуйста, прочитайте это, если вы не уверены, что делает readahead: http://linux.die.net/man/2/readahead

Ответы [ 3 ]

11 голосов
/ 26 января 2010

Да. Это 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, вот несколько ссылок, на которые можно посмотреть:

1 голос
/ 25 июля 2013

Начиная с Windows 8, существует более или менее прямой эквивалент madvise(MADV_WILLNEED), что фактически является тем же (Windows имеет унифицированную систему VM / кэш).

Предполагая, что файл отображен в память, вы можете использовать PrefetchVirtualMemory для его предварительной выборки.

Это все еще немного сложнее, чем хотелось бы, но не так резко, как DeviceIoControl. Также обратите внимание, что вы можете легко выбрать несколько независимых прерывистых диапазонов.

0 голосов
/ 26 января 2010

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

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

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

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

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

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

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

...