Intereting Posts
awk разверните окно до 500% для двух чисел из файла столбца войдите в машину через другую, с (де) сжатием только на концах Редактор для таблиц разметки Использование setfacl позволяет членам группы писать в любой файл в каталоге Где хранятся данные xfce4-notes? Как «подписать» java-программу через chroot? (Fedora 23) Может ли код белого списка Grsec нарушать некоторые его правила? Что такое стандартная графическая карта, поддерживаемая QEMU? Компьютерный терминал и виртуальная консоль Gnome update-notifier не показывает обновления, если пользователь не в группе sudo (Debian Squeeze) Когда пустая строка обозначает текущий каталог? Не удается запустить гаджет Intel power Удалите частичные дубликаты последовательных строк, но сохраните первый и последний Что означает результат «ss -s»? Значение «Total:»? Как получить подробную информацию о каждом из них? Почему мой параметр dconf неожиданно недоступен для записи?

Поведение памяти mmap'd на давление памяти

У меня есть большой файл tar (60 ГБ), содержащий файлы изображений. Я использую mmap() для всего этого файла для чтения в этих изображениях, к которым обращаются случайным образом.

Я использую mmap() по следующим причинам:

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

Вопрос в том, что происходит, когда я читал каждое изображение в этом 60GB-файле? Конечно, не все изображения используются одновременно – они читаются, отображаются, а затем удаляются.

Мой вызов mmap() :

 mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0); 

Возникает вопрос: показывает ли ядро, что я отобразил страницы только для чтения, поддерживаемые файлом, и просто очищает неиспользуемые страницы от давления памяти? Я не уверен, признан ли этот случай. На страницах MAP_NORESERVE указано, что MAP_NORESERVE не потребует резервного пространства подкачки, но, похоже, нет никакой гарантии того, что происходит со страницами под давлением памяти. Есть ли какая-либо гарантия, что ядро ​​очистит мои ненужные страницы до этого, скажем, очистит кеш файловой системы или другой процесс OOM?

Благодаря!

Только для чтения mmap в основном эквивалентен open следующему lseek и read . Если фрагмент памяти, отображаемый в процессе, подкрепляется файлом, копия в ОЗУ считается частью дискового кеша и будет освобождена под давлением памяти, точно так же, как запись в кэш диска, созданная путем read из файла ,

Я не проверял источник, но считаю, что MAP_NORESERVE не имеет значения для сопоставлений только для чтения.