Как я могу выделить память в Linux, которая соответствует требованиям подкачки и кэширования? - PullRequest
0 голосов
/ 17 апреля 2011

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

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

Так как я могу ...

  • ... запросить, чтобы память была не кэшируемой или не записываемой?
  • ... запросить размещение памяти на большой странице?

Я работаю в Linux.

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Отключение кэширования звучит так, как если бы оно вызывало замедление записи, если оно вызывает запись в ОЗУ.Я не уверен, что попытался бы сделать это вообще.

Чтобы использовать большие страницы, я предлагаю следующее: HugeTLB - Поддержка больших страниц в ядре Linux .Он содержит пример того, как вы можете использовать большие страницы через сегмент общей памяти.

0 голосов
/ 08 июля 2017

С прозрачными огромными страницами, просто выделение 4M-выровненного буфера будет работать.Используйте aligned_alloc или posix_memalign, чтобы получить указатель, который вы можете free.(Обратите внимание, что aligned_alloc требуется для сбоя, если размер буфера не кратен выравниванию. /Facepalm).

В зависимости от настроек /sys/kernel/mm/transparent_hugepage/defrag, вам может потребоваться использовать madvise(MADV_HUGEPAGE)в буфере, чтобы настоятельно рекомендовать ядру использовать огромные страницы.

Также обратите внимание, что x86-64 использует 2M огромных страниц.x86-32 использует 4M огромных страниц.Если вы хотите простое решение для обеих сторон, то можно настроить 4M.


запросить, чтобы память была либо не кэшируемой, либо доступной для записи?

AFAIK, выне может легко сделать это через обычные API Linux. NT хранит для нормальной работы с обратной записью, так что используйте это вместо этого.(Они переопределяют тип памяти и слабо упорядочены в обход кэша.)

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

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