Расскажу суть. Я брал в рассмотрение 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++ потому, что вы имеете много дел с этой тематикой.
C/C++
Для знающих: как рассчитали максимум видимости оперативной памяти для 32- и 64-разрядных систем? На примере Windows.
Похоже, ты не понимаешь, как устроена оперативная память.
Крайне упрощая, память состоит из ячеек. Каждая ячейка памяти имеет свой номер - адрес. НЕ бит, НЕ байт, а именно ЯЧЕЙКА памяти. И операции при чтении / записи данных производятся с ячейкой целиком, а не с отдельными битами ячейки.
В процессорной архитектуре Intel / AMD каждая ячейка памяти имеет объём 1 байт (8 бит). Но это не значит, что у всех процессорных архитектур память состоит из байтов.
При 32-битной адресации мы имеем 2 ** 32 = 4294967296 разных адресов и, соответственно максимальный объём памяти, равный 4294967296 ячеек памяти по 1 байту каждая - что и составляет ровно 4 Гигабайта.
Аналогично для 64-битной адресации имеем 2 ** 64 = 18446744073709551616 ячеек по 1 байту каждая.
P.S. Windows никакого отношения к этому не имеет.
Крайне упрощая, память состоит из ячеек. Каждая ячейка памяти имеет свой номер - адрес. НЕ бит, НЕ байт, а именно ЯЧЕЙКА памяти. И операции при чтении / записи данных производятся с ячейкой целиком, а не с отдельными битами ячейки.
В процессорной архитектуре Intel / AMD каждая ячейка памяти имеет объём 1 байт (8 бит). Но это не значит, что у всех процессорных архитектур память состоит из байтов.
При 32-битной адресации мы имеем 2 ** 32 = 4294967296 разных адресов и, соответственно максимальный объём памяти, равный 4294967296 ячеек памяти по 1 байту каждая - что и составляет ровно 4 Гигабайта.
Аналогично для 64-битной адресации имеем 2 ** 64 = 18446744073709551616 ячеек по 1 байту каждая.
P.S. Windows никакого отношения к этому не имеет.
Sebastian Azardov
слушайте, я понял свою ошибку, даже писал большой комментарий, как об этом догадываюсь... Я понял, что формулой 2^(разрядность, бит) я узнаю количество существующих адресов на существующие ячейки в оперативной памяти. Но как люди поняли, что одна ячейка хранит восемь бит (1 байт)? Они договорились об этом просто? Я знаю, что один бит — это обозначение для одного разряда двоичного числа (0/1), но никак не могу это связать с ячейкой памяти.
Sebastian Azardov
и ещё: разрядность означает то, сколько разрядов двоичного кода нужно для названия адреса? А где хранится адрес ячейки памяти сам по себе? Или они не хранятся, а ячейки просто вызываются программой напрямую*? (известен порядок названий (в двоичном порядке системной разрядности), а физический порядок ячеек памяти не учитывается)
Никак.
Адресация не зависит от ОС, это свойство архитектуры. Что касается именно интеловской архитектуры, картинка развивалась примерно так:
Вначале было слово. И слово это состояло из 2-х байт. И "640 килобайт должно хватать всем" (на самом деле БГ этого не говорил). Использовалась адресация вида сегмент-смещение, на основе 2-х 16-разрядных слов-регистров. Если в двух словах, то абсолютный адрес получался умножением слова-сегмента на 16 и добавлением слова-смещения. Такая вот библейская история.
Потом выяснилось, что все же 640 не хватает, и ввели защищенный режим и страничную адресацию.
Потом перешли на 32-битные регистры и оказалось, что одним регистром можно адресовать аж 4 ГБ! По тем временам это было невероятно много (типичный объем памяти ПК составлял примерно 8 МБ). Поэтому адресация стала сквозной и однорегистровой.
А потом выяснилось, что памяти мало не бывает. И за несколько лет мир завоевала 64-битная архитектура. Процессоры работали (и, ЧСХ, работают до сих пор) ощутимо медленнее, чем на 32-х битах, в чем достаточно легко убедиться, откомпилировав одно и то же приложение для разных платформ и сравнив время выполнения, но многозадачность оказалась важнее, чем скорость вычислений. И сегодня объем адресуемой памяти ограничен только возможностями контроллера материнской платы.
Такие дела.
Адресация не зависит от ОС, это свойство архитектуры. Что касается именно интеловской архитектуры, картинка развивалась примерно так:
Вначале было слово. И слово это состояло из 2-х байт. И "640 килобайт должно хватать всем" (на самом деле БГ этого не говорил). Использовалась адресация вида сегмент-смещение, на основе 2-х 16-разрядных слов-регистров. Если в двух словах, то абсолютный адрес получался умножением слова-сегмента на 16 и добавлением слова-смещения. Такая вот библейская история.
Потом выяснилось, что все же 640 не хватает, и ввели защищенный режим и страничную адресацию.
Потом перешли на 32-битные регистры и оказалось, что одним регистром можно адресовать аж 4 ГБ! По тем временам это было невероятно много (типичный объем памяти ПК составлял примерно 8 МБ). Поэтому адресация стала сквозной и однорегистровой.
А потом выяснилось, что памяти мало не бывает. И за несколько лет мир завоевала 64-битная архитектура. Процессоры работали (и, ЧСХ, работают до сих пор) ощутимо медленнее, чем на 32-х битах, в чем достаточно легко убедиться, откомпилировав одно и то же приложение для разных платформ и сравнив время выполнения, но многозадачность оказалась важнее, чем скорость вычислений. И сегодня объем адресуемой памяти ограничен только возможностями контроллера материнской платы.
Такие дела.
Антон Скрыльников
У 64 битного режима есть свои плюсы. Большее число регистров. Что-то улучшили для обработки исключений.
Я когда-то давно сравнивал производительность 64 и 32 битной Java. 64 битная оказалась быстрее. Тут тоже это замечено https://stackoverflow.com/questions/4931304/why-is-the-64bit-jvm-faster-than-the-32bit-one
Я когда-то давно сравнивал производительность 64 и 32 битной Java. 64 битная оказалась быстрее. Тут тоже это замечено https://stackoverflow.com/questions/4931304/why-is-the-64bit-jvm-faster-than-the-32bit-one
в гигабитах ты делишь большее на меньшее, а в гигабайтах - меньшее на большее
Sebastian Azardov
не понял вас
Sebastian Azardov
2^32/8/2^30 приводит к тому же результату: 0.5 бит
Sebastian Azardov
*гигабит
Sebastian Azardov
ответьте и поразмышляйте, иначе я скрою ответ
Похожие вопросы
- Устройство статических и динамических массивов в оперативной памяти (...)
- Как перемножить два числа в 16-битной системе, чтобы на выходе получилось большое 32-битное или 64-битное число?
- Как Создать иерархическую систему классов, на примере этого задания? Второй день уже туплю, помогите пожалуйста... С++
- Как работает математика в C++ Почему (32-6)/100*20 = 0
- C++ и динамическая память: это приемлемо?
- Если приложение вызывает утечку памяти, то при завершение работы приложения динамическая память очиститься или нет?
- С++ Максимум трёх чисел Даны три целых числа. Найдите наибольшее из них (программа должна вывести ровно одно целое число
- Программирование, динамическое выделение памяти в конструкторе класса
- Как компьютер определяет что в памяти записано знаковое или беззнаковое число?
- Ошибка в коде не считается локальный максимум