2009-03-12 8 views
74

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

+0

http://msdn.microsoft.com/en-us/library/Aa366521 –

ответ

74

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

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

+4

Может кто-нибудь объяснить, почему процессы не могут получить доступ к полным 4 ГБ? – BlueTrin

+0

Что ты имеешь в виду? Если вы построите его самостоятельно, вы можете использовать флаг/LARGEADDRESSAWARE и заставить его работать с 4 ГБ, если вы этого не сделали, то вы на милость разработчиков, которые это сделали. – SilverbackNet

+0

Является ли это потому, что указатель может быть опасно интерпретирован с помощью двух дополнений? – rosstex

17

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

Of course, you should be even more careful with pointer arithmetic if you set that flag.

+0

-1: Система будет использовать 64-битные адреса для себя, поэтому нет необходимости вычитать что-то –

+0

@ThomasW. Это не так, по крайней мере, в Windows. WOW64 по-прежнему требует 32-битных thunks для 64-битных системных вызовов. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/aa384274(v=vs.85).aspx – MSN

+1

Вы имеете в виду те 605 КБ DLL? Извините, я не понял этого, поскольку вопрос был больше о GB памяти. –

-1

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

7

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

+2

Это было бы полезно, если бы вы дали понять, что 32 бита адресуют 4 ГБ места. –

-7

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

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

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

4Gig not 3 not 2 получил?

+2

Это неверно. Для стандартной системы x86 (без расширений памяти) ядро ​​может получить доступ к полному пространству памяти 4GiB (даже если на компьютере имеется только 1 Гбит оперативной памяти из-за пейджинга). Ядро резервирует верхний 2GiB (некоторые ядра резервируют 1GiB или 3GiB вместо) для собственного использования. В виртуальной памяти каждого процесса также отображается зарезервированная память ядра и, следовательно, процесс не может использовать память 2GiB. –

+3

Кроме того, видеокарты не имеют ничего общего с объемом памяти, которую может использовать процесс. Таблицы ACPI, IO карты с памятью и т. Д. Используют адреса физической памяти, но этого можно избежать благодаря виртуальной памяти. –

+1

Это неверно. Microsoft выбрала (выбор дизайна) для разделения * виртуального * 32-разрядного адресного пространства с Windows NT, так что 2 ГБ зарезервировано для сопоставления ОС (драйвер/API/системные вызовы и т. Д.) И 2 ГБ для использования приложения./3GB изменяет это поведение (1 ГБ для сопоставления ОС, 3 ГБ для кода приложения). Я оставляю поиск старых документов архитектуры виртуальной памяти Windows NT 3.x как упражнение для читателя :-) – ripvlan

14

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

+7

Вы говорите о физической ОЗУ, где ОП говорит о виртуальной памяти. Даже на 32-битных системах вы можете запускать множество приложений, если файл вашей страницы достаточно велик. –

2

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

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

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

Для получения более подробной информации см. https://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx.

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

+1

Этот вопрос задает вопрос о том, сколько памяти может получить один процесс *. Это ограничено 32-разрядным адресным пространством виртуальной памяти. Уверены, что вы можете иметь несколько 32-битных процессов * каждый *, используя 4 ГБ на одном компьютере, даже с 32-разрядной ОС с использованием PAE. Но это не тот * этот * вопрос. –

+0

@PeterCordes - извините, и спасибо - я обновил ответ о лимите 2GB/4GB. –

 Смежные вопросы

  • Нет связанных вопросов^_^