5

Мне любопытно, почему существует ограничение в 2 ГБ для 32-разрядного процесса в 32-разрядной ОС. Согласно сообщению в блоге Chat Question: Ограничения памяти для 32-разрядных и 64-разрядных процессов, ограничение может быть увеличено до 3 ГБ, но вопрос остается.

Я вижу, что физический лимит составляет 4 ГБ, так что 2 или 3 ГБ жестко запрограммированы в Windows? Почему бы не 4 ГБ, как 32-разрядный процесс может иметь на 64-разрядной ОС?

ПРИМЕЧАНИЕ. Этот вопрос был помечен как дубликат, но упомянутый вопрос относится к ограничению в 32 ГБ 32-разрядного адресного пространства. Это НЕ то, что я спрашиваю. Я специально спрашиваю, почему Windows ограничивает процессы до 2 ГБ - даже на 32-битной платформе. В принятом ответе упоминается об этом, но не объясняется почему.

2 ответа2

6

На платформе NT виртуальное адресное пространство 4 ГБ по умолчанию разделено на две части: нижние 2 ГБ для адресного пространства процесса и верхние 2 ГБ для использования системой.

Это адресное пространство является виртуальным и не зависит от объема оперативной памяти. Диспетчер памяти CPU и OS отображает части оперативной памяти в виртуальное адресное пространство по мере необходимости. Это очень сложно и не будет описано здесь. Это было дизайнерское решение, принятое в интересах производительности, безопасности и надежности.

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

Но почему бы не дать системе собственное частное адресное пространство, как для процессов? Это позволило бы выделить 4 ГБ адресного пространства для системы и каждого процесса. Это можно было сделать - но была проблема.

Предположим, что было сделано. Запущенный процесс будет иметь полный доступ к своему коду и данным, и все будет хорошо. Но что, если этот процесс делает вызов ОС, который требует доступа к системному адресному пространству, например, для операции ввода-вывода? Или что произойдет, если ядро обработает прерывание?

Только адресное пространство запущенного процесса может быть замечено ЦП. Что делать? Решение состоит в том, чтобы сделать переключение контекста, которое отображает системное адресное пространство. ОС может сделать это довольно эффективно, но на это нужно время. Если бы к системному адресному пространству требовался частый доступ, накладные расходы на переключение контекста стали бы чрезмерными и производительность снизилась бы.

Должен быть лучший способ.

Было принято решение разделить общее адресное пространство 4 ГБ на две части по 2 ГБ каждая. Обработайте адресное пространство в нижних 2 ГБ и систему в верхних. Это позволяет системному адресному пространству всегда находиться в области видимости и быть доступным в любое время без переключения контекста. Как это часто бывает, дизайнерские решения принимаются по практическим соображениям.

2 ГБ сейчас могут показаться очень маленькими и ограниченными, но они были огромны, когда NT была выпущена в 1993 году. И не забывайте, что у каждого процесса есть свои 2 ГБ.

3

Согласно книге Windows Internals это было дизайнерское решение. Они разделяют все 4 ГБ виртуальной памяти на две части:

  • Виртуальное адресное пространство в режиме ядра 2 ГБ (окна памяти драйверов и т.д.)
  • 2 ГБ виртуального адресного пространства в режиме пользователя (память для программ пользовательского пространства)

Тогда есть нерекомендованный ключ /3GB (который меняет пользователя ядра 1:3 и может привести к неприятным ошибкам с драйверами, которые выделяются с абсолютным смещением), PAE и я полагаю, что был еще один API, который при использовании позволяет выделять не страничные памяти и динамически привязывать его к адресному пространству программ (но мне жаль, что я не могу вспомнить его имя сейчас).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .