Подтвердить что ты не робот

Любой способ зарезервировать, но не фиксировать память в Linux?

Windows имеет VirtualAlloc, что позволяет зарезервировать смежную область адресного пространства, но фактически не использует физическую память. Позже, когда вы хотите использовать его (или его часть), вы снова вызываете VirtualAlloc, чтобы зафиксировать область ранее зарезервированных страниц.

На самом деле это действительно полезно, но я хочу, в конечном итоге, подключить мое приложение к Linux, поэтому я не хочу его использовать, если не могу его позже портировать. У linux есть способ сделать это?

EDIT - Use Case

Я подумываю выделить 4 ГБ или некоторые из таких виртуальных адресных пространств, но только для этого 64 Кб одновременно. Это даст мне нулевой экземпляр, чтобы увеличить массив до 4 ГБ. Это важно, потому что типичный двойной размер и копия массива представляет собой случайную неприемлемую задержку для очень больших массивов.

4b9b3361

Ответ 1

mmap специальный файл, например /dev/zero (или используйте MAP_ANONYMOUS) как PROT_NONE, позже используйте mprotect для фиксации.

Ответ 2

Вы можете включить эту функцию в общесистемной системе, используя ядро ​​overcommit. Обычно это значение по умолчанию для многих дистрибутивов.

Вот объяснение http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting

Ответ 3

эквивалент Linux VirtualAlloc() mmap(), который обеспечивает одинаковое поведение. Однако, как отмечает комментатор, резервирование смежной памяти - это поведение вызовов malloc(), пока память не инициализирована (такая как calloc() или код пользователя).

Ответ 4

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

Вы также можете рассмотреть mlock() или mmap() + MAP_LOCKED, чтобы уменьшить влияние пейджинга. Многие процессоры поддерживают огромные (крупные) страницы, страницы размером более 4 КБ. Эти более крупные страницы могут смягчить влияние TLB на потоковое чтение/запись.