Назад | Перейти на главную страницу

Увеличивает ли переключатель / 3GB адресное пространство пользователя на процесс или на все процессы?

Насколько я понимаю, это для каждого процесса, а не для всех процессов. Но, согласно данным, поддержка большой памяти доступна в Windows Server 2003 и Windows 2000 (KB283037):

Как правило, процесс, работающий под Windows 2000 или Windows Server 2003, может получить доступ к адресному пространству памяти до 2 ГБ (при условии, что переключатель / 3GB не использовался), причем часть памяти является физической памятью, а часть - виртуальной памятью. Чем больше программ (и, следовательно, больше процессов) запущено, тем больше памяти вы выделяете до полных 2 ГБ адресного пространства.

Для меня это говорит о том, что чем больше программ вы запустите, тем больше шансов, что вы достигнете предела адресного пространства в 2 ГБ, т.е. программа A использует 500 МБ, программа B использует 1 ГБ, поэтому у вас есть только 500 МБ адресного пространства для остальных ваших программ.

Однако статья MSDN http://msdn.microsoft.com/en-us/library/ms189334.aspx называет это адресным пространством процесса и для меня подразумевает, что каждый приложение получает свое своя адресное пространство, будь то 2 ГБ или 3 ГБ, в зависимости от того, какой переключатель используется в boot.ini.

Так это на процесс или на весь процесс? И является ли статья базы знаний неправильной (или плохо сформулированной)?

(Обратите внимание, я говорю только о 32-битных системах)

Это виртуальное адресное пространство на каждый процесс, как указано в статье MSDN, и в превосходной серии статей по этому поводу, написанных Раймондом Ченом и заархивированных в его блоге.

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

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

Этот волшебный бит предназначен для поддержки "Large Address Aware".

В большинстве программ Microsoft (я думаю) этот бит включен по умолчанию.

В Интернете есть инструмент LaaTIDO, который включает этот бит. Я использовал этот инструмент, чтобы включить поддержку больших адресов для Tomcat & Sun JDK, работающего в Windows.

Проблема с этим флагом заключается в том, что некоторые программисты не знают, что размер ячейки памяти может превышать ограничение в 2 ГБ, что может вызвать некоторые неприятные ошибки в приложении. И позвольте мне объяснить, почему ...

Указатель на адрес в ОЗУ похож на 32-разрядное целое число со знаком в некоторых языках. Подпись означает, что она может быть положительной или отрицательной. Теперь, чтобы проверить, назначен ли указатель или нет, вы проверяете, равен ли он NULL / nil или нет. Если он не нулевой, он чему-то назначен. Некоторые программисты проверяют это, проверяя, больше ли адрес нуля, таким образом, они забывают о возможности того, что адреса могут быть отрицательными. Поскольку отрицательный указатель меньше нуля, система будет думать, что он не назначен, и, таким образом, повторно присвоит ему новое значение, потеряв его текущее значение и потеряв память.

К счастью, большинство программистов научились проверять, равно ли оно или нет, а не больше нуля. В этом случае приложение без проблем использует до 3 ГБ.