Подтвердить что ты не робот

Является ли 2 ГБ действительно моим максимумом?

Process Address Space сообщает, что мое приложение .NET в большинстве случаев может использовать только 2 GB в Windows XP. Это правда?

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

4b9b3361

Ответ 1

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

Вот как это работает.

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

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

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

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

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

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

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

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

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

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

Чрезвычайно часто люди путают адресное пространство с физической памятью, но на протяжении десятилетий они не были одинаковыми. Более подробную информацию см. В моей статье на эту тему, "Out Of Memory" не относится к физической памяти.

Ответ 2

Ответ Eric Lipperts на 100% прав, и сначала вы должны прочитать это, но мне нужно добавить несколько вещей:

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

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