Какой объем памяти может получить доступ 32-битный процесс в 64-битной операционной системе?

86

В Windows в обычных условиях 32-разрядный процесс может получить доступ только к 2 ГБ ОЗУ (или к 3 ГБ с помощью специального переключателя в файле boot.ini). Сколько памяти доступно при запуске 32-битного процесса в 64-битной операционной системе? Есть ли какие-то специальные переключатели или настройки, которые могут это изменить?

jjxtra
источник

Ответы:

92

По умолчанию 2 ГБ. Если приложение поддерживает большое адресное пространство (связано с / LARGEADDRESSAWARE), оно получает 4 ГБ (а не 3 ГБ, см. Http://msdn.microsoft.com/en-us/library/aa366778.aspx )

Они по-прежнему ограничены 2 ГБ, поскольку многие приложения зависят от нулевого верхнего бита указателей.

Майкл
источник
5
Может кто-нибудь объяснить, почему процессы не могут получить доступ ко всем 4 ГБ?
BlueTrin 07
1
Что вы имеете в виду? Если вы создадите его самостоятельно, вы можете использовать флаг / LARGEADDRESSAWARE и заставить его работать с 4 ГБ, если вы этого не сделали, вы находитесь во власти разработчиков, которые это сделали.
SilverbackNet
Потому что указатель может опасно интерпретироваться как дополнение до двух?
rosstex 09
1
Под этим - since many application depends on the top bit of pointers to be zeroвы имеете в виду, что 32-й бит схемы адресации не учитывается и не используется при обходе адресного пространства процесса.
RBT
21

4 ГБ за вычетом того, что используется системой, если связать с / LARGEADDRESSAWARE.

Конечно, вам следует быть еще более осторожным с арифметикой указателей, если вы установите этот флаг.

MSN
источник
-1: Система будет использовать для себя 64-битные адреса, поэтому нет необходимости что-то вычитать,
Томас Веллер,
@ThomasW., Это неправда, по крайней мере, в Windows. WOW64 по-прежнему требует 32-битных преобразователей для 64-битных системных вызовов. См. Msdn.microsoft.com/en-us/library/windows/desktop/…
MSN
1
Вы имеете в виду те 605 Кбайт DLL? Извините, я не понял этого, так как вопрос был больше о ГБ памяти.
Thomas Weller
7
@ThomasW., Поэтому я сказал «минус то, что используется системой».
MSN
FYI Link мертв на этом
jjxtra
14

Кажется, никто не затрагивает тот факт, что если у вас много разных 32-битных приложений, подсистема wow64 может отображать их в любом месте памяти выше 4G, поэтому в 64-битных окнах с достаточным объемом памяти вы можете запускать гораздо больше 32-битных приложений чем на родной 32-битной системе.

Вред десять напел
источник
7
Вы говорите о физической RAM, а OP говорит о виртуальной памяти. Даже в 32-битных системах вы можете запускать множество приложений, если ваш файл подкачки достаточно велик.
Thomas Weller
8

32-битный процесс по-прежнему ограничен теми же ограничениями в 64-битной ОС. Проблема в том, что указатели памяти имеют ширину всего 32 бита, поэтому программа не может назначить / разрешить любой адрес памяти, превышающий 32 бита.

Бен С
источник
4
Это было бы полезно, если бы вы четко указали, что 32 бита адресуют 4 ГБ пространства.
Engineer
4

Один 32-битный процесс в 64-битной ОС ограничен 2 Гб. Но если он скомпилирован в EXE-файл с IMAGE_FILE_LARGE_ADDRESS_AWAREустановленным битом, он имеет ограничение в 4 ГБ, а не 2 ГБ - см. Https://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

То, что вы слышите о специальных загрузочных флагах, 3 ГБ, /3GBпереключателях или /uservaвсе о 32-разрядных операционных системах, не применимо к 64-разрядной Windows.

См. Https://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx для получения дополнительных сведений.

Что касается 32-битных операционных систем, вопреки распространенному мнению, для 32-битных операционных систем нет физического ограничения в 4 ГБ. Например, 32-разрядные серверные операционные системы, такие как 32-разрядная версия Microsoft Windows Server 2008, могут получить доступ к 64 ГБ.(Windows Server 2008 Enterprise и Datacenter editions) - с помощью расширения физического адреса (PAE), которое впервые было введено Intel в Pentium Pro, а затем AMD в процессоре Athlon - он определяет иерархию таблицы страниц из трех уровней, с записями таблицы по 64 бита вместо 32, что позволяет этим процессорам напрямую обращаться к физическому адресному пространству размером более 4 гигабайт - так что теоретически 32-битная ОС может получить доступ к 2 ^ 64 байтам теоретически или 17 179 869 184 гигабайтам, но сегмент ограничено 4 ГБ. Однако по маркетинговым причинам Microsoft ограничила максимально доступную память в несерверных операционных системах до 4 ГБ или даже 3 ГБ. Таким образом, один процесс может получить доступ к более чем 4 ГБ в 32-разрядной ОС - примером является сервер Microsoft SQL.

32-битные процессы в 64-битной Windows не имеют недостатков по сравнению с 64-битными процессами в использовании общего виртуального адресного пространства ядра (также называемого системным пространством ). Все процессы, будь то 64-битные или 32-битные, в 64-битной Windows используют одно и то же 64-битное системное пространство.

Учитывая тот факт, что системное пространство совместно используется всеми процессами , в 32-разрядной Windows процессы, которые создают большое количество дескрипторов (например, потоки, семафоры, файлы и т. Д.), Занимают системное пространство объектами ядра и могут исчерпать память даже если у вас много доступной памяти. Напротив, в 64-битной Windows пространство ядра является 64-битным и не ограничено 4 ГБ. Все системные вызовы, выполняемые 32-битными приложениями, преобразуются в собственные 64-битные вызовы в пользовательском режиме .

Максим Масютин
источник
1
Этот вопрос касается того, сколько памяти может получить доступ к одному процессу . Это ограничено 32-битным адресным пространством виртуальной памяти. Конечно, у вас может быть несколько 32-битных процессов, каждый из которых использует 4 ГБ на одном компьютере, даже с 32-битной ОС, использующей PAE. Но вопрос не об этом .
Питер Кордес
@PeterCordes - извините и спасибо - я обновил ответ о пределе 2 ГБ / 4 ГБ.
Максим Масютин
@PeterCordes, спасибо за ваше замечание, я обновил ответ, чтобы подчеркнуть, что каждый из нескольких 32-разрядных процессов может использовать 4 ГБ на одном компьютере, даже с 32-разрядной ОС, использующей PAE, и что 32-разрядные процессы под 64- Битовая ОС не страдает от ограничения системного пространства 2 ГБ, что было проблемой в 32-битной ОС.
Максим Масютин
-1

У вас есть такое же базовое ограничение при запуске 32-битного процесса под Win64. Ваше приложение работает в 32, но подсистеме, которая изо всех сил выглядит как Win32, и это будет включать ограничения памяти для вашего процесса (нижние 2 ГБ для вас, верхние 2 ГБ для ОС)

Шон
источник
-11

Предел не 2g или 3gb его 4gb для 32bit.

Причина, по которой люди думают, что это 3 ГБ, заключается в том, что ОС показывает 3 ГБ свободно, когда у них действительно 4 ГБ оперативной памяти.

Его общая оперативная память 4 ГБ. Итак, если у вас есть видеокарта 1 ГБ, которая считается частью общей оперативной памяти, просматриваемой 32-битной ОС.

4Gig не 3 не 2 получил?

BobJ
источник
2
Это неверно. Для стандартной системы x86 (без расширений памяти) ядро ​​может получить доступ ко всем 4 ГБ пространства памяти (даже если на компьютере имеется только 1 ГБ оперативной памяти из-за разбиения на страницы). Ядро резервирует верхние 2 ГБ (некоторые ядра вместо этого резервируют 1 ГБ или 3 ГБ) для собственного использования. В виртуальной памяти каждого процесса также отображается зарезервированная память ядра, поэтому процесс не может использовать 2 ГБ памяти.
Alex Jorgenson
3
Кроме того, видеокарты не имеют ничего общего с объемом памяти, который может использовать процесс. Таблицы ACPI, ввод-вывод с отображением памяти и т. Д. Используют адреса физической памяти, но этого можно избежать благодаря виртуальной памяти.
Alex Jorgenson
1
Это неверно. Microsoft выбрала (выбор дизайна) разделить виртуальное 32-разрядное адресное пространство с Windows NT таким образом, чтобы 2 ГБ было зарезервировано для отображения ОС (драйверы / API / системные вызовы и т. Д.), А оставшиеся 2 ГБ - для использования в приложении. Переключатель загрузки / 3GB изменяет это поведение (1 ГБ для сопоставления ОС, 3 ГБ для кода приложения). Я оставляю старые документы по архитектуре виртуальной памяти Windows NT 3.x в качестве упражнения для читателя :-)
ripvlan