Может ли 32-битный процесс получить доступ к большему объему памяти в 64-битной ОС Windows? - PullRequest
8 голосов
/ 20 февраля 2009

Из того, что я понимаю, 32-битный процесс может получить доступ только к 2 ГБ памяти в 32-битных окнах без ключа / 3 ГБ, и что часть этой памяти используется ОС по собственным дьявольским причинам. Это похоже на мой опыт, так как у нас есть приложение, которое аварийно завершает работу, когда оно достигает около 1,2–1,5 ГБ ОЗУ с исключениями нехватки памяти, даже несмотря на то, что памяти все еще достаточно.

У меня вопрос: переместит ли это 32-битное приложение в 64-битные окна доступ к более чем 1,5 ГБ памяти или около того, что он может теперь? Или само приложение должно быть обновлено до 64-битной версии?

Ответы [ 4 ]

12 голосов
/ 20 февраля 2009

Более новые версии Visual Studio имеют новый флаг, который делает 32-битные приложения «осведомленными о большом адресном пространстве». По сути, он говорит, что если он загружен в 64-разрядной версии Windows, он получит 4 ГБ (ограничение 32-разрядных указателей). Это, безусловно, лучше, чем 2 или 3 ГБ, которые вы получаете в 32-битных версиях Windows. Смотри http://msdn.microsoft.com/en-us/library/aa366778.aspx:

В частности, это говорит:

Ограничения на память и адресное пространство зависит от платформы, операционной системы, и ли IMAGE_FILE_LARGE_ADDRESS_AWARE value структуры LOADED_IMAGE и Используется настройка на 4 гигабайта (4GT). IMAGE_FILE_LARGE_ADDRESS_AWARE установлено или очищены с помощью Параметр компоновщика / LARGEADDRESSAWARE.

Также см .: http://msdn.microsoft.com/en-us/library/wz223b1z.aspx

4 голосов
/ 20 февраля 2009

Да, при правильных обстоятельствах 32-разрядный процесс в Windows может получить доступ к полному 4 ГБ памяти, а не к 2 ГБ, как это обычно ограничено.

Чтобы это работало, вам нужно следующее:

  • Приложение должно работать в 64-битной ОС
  • Приложение должно быть скомпилировано с флагом / LARGEADDRESSAWARE.
  • Приложение должно быть проверено, чтобы убедиться, что оно действительно работает в этом случае. ;) (в частности, код, который опирается на все указатели, указывающие на адреса ниже границы 2 ГБ, здесь явно не будет работать)
1 голос
/ 20 февраля 2009

WOW64 позволяет использовать 32-битное приложение Windows в 64-битной Windows, переводя 32-битные указатели в настоящие 64-битные указатели. А на самом деле 32-битная адресация должна позволять доступ к 4 ГБ памяти.

1 голос
/ 20 февраля 2009

Ваше приложение будет ограничено размером указателя, в вашем примере 32 бита.

Если бы ваше приложение получило доступ к большему количеству памяти, вам понадобилась бы какая-то архитектура с сегментированной памятью, как у нас в 16-битных днях, когда приложения использовали 16-битные указатели и смещения для доступа к полному 32-битному пространству памяти.

...