А почему, собственно, виртуальное адресное пространство равно 4 Гб?


Перевод с блога The Old New Thing. Оригинал здесь.

Размер адресного пространства определяется числом уникальных значений указателей. Для 32-битного процессора, 32-битное значение может представить 2^32 различных значений. Если вы позволите каждому значению адресовать отдельный байт в памяти, вы получите 2^32 байт, что эквивалентно 4 гигабайтам.

Если бы вы захотели вернуться ко времени, предшествующее плоской модели памяти и работать с селекторами, тогда вы можете комбинировать 16-битное значение селектора с 32-битным смещением с образованием 48-битного адреса. Это создает теоретический максимум в 2^48 различных значений указателя, которые, в случае назначения каждому значению указателя отдельного байта в памяти, будут адресовать 256ТБ (терабайт) памяти.

Этот теоретический максимум, однако, не может быть достигнут на процессорах, класса Pentium. По причине того, что младшие биты значения сегмента содержат информацию о типе селектора. В результате, из 65556 возможных значений, только 8191 из них доступны для обращения к данным. Это отбрасывает вас до 32ТБ.

Фактическое ограничение адресного пространства при использовании модели селектор:смещение заключается в том, что селектор просто описывает подмножество плоского адресного пространства. Так что, даже если бы вы смогли использовать все 8191 селектор, они бы просто отображались на одно и тоже 32-битное адресное пространство.

(На самом деле, я серьезно сомневаюсь, что люди захотели бы вернуться к тем чудесным денькам программирования с сегментами.)

В 64-битной Windows уже нет ограничения в 2ГБ. виртуальное адресное пространство в режиме пользователя равно великолепным 8 терабайтам. Даже если вы будете выделять по одному мегабайту в секунду, у вас уйдет три месяца, чтобы выйти за этот предел. (Обратите, однако, внимание, что вы можете установить опцию /LARGEADDRESSAWARE:NO для вашей 64-битной программы, чтобы сказать операционной системе отвести для данной программы только младшие 2 ГБ. Хотя, совершенно непонятно, зачем это может понадобиться, так как вы теряете 64-битное адресное пространство, но по-прежнему платите за него размером указателя. Это подобно тому, чтобы платить за дополнительные кабельные каналы и не смотреть их.)

Вооруженные тем, что мы сейчас изучили, может вы сможете ответить на это обращение, которое поступило к нам от клиента:

«В одном из наших boot.ini файлов есть опция /7GB. Наш консультант сказал нам, что мы должны устанавливать ее в значение, на 1 ГБ меньшее, чем объем системной памяти. Поскольку у нас стоит 8ГБ, то 8ГБ — 1ГБ = 7ГБ. Консультант сказал, что установка этого значения позволит приложению выделять более 2ГБ памяти. Мы бы хотели, чтобы Микрософт прокомментировала это.»

Реклама
Запись опубликована в рубрике память. Добавьте в закладки постоянную ссылку.

Один комментарий на «А почему, собственно, виртуальное адресное пространство равно 4 Гб?»

  1. Daemon_Magic:

    Весьма велесловно. Краткий ответ: 2^32=4гб. И непонятно, зачем писать про 48 бит (типа, если на квитке 8 разрядов для суммы, это совсем не значит, что зарплата у тебя такая…), используется-то меньше…

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s