Можно ли динамически изменить с FILE_FLAG_SEQUENTIAL_SCAN на FILE_FLAG_RANDOM_ACCESS? - PullRequest
3 голосов
/ 16 мая 2011

Добрый день! Мы создаем прототип дедупера для Windows / LINUX, используя API-интерфейс для отображения файлов памяти в Windows и Linux. Наш дедупер начинает с последовательного сканирования всех записей базы данных для дедупликации. Поэтому мы передаем флаг FILE_FLAG_SEQUENTIAL_SCAN в Windows API CreateFile во время нашего начального последовательного сканирования записей базы данных, которые должны быть дедуплированы. Как только мы закончим первую часть нашего процесса дедупликации, мы попытаемся использовать API отображения памяти Windows для случайного доступа к данным. На этом этапе, используя Windows C ++ API, возможно ли динамически перейти в режим FILE_FLAG_RANDOM_ACCESS?

In Linux, we are are able to do this with the following excerpt of code, 
  MapPtr = (char*)mmap((void *)BaseMapPtr ,mappedlength,PROT_READ, 
            MAP_PRIVATE,  hFile,baseoff );
                    if (MapPtr == MAP_FAILED){
                        perror("mmap");
                        throw cException(ERR_MEMORYMAPPING,TempFileName);
                    }
 madvise(MapPtr,mappedlength,MADV_RANDOM);

Выплачиваем ли мы штраф в Windows, используя FILE_FLAG_SEQUENTIAL_SCAN на этапе произвольного доступа нашего процесса дедупликации. Спасибо.

Ответы [ 3 ]

5 голосов
/ 17 мая 2011

Флаги подсказок кэширования, передаваемые в CreateFile (), не влияют на способ, которым диспетчер памяти удовлетворяет сбоям страницы, генерируемым путем разыменования адреса в отображенном разделе. Такие операции ввода-вывода используют одни и те же - они используют те же страницы кэша, что и обычные операции ввода-вывода.

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

мне кажется, вам лучше всего просто повторно использовать дескриптор, созданный вами в процессе дедупликации. Закрытие и повторное открытие может привести к удалению ранее кэшированных страниц файла в зависимости от нагрузки на кеш.

3 голосов
/ 16 мая 2011

Описание работы FILE_FLAG_SEQUENTIAL_SCAN можно найти здесь: http://support.microsoft.com/kb/98756

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

0 голосов
/ 04 сентября 2017

Просто для резервного копирования ответа @Burkes: как вы упомянули, что вы «используете API-интерфейс файла сопоставления памяти Windows», следует отметить, что Раймонд Чен предупреждает, что подсказки кеша не влияют на отображаемую память./ O :

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

Так что то, что происходит с уже кэшированным, может помочь, но будущие обращения к памяти не помогут кешубыть заселённым / заселённым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...