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

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

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

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

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

12 голосов | спросил Jack Kada 16 PMpSat, 16 Apr 2011 16:28:05 +040028Saturday 2011, 16:28:05

6 ответов


0

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

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

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

ответил Puppy 16 PMpSat, 16 Apr 2011 16:36:37 +040036Saturday 2011, 16:36:37
0

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

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

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

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

ответил Anon 16 PMpSat, 16 Apr 2011 16:36:22 +040036Saturday 2011, 16:36:22
0

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

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

ответил Chris Pitman 16 PMpSat, 16 Apr 2011 16:54:59 +040054Saturday 2011, 16:54:59
0

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

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

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

ответил NPE 16 PMpSat, 16 Apr 2011 16:36:36 +040036Saturday 2011, 16:36:36
0

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

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

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

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

ответил Erik 16 PMpSat, 16 Apr 2011 16:35:33 +040035Saturday 2011, 16:35:33
0

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

ответил slyy2048 7 AM000000110000000131 2016, 11:12:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132