Если я попытаюсь выделить память:
int ramSize = magicLibrary.getRamSize();
assert(ramSize*2 <= pow(2,64-8));//Don't overflow the 64 bit limit (32 on some systems).
int * mainData new int[ramSize*2/sizeof(int)]; //2 times too big.
Получу ли я замену диска, чтобы заполнить пространство? Если нет, как я могу использовать своп?
Пока ни ОЗУ, ни пространство подкачки не будут полностью исчерпаны, а ограничения адресного пространства (то есть 2-3 ГБ в 32-разрядной системе больше, чем у оперативной памяти в 64-разрядной системе) позволяют системе выделять память. Если ОЗУ исчерпано, система будет использовать пространство подкачки.
Иногда ОС также допускает «чрезмерную загрузку», что в основном аналогично тому, как это делают авиакомпании, когда они «ожидают, что некоторые пассажиры не появятся», поэтому они продают несколько дополнительных билетов на этот рейс и беспокоятся о «всех местах заполненных». когда они доберутся до этой точки. С точки зрения компьютеров это означает, что ОС вполне может позволить вам выделить больше памяти, чем там на самом деле доступно, а ошибка «недостаточно» решается позже с помощью некоторых средств (как правило, путем освобождения некоторой памяти, которая «запасной» или «убить какое-то случайное приложение»). Причина, по которой ОС допускает это, заключается в том, что приложения довольно часто выделяют большие области памяти, которые используются не полностью. Области памяти, заполненные нулями, также могут быть «объединены» как память «копировать при записи», так что если вы позже запишете в нее, она создаст новую копию этой памяти. Это также может означать, что если вы выделяете большой объем памяти, вам действительно нужно что-то записать (кроме нуля?), Чтобы сделать его «используемым». Опять же, это отражает типичное поведение приложений: «выделять большой объем памяти, заполнять его нулями и использовать только часть из этого позже» — поэтому ОС пытается «сэкономить пространство», не имея огромного количества «страниц с просто нули в них «.
Обратите внимание: независимо от того, находится ли память в оперативной памяти или подкачка, это динамический критерий — память постоянно выгружается и выгружается, и программный код и данные могут выгружаться в любое время, а затем возвращаться при необходимости. Не имеет значения, является ли это «кучей» или какой-либо другой памятью, вся память в этом отношении в значительной степени одинакова.
Не совсем понятно, чего вы на самом деле хотите достичь, но, надеюсь, это объясняет, по крайней мере, что происходит.
Ох, и предполагая ramSize
это число байтов, это почти наверняка всегда ложно:
assert(ramSize*2) <= 2^(64-8)
поскольку ramSize * 2 > 0
, а также (2 XOR 56) = 0
,
Прежде всего, new
ничего не знает о свопе. Это задача операционной системы (по крайней мере, для операционных систем общего назначения, таких как те, с которыми вы работаете), и она будет решать, когда менять и что менять.
С учетом сказанного, ваша попытка выделить столько памяти почти наверняка потерпит неудачу. Даже если доступно достаточно подкачки, операционная система резервирует большие фрагменты виртуальное адресное пространство для себя это означает, что то, что вы можете выделить, ограничено. Например, в 32-битной Windows 2 ГБ адресов зарезервировано для ядра, и вы не сможете выделить 4 ГБ виртуальной памяти, если попытаетесь, потому что их недостаточно адреса доступны для представления, что много памяти.
Что ты на самом деле пытаешься сделать?
Короче говоря, пространство подкачки — это часть виртуальной памяти на жестком диске, используемая при заполнении ОЗУ. И это задача ОС заботиться не о новом операторе!
Если вы используете new
операционная система получает запрос на память.
Затем он решает, где взять эту память.
Это так же, как при открытии файла или повторении с cout. Эти вещи встроены в C ++.
Так что ваши программы могут уже использовать своп, но вы не знали об этом.
Если вы хотите узнать больше об этом предмете, вы можете посмотреть внутреннюю работу Unix (мать и отец каждой операционной системы, используемой в настоящее время).