Отображение виртуальных и физических адресов в 32-битной Windows

652
Aman Yadav

Поправь меня, я ошибаюсь.

Q1) Насколько я понимаю, в 32-битном режиме мы получаем виртуальное адресное пространство 4 ГБ. Это потому, что 32-битная Windows может поддерживать только 4 ГБ физической ОЗУ?

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

В3) Если процесс получает свое собственное пространство 4 ГБ. Если я загружу 3 процесса, всего 12 ГБ адресного пространства. Будет ли у меня проблема с производительностью, так как у меня всего 4 ГБ ОЗУ?

Но так как виртуальный адрес предназначен для удовлетворения потребностей процесса в случае меньшего объема оперативной памяти. Так что мой реальный вопрос: когда процесс (приложение с одним процессом) загружает, отображает ли он весь код на виртуальный адрес 4 ГБ, независимо от того, что приложение в данный момент выполняет только определенную часть всего кода.

Я понимаю, что когда процесс запускается, весь его код загружается в виртуальное адресное пространство в режиме пользователя 2 ГБ, а остальные 2 ГБ загружают файлы ядра ОС. Теперь с помощью таблиц страниц виртуальный адрес сопоставляется с физическим адресом в ОЗУ и на диске. Все ли виртуальные адреса 4 ГБ будут сопоставлены с физическим ОЗУ 4 ГБ, а остальные - с файлом подкачки. Если я отказываюсь использовать файл подкачки, означает ли это, что только 32 процесса с виртуальным адресом 4 ГБ могут работать в 32-разрядной ОС 4 ГБ?

================================================== =========================== Спасибо за предыдущие ответы.

Я все еще немного озадачен тем, как разделено адресное пространство пользователя и ядра.

1) Является ли адресное пространство ядра размером 2 ГБ общим для всех процессов, поскольку оно является системным и загружается во время загрузки. или каждый процесс получает 2 ГБ адресного пространства ядра.? 2) Я читал, что какое-то плохо написанное приложение может потреблять все его адресное пространство. Означает ли это, что на других компьютерах емкостью 4 ГБ нет места для запуска других приложений? 3) Если адресное пространство ядра совместно используется всеми процессами, не исчерпывается ли оно когда-либо вне адресного пространства или никогда не происходит, потому что (я думаю) адрес ядра остается фиксированным в зависимости от архитектуры ОС и используется всеми процессами. 4) При использовании переключателя USERVA адрес ядра сокращается до 1 ГБ только для приложений с поддержкой большого адреса. Почему не делать это для всех процессов, если адресное пространство ядра, если 2GB (который я думаю) распределяется между всеми процессами.? 5) Как именно мы различаем ч / б виртуальную память и пространство виртуальных адресов. ? Если приложению требуется 5 ГБ памяти в соответствии с разработчиком, оно не будет работать на 32-разрядной машине с адресом 2 ГБ (можно ли сказать, что виртуальная память процесса = виртуальное адресное пространство процесса?)

0
На большинство из них был дан ответ на ваш предыдущий вопрос [Управление памятью в 32-битной Windows] (https://superuser.com/q/1343368/241386). Виртуальные адреса 3 процессов не составляют до 12 ГБ, поскольку они не отображаются линейно, в противном случае тонны памяти будут потрачены впустую, если процесс использует только 10 МБ ОЗУ, но использует весь блок адресов 4 ГБ. Если вы откроете диспетчер задач, то увидите, что существуют тысячи процессов, означает ли это, что компьютеру нужны ТБ ОЗУ? phuclv 6 лет назад 0

2 ответа на вопрос

0
harrymc

Q1: Нет, это потому, что 32-битный регистр может содержать только 4 ГБ уникальных адресов.

Q2: Неверно, нет разделения пользовательской памяти на пользователя и ядро. Ядро не находится в адресном пространстве процесса.

Q3: Да, Windows будет при необходимости заменять самые старые страницы памяти, на которые ссылаются.

Реальный вопрос: Да, процесс не может начаться без сопоставления для замены пространства всей его памяти, поэтому он может быть заменен в любой момент, полностью или частично.

В остальном, я предлагаю вам сначала почитать в Википедии:

0
sawdust

Поправь меня, я ошибаюсь.

Охотно. Вы готовы?


Q1) Насколько я понимаю, в 32-битном режиме мы получаем виртуальное адресное пространство 4 ГБ.

Правильный.

Это потому, что 32-битная Windows может поддерживать только 4 ГБ физической ОЗУ?

Нет, размер виртуальной памяти не зависит от размера физической или установленной памяти.
Эти величины одинаковы только потому, что они оба используют значения (для адресов) шириной 32 бита. Процессор может иметь такой размер виртуального адреса, который отличается от размера его физического адреса. IIRC, что было сделано еще тогда, когда размеры и стоимость оборудования были намного выше, чем сегодня.


Q2) Каждый процесс получает свое собственное 4 ГБ адресное пространство.

Да, виртуальное адресное пространство.

Пользовательский режим 2 ГБ и ядро ​​2 ГБ.

Нет, «пользовательский режим» относится к рабочему состоянию ЦП, то есть режимам ЦП. Память не имеет ни «пользовательского режима» (ни «режима ядра»).
Виртуальная память делится на пользовательское пространство и пространство ядра.

Связывает ли процесс весь свой код с пользовательским режимом, а компоненты ОС, необходимые для взаимодействия этого процесса с процессором для выполнения кода, загружаются в режиме ядра.

Этот вопрос может иметь смысл только в том случае, если слово «mode» заменено на «space».

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

Программный код и (общие) библиотеки отображаются в виртуальной памяти в пространстве пользователя.

Операционная система не «взаимодействует с процессором» (равно как и никакой процесс).
Процессор / CPU выполняет инструкции. Нет связи с процессором.
Процесс - это концептуализированное задание или задача, для которой выделяются ресурсы, такие как память (как виртуальная, так и физическая), и запланированное время ЦП.
Единственное взаимодействие между процессом и процессором / процессором - это выполнение инструкций для этого процесса. Взаимодействие между ядром и процессором / процессором - это выполнение инструкций для этого ядра и маршрутизация исключений и прерываний.


В3) Если процесс получает свое собственное пространство 4 ГБ.

Там нет "если" . Каждый процесс получает 4 ГБ виртуальной памяти.

Если я загружу 3 процесса, всего 12 ГБ адресного пространства. Будет ли у меня проблема с производительностью, так как у меня всего 4 ГБ ОЗУ?

Совсем маловероятно, поскольку типичные процессы редко используют всю свою виртуальную память. И даже если они это сделали, есть резервное хранилище (например, файл подкачки или пространство подкачки) для обработки ситуаций, когда физической памяти меньше, чем виртуального адресного пространства (что является первоначальной причиной использования виртуальной памяти).


Но так как виртуальный адрес предназначен для удовлетворения потребностей процесса в случае меньшего объема оперативной памяти.

Вы, вероятно, имеете в виду виртуальную память, а не «виртуальный адрес» .

Так что мой реальный вопрос: когда процесс (приложение с одним процессом) загружает, отображает ли он весь код на виртуальный адрес 4 ГБ, независимо от того, что приложение в данный момент выполняет только определенную часть всего кода.

(Почему вашему «реальному вопросу» не дано число?)
У меня нет однозначного ответа, но я ожидаю, что он загрузит всю программу, чтобы выполнить любые перемещения, а также разрешить любые внешние ссылки ( например, в библиотеки).
Все, что загружено, должно быть сопоставлено, т.е. выделено физической памяти.

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

Опять вы неправильно используете "режим пользователя" .
Загрузка кода ядра выполняется во время загрузки, а не при запуске процесса.

Теперь с помощью таблиц страниц виртуальный адрес сопоставляется с физическим адресом в ОЗУ и на диске. Все ли виртуальные адреса 4 ГБ будут сопоставлены с физическим ОЗУ 4 ГБ, а остальные - с файлом подкачки.

Нет, таблицы страниц только отображают виртуальную память в физическую (в единицах страниц). Нет привязки к «диску» . Это звучит как распространенное заблуждение о том, как работает файл подкачки и виртуальная память.
Файл подкачки является резервным хранилищем. Он временно содержит содержимое страниц виртуальной памяти, которые не могут быть резидентными (т. Е. Выделенной физической памяти).

Если я отказываюсь использовать файл подкачки, означает ли это, что только 32 процесса с виртуальным адресом 4 ГБ могут работать в 32-разрядной ОС 4 ГБ?

Нет, поскольку обычно процесс не использует все свое виртуальное адресное пространство, поэтому ему не требуется 4 ГБ физической памяти.
Я видел более двух десятков процессов, выполняющихся в 32-битной системе Linux с только 512 МБ ОЗУ для установки и без файла подкачки.