Какой максимальный объем памяти доступен для приложения C ++ в 32-битной Windows? - PullRequest
12 голосов
/ 16 апреля 2011

Просто интересно, есть ли ограничение на максимальную память, которую использует приложение C ++

Я понимаю, что это 2 ГБ - это правильно?

Если приложение C ++ пытается запросить больше 2 ГБ памяти, это вызывает сбой памяти?

Последний вопрос. Если на машине, на которой запущено приложение C ++, уже недостаточно памяти, а приложение C ++ запрашивает 100 МБ массива (т. Е. Непрерывную память), ОС справится с этой задачей, используя виртуальную память?

Ответы [ 6 ]

14 голосов
/ 16 апреля 2011

Это вызовет сбой динамического выделения памяти, что обычно приводит к сбою приложения, но технически приложение может быть написано так, чтобы оно могло противостоять этому событию. 2 ГБ - это действительно размер пользовательского адресного пространства для отдельного процесса - приложение может использовать несколько процессов (самый простой пример: Chrome). Если приложение запрашивает 100 МБ непрерывной памяти, эта память должна быть практически непрерывной, даже если она физически не непрерывна, и если не хватает доступных смежных страниц, то это неудачное распределение.

Виртуальная память используется всегда - вся память является виртуальной.

2 ГБ - ограничение в большинстве случаев. Что происходит, как правило, 2 ГБ для пользователя и 2 ГБ для ядра, но вы можете попросить Windows выделить 3 ГБ для пользователя и 1 ГБ для ядра (при некотором риске) и на 64-битной, все 4 ГБ 32-битного адресного пространства доступно пользователю. Увеличенное адресное пространство доступно только в том случае, если вы компилируете приложение как /LARGEADDRESSAWARE.

4 голосов
/ 16 апреля 2011

Ограничение зависит от операционной системы. Стандартный Linux - 2 Гб, Solaris - 3 Гб, Windows - (мне сказали) - 2 или 3 в зависимости от того, как используется PAE.

Однако вы не получаете все эти 2G для своих данных. Ваш код возьмет часть этого, и стек вашей программы возьмет некоторые, и библиотека C возьмет некоторые, как и любые другие совместно используемые библиотеки, на которые вы ссылаетесь. Обычно ОС организует код, кучу и стек таким образом, чтобы между ними были преднамеренные пробелы.

Что касается вашего последнего вопроса: это все виртуальная память. На самом деле вы спрашиваете: «Если программы на моем компьютере будут использовать всю эту физическую память, будет ли ОС использовать подкачку». И ответ - да, но не совсем так, как вы думаете.

CPU может обращаться только к физической памяти. Он ничего не знает о данных, хранящихся на диске. Таким образом, чтобы предоставить физическую память запущенному процессу, ОС заберет эту память у другого процесса . Для того, чтобы взять память, он напишет ее для обмена. Когда этот другой процесс должен получить доступ к памяти, ОС зачитывает его обратно, потенциально записывая память какого-либо другого процесса для подкачки.

3 голосов
/ 16 апреля 2011

Несмотря на то, что другие ответы верны в обычном случае, в Windows XP 32-разрядная версия поддерживает более 3 ГБ памяти, используя Расширения адресного окна .

AWE обычно используется серверами баз данных для предоставления им доступа к чрезвычайно большим наборам памяти. Это требует использования Win API для реального управления памятью, поэтому его, очевидно, лучше использовать только тогда, когда это действительно необходимо.

2 голосов
/ 16 апреля 2011

Как правило, 32-разрядная ОС может адресовать только 4 ГБ физической ОЗУ . На практике этот предел имеет тенденцию быть несколько ниже, но может быть уменьшен с использованием виртуальной памяти. В некоторых версиях Windows его можно увеличить с помощью Расширение физического адреса .

Что еще более важно для вашего вопроса, в 32-битной Windows также существует ограничение в 2 ГБ для адресного пространства , доступного для пользовательского приложения. Это накладывает жесткие ограничения на объем памяти, который может использовать одно приложение, независимо от объема доступной физической или виртуальной памяти. Предел по умолчанию 2 ГБ может быть увеличен до 3 ГБ.

Следующая страница подробно объясняет ограничения: http://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx

1 голос
/ 16 апреля 2011

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

В Win 32-разрядных приложениях доступно 2 ГБ виртуального адресного пространства . Это используется для отображения исполняемых файлов и DLL, например, для файлы, отображаемые в память, для стека и кучи. Это пространство обычно несколько фрагментировано. Если ваше приложение построено как «Large Address Aware», а ОС является 64-битной или настроена на разделение памяти в режиме пользователя / ядра на 3/1 ГБ, адресное пространство составляет почти 4 ГБ для 64-битной и 3 ГБ для 32-битной. бит.

Память, которую вы можете выделить , обычно находится в диапазоне 17-1800 МБ. Если вы выделяете небольшие порции, вы достигнете этого, если вы попытаетесь выделить большие последовательные блоки, вы можете достичь предела намного раньше, поскольку ваше адресное пространство фрагментировано.

Смотри, например, Виртуальное адресное пространство в MSDN или Виртуальное адресное пространство в Википедии

0 голосов
/ 07 августа 2016

2 ГБ - ограничение только для 1 процесса.Вы можете распределить свое приложение по N процессам (32-разрядным), чтобы выделить N x 2 ГБ.Операционная система все еще должна быть 64-битной.И вы должны обрабатывать связь между процессами.

...