Что произойдет, если какому-то процессу потребуется выделить более 2 ГБ памяти?

Насколько мне известно, любой процесс в Windows получает 2 ГБ адресного пространства виртуальной памяти (в некоторых случаях 3 ГБ) для использования в распределении.

  1. В каких случаях процесс получит 3 ГБ, а не 2 ГБ? Есть ли способ у разработчика приложения «попросить» ОС выделить более 2/3 ГБ виртуального адресного пространства?

  2. Что будет, если для процесса потребуется более 3/2 ГБ? (Я предполагаю, что в системе возникнет какое-то «исключение нехватки памяти» - но есть ли способ избежать этого случая?)

например - что произойдет, если процесс - это «Microsoft SQL Server», которому нужно выделить гораздо больше, чем 2/3 ГБ


person Yanshof    schedule 26.06.2012    source источник


Ответы (2)


32-битный процесс имеет адресное пространство 4 ГБ, где обычно 1 ГБ зарезервировано для оборудования, а 1 ГБ зарезервировано для Windows. Используя переключатель в boot.ini, вы можете заставить Windows предоставить процессу 3 ГБ адресного пространства.

64-битный процесс имеет адресное пространство 16 ПБ. Я не знаю, сколько из них зарезервировано, но используемое адресное пространство значительно больше 2 или 3 ГБ.

person Guffa    schedule 26.06.2012
comment
Представьте себе воображаемый случай, когда процессу нужно больше MAX (addredd_Space_That_Was_Allocated) = ››, что произойдет? и как избежать исключения? ( если это возможно ? ) - person Yanshof; 26.06.2012
comment
@Yanshof для этого сценария, вы действительно говорите только о x86, и ответ: вы не можете. Единственное, что вы могли бы попробовать, - это создать где-то еще один процесс и перетасовать данные между ними, но: если ОС также x86, у нее действительно больше нигде не было самой, чтобы получить дополнительное адресное пространство из. - person Marc Gravell; 26.06.2012
comment
@Yanshof: невозможно выделить больше памяти, чем адресное пространство, просто больше нет адресов, которые процесс мог бы использовать для доступа к памяти. Вам необходимо изменить настройки и перезапустить приложение, если вам нужно адресное пространство 3 ГБ. Если вы выделяете слишком много памяти, вы либо получите исключение, либо процесс будет закрыт, в зависимости от того, что это за приложение. (Веб-приложение, работающее в IIS, гораздо более ограничено, чем настольное приложение.) - person Guffa; 26.06.2012
comment
Фактически, в 32-битной серверной версии Windows вы можете выделить больше памяти, чем адресное пространство. См. msdn.microsoft.com / ru-ru / library / windows / desktop / - person Harry Johnston; 28.06.2012

Насколько мне известно, любой процесс в Windows получает 2 ГБ адресного пространства виртуальной памяти (в некоторых случаях 3 ГБ) для использования в распределении.

Нет, на x64 пространство виртуальной памяти намного больше, поэтому такие инструменты, как SQL Server, обычно лучше всего работают на x64.

Обратите внимание, что в текущей версии .NET существуют ограничения на отдельные объекты (строки, массивы и т. Д.) До 2 ГБ, но, похоже, скоро это исчезнет (с учетом массивных объектов). См. gcAllowVeryLargeObjects.

person Marc Gravell    schedule 26.06.2012
comment
Хорошо, так что еще раз (просто для понимания моей системы) - что, если процессу нужно больше виртуального адресного пространства, чем предоставила ОС? - person Yanshof; 26.06.2012
comment
Я понял комментарий к gcAllowVeryLargeObjects, чтобы означает, что он собирался только ослабить ограничение на размер массивов - если это то, о чем вы имели в виду? - person Damien_The_Unbeliever; 26.06.2012
comment
Массивы @Damien_The_Unbeliever неявно также означают списки, поскольку списки поддерживаются массивами. - person Marc Gravell; 26.06.2012
comment
Но вы говорите (строки, массивы и т. Д.), Тогда как на этой странице говорится: максимальный размер для строк и других объектов, не являющихся массивами, не изменился. - person Damien_The_Unbeliever; 26.06.2012
comment
@Yanshof ОС не должна выделять все это из физической памяти; есть и пространство подкачки ... но в конечном итоге либо ОС предоставит выделение, либо нет. Ключевой момент: на x64 нет ограничения 2 ГБ / 3 ГБ на процесс. - person Marc Gravell; 26.06.2012
comment
@Damien_The_Unbeliever единственное интересное, что есть, - это струны. - person Marc Gravell; 26.06.2012