2 ГБ действительно мой максимум? - PullRequest
36 голосов
/ 11 марта 2011

Адресное пространство процесса говорит, что мое приложение .NET может использовать максимум 2 ГБ в Windows XP. Это правда?

Но что, если бы у меня был 20-терабайтный жесткий диск. Разве он не сможет использовать часть этого дискового пространства?

Ответы [ 2 ]

166 голосов
/ 11 марта 2011

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

Вот как это действительно работает.

Каждому процессу в 32-битной Windows предоставляется 4 ГБ адресного пространства .

Из этого 4 ГБ адресного пространства 2 ГБ зарезервировано для использования операционной системой, а остальные 2 ГБ доступны для пользовательского кода, который будет использоваться в процессе по своему усмотрению.

Теперь позвольте мне быть предельно ясным по этому вопросу: адресное пространство не является памятью . Процесс может иметь столько памяти , сколько ему нужно. Я повторю еще раз: процессу может быть выделено более 4 ГБ памяти . Пределом является то, что только 2 ГБ этой памяти может быть сопоставлено с адресным пространством пользовательского режима в любое время .

Я не упоминал RAM, потому что RAM не имеет отношения к вопросу адресного пространства . Не имеет значения, хранит ли операционная система память процесса в оперативной памяти, на диске или где-либо еще. ОЗУ - это просто оптимизация производительности, которая позволяет операционной системе хранить память в быстром чипе, а не в медленном диске.

Ваш процесс сообщает операционной системе, сколько памяти ей требуется, и где сопоставить эту память с адресным пространством 2 ГБ. Если процессу требуется более 2 ГБ памяти, он не сможет отобразить все это в адресное пространство; такой процесс либо должен быть написан с умом, чтобы сообщить операционной системе, какие страницы памяти отображать и удалять из адресного пространства, либо использовать меньше памяти. Если этого не произойдет, произойдет сбой с исключением из-за нехватки памяти.

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

Что если каждый в здании попытается припарковать десять машин в оперативной памяти? Если автостоянка будет заполнена, им придется поменять некоторые из этих машин в гараже по улице. Означает ли это, что у них нет ключей на связках ключей? Нет, очевидно, нет. Это просто замедляет, когда они хотят вести машину, припаркованную на диске.

Что, если бы была служба камердинера, которая выяснила, какие автомобили люди будут чаще использовать, и перевезла менее использованные в гараж по улице? Это диспетчер памяти, который помещает менее часто используемые страницы памяти в файл подкачки.

Вы указываете, что у вас большой диск. Предположим, у вас есть файл 10 ГБ на этом диске. Конечно, вы можете использовать содержимое этого файла в вашей .NET-программе, но вы не можете загрузить все это в непрерывное адресное пространство сразу. Вы должны прочитать это кусками. Если бы вы были умны, вы могли бы отобразить его в оперативную память одновременно - у вас достаточно памяти - но вы не могли бы тогда отобразить 10 ГБ память на 2 ГБ адресного пространства .

В общем, проще не пытаться получить столько памяти в первую очередь; просто прочитайте его по несколько сотен килобайт за раз.

Люди очень часто путают адресное пространство с физической памятью, но десятилетиями они не были тем же самым. Для получения более подробной информации см. Мою статью на эту тему, «Недостаточно памяти» не относится к физической памяти .

13 голосов
/ 14 марта 2011

Эрик Липпертс на 100% прав, и вы должны сначала прочитать его, но я хочу добавить пару вещей:

  • Вы можете увеличить ограничение адресного пространства в пользовательском режиме до 2 ГБ до 3 ГБ, используя так называемый / 3G-переключатель - это параметр на машину , который уменьшает адресное пространство используется операционной системой до 1 ГБ (от 2 ГБ), освобождая дополнительные 1 ГБ для использования в адресном пространстве пользовательского режима.
  • Если вы запускаете 32-битный процесс в 64-битной операционной системе, то максимальный предел адресного пространства в режиме пользователя увеличивается до 4 ГБ (даже если ваше приложение скомпилировано как 32-битный процесс) - это может будет полезно, если (например) вы ограничены нацеленностью на архитектуру x86 из-за того, что некоторые ссылки остаются 32-битными.

Обратите внимание, что оба из вышеуказанных решений требуют, чтобы был установлен флаг IMAGE_FILE_LARGE_ADDRESS_AWARE. См. Как создать (32-разрядное) приложение .NET для использования 3 ГБ ОЗУ? , чтобы получить некоторые советы о том, как вы можете сделать это для приложения .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...