В 32-разрядной системе это виртуальное адресное пространство 4 ГБ для всей ОС или для отдельного процесса?
Каждый процесс имеет свое собственное виртуальное адресное пространство 4 ГБ, из которых 2 ГБ предназначены для пространства ядра. В 32-битной Windows вы можете использовать LARGEADDRESSAWARE
вместе с параметром загрузки /3GB
чтобы уменьшить пространство ядра до 1GB
ОС получит более широкую адресную шину с PAE, поэтому она может адресовать более 4 ГБ ОЗУ.
Если это для всей ОС, то разве ОС обманывает каждый процесс, имеющий собственное 4 ГБ адресного пространства?
Здесь нет дурака. Виртуальный адрес!= физический адрес. Каждый процесс всегда имеет свое собственное адресное пространство 4 ГБ независимо от объема физической памяти, чтобы он не мог испортить данные других процессов. Даже если у вас всего 128 МБ ОЗУ, у вас все еще есть адресное пространство 4 ГБ. Это потому, что указатели в 32-битных программах всегда имеют 32-битную ширину. Адресное пространство используется не только для оперативной памяти, но и для устройств MMIO, и процесс также может сопоставить файл непосредственно в свое адресное пространство.
Если в системе более 4 ГБ ОЗУ, процесс может использовать AWE для сопоставления старших адресов с окном 4 ГБ, чтобы получить доступ ко всей доступной памяти. Или он также может создавать несколько процессов, таких как Adobe Premiere CS4 , чтобы использовать больше, чем ограничение памяти одного процесса
Когда процесс запущен, он использует все виртуальное адресное пространство? Это то, что мы называем фиксацией или резервированием виртуального адреса?
Процесс имеет 2-4 ГБ адресного пространства, но, конечно, от процесса зависит, какой объем памяти ему требуется. Если процесс запросил больше памяти, чем доступно, но фактически не записал в эту область, то он фактически не потребляет никакой памяти. Это называется фиксацией и разрешено в Linux, но Windows не позволяет выделять больше, чем доступно ОЗУ + файл подкачки
Как мы можем узнать, сколько виртуального адресного пространства требуется процессу? Что делать, если процесс требует больше виртуального адреса, чем 3 ГБ (система расширенного пользовательского режима).
Виртуальное адресное пространство всегда составляет 2/3/4 ГБ, вы не можете иметь больше, чем это, если вы не переключитесь на архитектуру с более чем 32-битным виртуальным адресом. Требование более 3 ГБ ОЗУ - это другая проблема. В этом случае есть несколько решений
- Запустите процесс в 64-битной Windows с помощью
LARGEADDRESSAWARE
, в этом случае он может получить доступ к 4 ГБ памяти
- Использует более одного процесса, как в примере с Premiere CS4 выше
- Используйте AWE, как указано выше
- Перепишите алгоритм так, чтобы он занимал меньше памяти, если у вас есть исходный код
- Используйте 64-битную версию программы
Если я запускаю 3 процесса на 32-битных окнах, которые разработаны с требованиями 1 ГБ ОЗУ каждое. Будет ли проблема выделения памяти в системе с 2 ГБ ОЗУ
Обычно проблем не возникает, поскольку некоторые из них можно перенести в файл подкачки. Но, конечно, это будет намного медленнее
Если нет, то как Windows достигает этого? Все ли виртуальные адресные пространства процесса выделены физическим адресом в физической памяти или это ленивое распределение, когда сопоставление выполняется только при обращении к этому виртуальному адресу?
Весь виртуальный адрес не отображается линейно как огромный кусок в физическое адресное пространство. Память отображается в страницах, поэтому в адресном пространстве процесса будет много неопределенных адресов
Более того, некоторые физические страницы будут отображаться в нескольких виртуальных адресных пространствах, чтобы процессы могли обмениваться данными. Некоторые общие страницы, помеченные как «только для чтения», также будут автоматически клонированы при записи для сохранения памяти. Это называется копирование при записи
Вы должны сначала прочитать о виртуальной памяти