C/C++

Для знающих: как рассчитали максимум видимости оперативной памяти для 32- и 64-разрядных систем? На примере Windows.

Расскажу суть. Я брал в рассмотрение 32-битную операционную систему Windows. О ней пишут, что максимум используемой памяти — 4 гигабайта.

И это верно, если брать в расчет не гигабайты, а гигабиты:
---> (2^32) бит / (2^30) бит = 4 гигабита.
Но это в гигабитах.
Если рассматривать в гигабайтах, то
---> 4 гигабита / 8 бит = 0.5 гигабайта,
что неверно информации о том, что максимум равен четырём.

Максимум 64 битной системы устанавливают в 16,8 миллиона терабайт. Тут тоже самое (без комментариев):
---> ((2^64) бит / (2^40) бит ) терабит / 8 бит = 16 777 216 терабит / 8 бит = 2 097 152 терабайт ≈ 2.1 терабайт.
В восемь раз меньше!

В чём ошибка?

И объясните, почему без перевода в -байты получается правильный ответ?
Заранее спасибо.

Post scriptum: разместил в C/C++ потому, что вы имеете много дел с этой тематикой.
SA
Sebastian Azardov
1 779
Похоже, ты не понимаешь, как устроена оперативная память.
Крайне упрощая, память состоит из ячеек. Каждая ячейка памяти имеет свой номер - адрес. НЕ бит, НЕ байт, а именно ЯЧЕЙКА памяти. И операции при чтении / записи данных производятся с ячейкой целиком, а не с отдельными битами ячейки.

В процессорной архитектуре Intel / AMD каждая ячейка памяти имеет объём 1 байт (8 бит). Но это не значит, что у всех процессорных архитектур память состоит из байтов.

При 32-битной адресации мы имеем 2 ** 32 = 4294967296 разных адресов и, соответственно максимальный объём памяти, равный 4294967296 ячеек памяти по 1 байту каждая - что и составляет ровно 4 Гигабайта.

Аналогично для 64-битной адресации имеем 2 ** 64 = 18446744073709551616 ячеек по 1 байту каждая.

P.S. Windows никакого отношения к этому не имеет.
Вова Демидов
Вова Демидов
59 670
Лучший ответ
Sebastian Azardov слушайте, я понял свою ошибку, даже писал большой комментарий, как об этом догадываюсь... Я понял, что формулой 2^(разрядность, бит) я узнаю количество существующих адресов на существующие ячейки в оперативной памяти. Но как люди поняли, что одна ячейка хранит восемь бит (1 байт)? Они договорились об этом просто? Я знаю, что один бит — это обозначение для одного разряда двоичного числа (0/1), но никак не могу это связать с ячейкой памяти.
Sebastian Azardov и ещё: разрядность означает то, сколько разрядов двоичного кода нужно для названия адреса? А где хранится адрес ячейки памяти сам по себе? Или они не хранятся, а ячейки просто вызываются программой напрямую*? (известен порядок названий (в двоичном порядке системной разрядности), а физический порядок ячеек памяти не учитывается)
Никак.

Адресация не зависит от ОС, это свойство архитектуры. Что касается именно интеловской архитектуры, картинка развивалась примерно так:

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

Потом выяснилось, что все же 640 не хватает, и ввели защищенный режим и страничную адресацию.

Потом перешли на 32-битные регистры и оказалось, что одним регистром можно адресовать аж 4 ГБ! По тем временам это было невероятно много (типичный объем памяти ПК составлял примерно 8 МБ). Поэтому адресация стала сквозной и однорегистровой.

А потом выяснилось, что памяти мало не бывает. И за несколько лет мир завоевала 64-битная архитектура. Процессоры работали (и, ЧСХ, работают до сих пор) ощутимо медленнее, чем на 32-х битах, в чем достаточно легко убедиться, откомпилировав одно и то же приложение для разных платформ и сравнив время выполнения, но многозадачность оказалась важнее, чем скорость вычислений. И сегодня объем адресуемой памяти ограничен только возможностями контроллера материнской платы.

Такие дела.
Никита Денисов
Никита Денисов
68 549
Антон Скрыльников У 64 битного режима есть свои плюсы. Большее число регистров. Что-то улучшили для обработки исключений.
Я когда-то давно сравнивал производительность 64 и 32 битной Java. 64 битная оказалась быстрее. Тут тоже это замечено https://stackoverflow.com/questions/4931304/why-is-the-64bit-jvm-faster-than-the-32bit-one
в гигабитах ты делишь большее на меньшее, а в гигабайтах - меньшее на большее
Виталий Пудов
Виталий Пудов
93 962
Sebastian Azardov не понял вас
Sebastian Azardov 2^32/8/2^30 приводит к тому же результату: 0.5 бит
Sebastian Azardov *гигабит
Sebastian Azardov ответьте и поразмышляйте, иначе я скрою ответ

Похожие вопросы