Какова максимальная память, доступная для приложения на С++ в 32-разрядной Windows?

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

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

Если приложение С++ пытается запросить более 2 ГБ памяти, это приведет к сбою памяти?

Заключительный вопрос. Если машина, на которой работает приложение С++, уже неактивна в памяти, а приложение С++ запрашивает 100 Мбайт массива (т.е. непрерывную память), совместимо ли это с операционной системой с помощью виртуальной памяти?

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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