Любой способ зарезервировать, но не фиксировать память в Linux? - PullRequest
30 голосов
/ 06 мая 2010

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

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

РЕДАКТИРОВАТЬ - вариант использования

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

Ответы [ 4 ]

29 голосов
/ 06 мая 2010

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

5 голосов
/ 06 мая 2010

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

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

4 голосов
/ 06 мая 2010

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

1 голос
/ 06 мая 2010

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

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

...