2013-12-25 2 views
0

Я хочу реализовать интерполяционный поиск на большом массиве. Одна из возможных оптимизаций - коснуться адресов памяти, которые сначала загружены в основную память (прикосновение к ним не вызывает жесткой ошибки страницы). Например, если мне нужно читать данные по индексу X, я могу проверить, находится ли эта страница в основной памяти, если это не так - я могу проверить одну из соседних страниц, которая уже находится в памяти.Проверка состояния страницы памяти программно

Для загрузки этой страницы по адресу (X & 0xFFFFFFFFFFFE0000) (или нет) мне нужен механизм. Или лучше - мне нужно получить список загруженных страниц в пределах некоторого диапазона адресов или что-то в этом роде.

Возможно ли в коде пользовательского пространства на linux или windows (приложение является crossp-latform)? На данный момент я просто использую LRU-кеш последних затронутых адресов памяти в надежде, что операционная система не поменяет недавно используемые страницы памяти.

ответ

1

В Win32 Api

Посмотрите на функцию QueryWorkingSet запросить состояние памяти процесса.

В качестве эффективного способа загрузки страниц физической памяти см PrefetchVirtualMemory

Самый низкий уровень, кросс-платформенный API совместимы с ОС Windows и Linux, что я знаю, это POSIX спецификации.

Также я рекомендую вам взглянуть на функции памяти numa Win32 и строки кеша intel и коды памяти L2. Это очень сложный материал, но он может значительно увеличить производительность чтения/записи памяти (если это основная задача).

+0

QueryWorkingSet или QueryWorkingSetEx не предоставляют эту информацию. – egur

+0

Теоретически рабочий набор находится в физической памяти, проверьте эту страницу: http://msdn.microsoft.com/en-us/library/windows/desktop/cc441804%28v=vs.85%29.aspx –

+0

QueryWorkingSet - это то, что Мне нужно. Знаете ли вы, что такое POSIX-аналог этого API? – Lazin

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

  • Нет связанных вопросов^_^