Любой способ зарезервировать, но не фиксировать память в Linux?
В Windows есть VirtualAlloc, который позволяет резервировать непрерывную область адресного пространства, но фактически не использовать физическую память. Позже, когда вы захотите использовать его (или его часть), вы снова вызываете VirtualAlloc для фиксации области ранее зарезервированных страниц.
Это действительно очень полезно, но я хочу в конечном итоге перенести свое приложение на linux, поэтому я не хочу использовать его, если не смогу портировать его позже. Есть ли у Linux способ сделать это?
РЕДАКТИРОВАТЬ - вариант использования
Я думаю о выделении 4 ГБ или о чем-то подобном виртуальном адресном пространстве, но только выделении 64 КБ за раз. Это дало бы мне возможность без копирования скопировать массив до 4 ГБ. Что важно, потому что типичное удвоение размера массива и копирования вносит, казалось бы, случайную неприемлемую задержку для очень больших массивов.
4 ответа
Вы можете включить эту функцию для всей системы, используя overcommit ядра. Обычно это настройка по умолчанию во многих дистрибутивах.
Вот объяснение http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting
Linux-эквивалент VirtualAlloc() - это mmap (), который обеспечивает такое же поведение. Однако, как указывает комментатор, резервирование смежной памяти - это поведение вызовов malloc () до тех пор, пока память не инициализируется (например, с помощью calloc () или пользовательского кода).
"Казалось бы, случайная недопустимая задержка для очень больших массивов
Вы также можете рассмотреть mlock() или mmap() + MAP_LOCKED
смягчить влияние подкачки. Многие процессоры поддерживают огромные (или большие) страницы, страницы размером более 4 КБ. Эти большие страницы могут смягчить влияние TLB на потоковое чтение / запись.