Как я могу зарезервировать адреса памяти, не выделяя их - PullRequest
10 голосов
/ 12 октября 2010

Я бы хотел (в * nix) выделить большое, неконтролируемое адресное пространство, но без немедленного использования ресурсов, т. Е. Я хочу зарезервировать диапазон адресов, чтобы выделить его позже.

Предположим, я делаюfoo = malloc (3 *1024* 1024 * 1024) для выделения 3G, но на компьютере 1G с 1G файла подкачки.Это не удастся, верно?

Что я хочу сделать, это сказать: «Дайте мне диапазон адресов памяти foo ... foo + 3G , в который я буду распределять », чтобы я мог гарантироватьвсе распределения в этой области являются смежными, но без непосредственного распределения.

В приведенном выше примере я хочу следовать вызову foo = reserve_memory (3G) с вызовом bar = malloc (123), который должен завершиться успешнотак как reserve_memory еще не потребляет никаких ресурсов, он просто гарантирует, что бар не будет находиться в диапазоне foo ... foo + 3G.

Позже я бы сделал что-то вроде allocate_for_real (foo, 0,234) для потребления байтов0..234 диапазона фу.В этот момент ядро ​​выделит некоторые виртуальные страницы и отобразит их в foo ... foo + 123 + N

Возможно ли это в пользовательском пространстве?

(Смысл в том, что объектыв foo ... должны быть смежными и не могут быть разумно перемещены после того, как они созданы.)

Спасибо.

Ответы [ 2 ]

15 голосов
/ 12 октября 2010

Краткий ответ: это уже работает таким образом.

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

Поведение по умолчанию в Linux - всегда принимать новое распределение, если есть адрес диапазон . Когда вы на самом деле начинаете использовать память, лучше использовать память или, по крайней мере, выполнить ее резервное копирование. Если нет, ядро ​​убьет процесс, чтобы освободить память, обычно процесс, который выделил больше памяти.

Таким образом, проблема в Linux с настройками по умолчанию перенесена с «сколько я могу выделить» на «сколько я могу выделить и тогда останется живым , когда я начну использовать память?»

Вот некоторые информация по теме.

0 голосов
/ 12 октября 2010

Я думаю, простым способом было бы сделать это с большим массивом static.

В любой современной системе это не будет отображаться в существующую память (в исполняемом файле на диске или в ОЗУ).вашей исполнительной машины), если вы действительно не получите к нему доступ.Как только вы получите к нему доступ (и у системы будет достаточно ресурсов), он будет чудесным образом инициализирован для всех нулей.

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

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