2012-05-03 4 views
1

Я отобразил файл в память, используя mmap. Теперь я хотел бы убедиться, что при доступе к этой памяти не будет ошибок страниц, то есть я хочу заставить систему фактически прочитать данные из жесткого диска и сохранить их в ОЗУ. Я считаю, , что, как только данные есть, я могу предотвратить обмен с mlockall. Но что такое способ получить систему для загрузки данных?Принудительная загрузка mmap-страниц

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

Любые предложения?

+1

Зачем вы хотите это сделать? Если вы хотите делать фиктивные чтения, просто выполняйте их с помощью указателя 'volatile', который не позволит компилятору их оптимизировать. –

+0

@AdamRosenfield Мне нужна производительность в реальном времени. волатильность, вероятно, будет работать, но суть моего вопроса в том, как * избегать * фиктивных чтений. – Nikratio

+1

Почему вы думаете, что 'mlock()'/'mlockall()' не будет работать? Гарантировать, что затронутые страницы в оперативной памяти - это именно то, для чего это необходимо. – Celada

ответ

4

Вы ищете MAP_POPULATE.

+0

Это действительно то, что я хочу, спасибо! Это немного раздражает, что он конфликтует с MAP_SHARED. – Nikratio

+0

@ Никратио: Где вы видите, что они конфликтуют? –

+0

mmap manpage: «MAP_POPULATE поддерживается только для частных сопоставлений с Linux 2.6.23». – Nikratio

5

Почему, по вашему мнению, mlock() или mlockall() не работает? Гарантировать, что затронутые страницы находятся в ОЗУ, является именно тем, что его цель. Цитата из справочной системы:

Все страницы, которые содержат часть указанного диапазона адресов, гарантированно будут находиться в ОЗУ при успешном завершении вызова; страницы гарантированно останутся в ОЗУ до тех пор, пока они не будут разблокированы.

Вы можете использовать другие методы, как madvise() к спросить для страниц, которые будут загружены в оперативную память, но это не гарантирует, что ядро ​​будет соответствовать, что и это не гарантирует, что они будут оставаться в памяти, даже если ядро ​​делает принесите их. Я считаю, что mmap(MAP_POPULATE) также не гарантирует, что страницы останутся в ОЗУ.

Смежные вопросы