Сколько адресов памяти мы можем получить с 32-разрядным процессором и оперативной памятью 1 ГБ?

12

Сколько адресов памяти мы можем получить с 32-разрядным процессором и оперативной памятью 1 ГБ и сколько с 64-разрядным процессором?

Я думаю, что это что-то вроде этого:

1 ГБ оперативной памяти делится на 32 бита или делится на 4? узнать количество адресов памяти?

Но я не уверен. Вот почему я спрашиваю.

Я прочитал в википедии, что 1 адрес памяти имеет ширину 32 бита или 4 октета (1 октет = 8 бит) по сравнению с 64-битным процессором, где 1 адрес памяти или 1 целое число имеют ширину 64 бита или 8 октетов. Но не знаю, правильно ли я это понял.

Йохан Смохан
источник
Практически все современные системы имеют байтовую адресацию, что означает, что 32 бита могут адресовать около 4 гигабайт (если установлено столько оперативной памяти). Исторически существовали схемы с адресом слова, где «слово» составляло 12, 15, 16, 17, 24, 32, 36 или 48 бит, и, вероятно, некоторые другие, плюс десятичные машины, которые адресовали 4 или 6 бит Блок. Но также имейте в виду, что большинство современных систем используют виртуальную память, а это означает, что процессор может адресовать даже больше памяти, чем установлено.
Даниэль Р Хикс
@DanielRHicks Виртуальная память не влияет на объем оперативной памяти.
Джейми Ханрахан
@JamieHanrahan - Чтобы виртуальная память работала, должен быть какой-то механизм адресации, который охватывает диапазон виртуальных адресов (одного процесса). Это можно сделать с помощью программного моделирования, но это неэффективно, поэтому в большинстве систем диапазон адресации процессора сделан достаточно большим, чтобы охватить максимальное адресное пространство процесса.
Даниэль Р Хикс
@DanielRHicks Конечно, но это не влияет на объем оперативной памяти . ОЗУ - это физическая память, а не виртуальная. Виртуальные адреса не являются адресами ОЗУ, а виртуальная память не является ОЗУ.
Джейми Ханрахан
@JamieHanrahan - Ты не имеешь никакого смысла. Если вы не можете обращаться к страницам ОЗУ в виртуальном адресном пространстве, то ОЗУ бесполезно. (Я очень хорошо знаю, как работает виртуальная память, работая над проектами виртуальной памяти с 1972 года.)
Даниэль Р Хикс,

Ответы:

38

Краткий ответ: Количество доступных адресов равно меньшему из них:

  • Объем памяти в байтах
  • Наибольшее целое число без знака, которое можно сохранить в машинном слове процессора

Длинный ответ и объяснение вышесказанного:

Память состоит из байтов (B). Каждый байт состоит из 8 бит (б).

1 B = 8 b

1 ГБ ОЗУ на самом деле составляет 1 ГБ (гибибайт, а не гигабайт). Разница в том, что:

1 GB  = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B

Каждый байт памяти имеет свой собственный адрес, независимо от того, насколько велико машинное слово процессора. Например. Процессор Intel 8086 был 16-разрядным, и он обращался к памяти байтами, как и современные 32-разрядные и 64-разрядные процессоры. Это является причиной первого ограничения - вы не можете иметь больше адресов, чем байтов памяти.

Адрес памяти - это просто число байтов, которое ЦП должен пропустить с начала памяти, чтобы получить тот, который он ищет.

  • Для доступа к первому байту необходимо пропустить 0 байтов, поэтому адрес первого байта равен 0.
  • Для доступа ко второму байту необходимо пропустить 1 байт, поэтому его адрес равен 1.
  • (и так далее...)
  • Для доступа к последнему байту ЦП пропускает 1073741823 байта, поэтому его адрес равен 1073741823.

Теперь вы должны знать, что на самом деле означает 32-разрядный. Как я уже говорил, это размер машинного слова.

Машинное слово - это объем памяти, используемый ЦП для хранения чисел (в ОЗУ, в кеше или во внутренних регистрах). 32-битный процессор использует 32 бита (4 байта) для хранения чисел. Адреса памяти тоже являются числами, поэтому на 32-битном процессоре адрес памяти состоит из 32 бит.

Теперь подумайте об этом: если у вас есть один бит, вы можете сохранить на нем два значения: 0 или 1. Добавьте еще один бит, и у вас будет четыре значения: 0, 1, 2, 3. На трех битах вы можете сохранить восемь значений : 0, 1, 2 ... 6, 7. На самом деле это двоичная система, и она работает так:

Decimal Binary
0       0000
1       0001
2       0010
3       0011
4       0100
5       0101
6       0110
7       0111
8       1000
9       1001
10      1010
11      1011
12      1100
13      1101
14      1110
15      1111

Он работает точно так же, как и при обычном сложении, но максимальная цифра - 1, а не 9. Десятичная дробь - 0 0000, затем вы добавляете 1 и получаете 0001, добавляете еще раз, и у вас есть 0010. То, что здесь происходит, похоже на десятичную 09и добавление единицы: вы меняете 9 на 0 и увеличиваете следующую цифру.

Из приведенного выше примера вы можете видеть, что всегда есть максимальное значение, которое вы можете хранить в числе с постоянным количеством битов - потому что, когда все биты равны 1, и вы пытаетесь увеличить значение на 1, все биты станут равными 0, таким образом разбивая число. Это называется целочисленным переполнением и вызывает много неприятных проблем, как для пользователей, так и для разработчиков.

   11111111    = 255
+         1
-----------
  100000000    = 0   (9 bits here, so 1 is trimmed)
  • Для 1 бита наибольшее значение равно 1,
  • 2 бита - 3,
  • 3 бита - 7,
  • 4 бита - 15

Максимально возможное число всегда равно 2 ^ N-1, где N - количество битов. Как я уже говорил, адрес памяти - это число, и оно также имеет максимальное значение. Вот почему размер машинного слова также является ограничением для количества доступных адресов памяти - иногда ваш процессор просто не может обработать числа, достаточно большие, чтобы адресовать больше памяти.

Таким образом, в 32 битах вы можете хранить числа от 0 до 2 ^ 32-1, а это 4 294 967 295. Это больше, чем самый большой адрес в 1 ГБ ОЗУ, поэтому в вашем конкретном случае объем ОЗУ будет ограничивающим фактором.

Предел оперативной памяти для 32-разрядного ЦП теоретически составляет 4 ГБ (2 ^ 32), а для 64-разрядного ЦП - 16 ЭБ (эксабайт, 1 ЭБ = 2 ^ 30 ГБ). Другими словами, 64-битный процессор может адресовать весь Интернет ... 200 раз;) (по оценкам WolframAlpha ).

Однако в реальных операционных системах 32-разрядные процессоры могут обрабатывать около 3 ГБ ОЗУ. Это из-за внутренней архитектуры операционной системы - некоторые адреса зарезервированы для других целей. Вы можете прочитать больше об этом так называемом барьере 3 ГБ в Википедии . Вы можете снять этот предел с помощью расширения физического адреса .


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

Виртуальная память

Как отметил @Daniel R Hicks в другом ответе, операционные системы используют виртуальную память. Это означает, что приложения фактически работают не с реальными адресами памяти, а с ОС.

Этот метод позволяет операционной системе перемещать некоторые данные из ОЗУ в так называемый Pagefile (Windows) или Swap (* NIX). Жесткий диск на несколько порядков медленнее, чем ОЗУ, но это не является серьезной проблемой для редко используемых данных и позволяет ОС предоставлять приложениям больше оперативной памяти, чем вы фактически установили.

Paging

То, о чем мы говорили, называется плоской схемой адресации.

Пейджинг - это альтернативная схема адресации, которая позволяет адресовать больше памяти, чем обычно, одним машинным словом в плоской модели.

Представьте себе книгу, заполненную 4-буквенными словами. Допустим, на каждой странице 1024 номера. Чтобы обратиться к номеру, вы должны знать две вещи:

  • Номер страницы, на которой напечатано это слово.
  • Какое слово на этой странице является тем, которое вы ищете.

Теперь именно так современные процессоры x86 обрабатывают память. Он разделен на 4 страницы по КиБ (1024 машинных слова каждая), и эти страницы имеют номера. (на самом деле страницы могут быть размером 4 МБ или 2 МБ с PAE ). Если вы хотите обратиться к ячейке памяти, вам нужен номер страницы и адрес на этой странице. Обратите внимание, что на каждую ячейку памяти ссылается ровно одна пара чисел, это не относится к сегментации.

сегментация

Ну, этот очень похож на пейджинг. Он был использован в Intel 8086, просто чтобы назвать один пример. Группы адресов теперь называются сегментами памяти, а не страницами. Разница в том, что сегменты могут перекрываться, и они сильно перекрываются. Например, на 8086 большинство ячеек памяти были доступны из 4096 различных сегментов.


Пример:

Допустим, у нас есть 8 байтов памяти, все нули содержат, кроме 4-го байта, который равен 255.

Иллюстрация для плоской модели памяти:

 _____
|  0  |
|  0  |
|  0  |
| 255 |
|  0  |
|  0  |
|  0  |
|  0  |
 -----

Иллюстрация для страничной памяти с 4-байтовыми страницами:

 PAGE0
 _____
|  0  |
|  0  |
|  0  |  PAGE1
| 255 |  _____
 -----  |  0  |
        |  0  |
        |  0  |
        |  0  |
         -----

Иллюстрация для сегментированной памяти с 4-байтовыми сегментами, сдвинутыми на 1:

 SEG 0
 _____   SEG 1
|  0  |  _____   SEG 2
|  0  | |  0  |  _____   SEG 3
|  0  | |  0  | |  0  |  _____   SEG 4
| 255 | | 255 | | 255 | | 255 |  _____   SEG 5
 -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 6
         -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 7
                 -----  |  0  | |  0  | |  0  | |  0  |  _____
                         -----  |  0  | |  0  | |  0  | |  0  |
                                 -----   -----   -----   -----

Как видите, 4-й байт может быть адресован четырьмя способами: (адресация от 0)

  • Сегмент 0, смещение 3
  • Сегмент 1, смещение 2
  • Сегмент 2, смещение 1
  • Сегмент 3, смещение 0

Это всегда одна и та же ячейка памяти.

В реальных реализациях сегменты сдвигаются более чем на 1 байт (для 8086 это было 16 байт).

Что плохо в сегментации, так это то, что она сложная (но я думаю, вы уже это знаете;) Что хорошо, вы можете использовать некоторые умные методы для создания модульных программ.

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

gronostaj
источник
1
Операционная система может предоставить пользовательскому процессу полное виртуальное адресное пространство 4 ГБ (возможно, за вычетом одной страницы - 4 КБ для x86), но это делает системные вызовы более дорогими, поскольку необходимо изменить адресное пространство. С помощью PAE и аналогичных механизмов объем физической памяти, адресуемой системой, может быть увеличен, хотя адреса по-прежнему ограничены 32 битами.
Пол А. Клейтон,
Это не то, что я искал, но это хорошая информация в любом случае! Спасибо за хорошее объяснение макс. цифровая вещь (1 = макс., как в двоичном 9 макс.) для сравнения двоичной и десятичной таблиц. Действительно хороший способ думать об этом. Я узнал что-то новое. :) Благодарность!
Йохан Смохан
Эти Гиби и Гига настолько сбивают с толку ... Потому что на некоторых сайтах я читал, что память измеряется в Гиби, а на других - в Гига ... У вас есть хороший / надежный источник?
Йохан Смохан
В Википедии есть статья о бинарных префиксах, включая некоторые исторические сведения. Большинство аппаратных чисел используют десятичные префиксы, наиболее заметными исключениями являются, вероятно, RAM и, возможно, цветовая шкала - например. ЖК-дисплеи с 16M цветов имеют три 8-битных цветовых канала (2 ^ 24). Ответ на ваш вопрос напрямую: в этом случае количество доступных адресов равно количеству байтов памяти, поскольку ОЗУ адресуется на основе байтов. 32-битный процессор может обрабатывать до 2 ^ 32 B, 64-битный - 2 ^ 64.
Гроностай
Благодарность! Мне это нужно для школьных экзаменов. :) Я думаю, что теперь я понимаю большинство вещей. Единственное, что меня до сих пор беспокоит, так это почему 2 ^ 32 B, если это 32-битный процессор, а не 32-байтовый?
Йохан Смохан
3

В дополнение к вышесказанному обратите внимание, что используется виртуальная адресация наряду с несколькими адресными пространствами . Таким образом, несмотря на то, что у вас есть только 1 ГБ ОЗУ, программа может концептуально использовать до 4 ГБ виртуальной памяти (хотя большинство операционных систем ограничит ее до этого). И вы можете концептуально иметь (почти) бесконечное количество таких 4 ГБ адресных пространств.

Размер ОЗУ не ограничивает (настолько сильно) максимальный размер программы или количество программ, которые вы можете запустить, а скорее ограничивает производительность. Когда реальная память становится «перегруженной» и система начинает «перебивать», когда она «переставляет» страницы памяти между оперативной памятью и диском, производительность падает.

Даниэль Р Хикс
источник
2

1 ГБ ОЗУ будет занимать 1024 * 1024 * 1024 байта или 1 073 741 824 байта.

32-разрядный процессор всегда имеет 4 * 1024 * 1024 * 1024 байта или 4 294 967 296 байтов адресного пространства. В этом пространстве появляется 1 ГБ ОЗУ. На процессорах Intel часть оперативной памяти должна появляться по адресу 0 для векторов прерываний, поэтому физическая память начинается с адреса 0 и увеличивается.

В этом адресном пространстве появляются другие объекты, такие как BIOS и дополнительные ПЗУ (в верхних 384 КБ в пределах первого 1 МБ), устройства ввода-вывода (например, APIC) и видеопамять. Некоторые странные вещи также происходят с режимом управления системой «SMRAM», который я еще не полностью понимаю.

Обратите внимание, что это физическое адресное пространство, с точки зрения ядра. MMU может каким-либо образом переставить все это в процесс пользовательского пространства.

LawrenceC
источник
Я прочитал в википедии, что 1 адрес памяти имеет ширину 32 бита или 4 октета (1 октет = 8 бит) по сравнению с 64-битным процессором, где 1 адрес памяти или 1 целое число имеют ширину 64 бита или 8 октетов. Вы правы в отношении адресного пространства 4 * 1024 * 1024 * 1024 байта, но я искал адресное пространство памяти, которое, я думаю, составляет 1 ГБ / 32 бита, но я все еще не знаю, прав ли я или нет. :) Спасибо за ваш ответ!
Йохан Смохан
Np. Процессоры Intel имеют два адресных пространства: «Память» и «Ввод / вывод». Вещи, кроме ОЗУ, появляются в области «Память». Другие вещи, такие как устройства ввода-вывода или ПЗУ, могут быть в местах, не занятых ОЗУ. Обычно в адресном пространстве ввода-вывода отображаются только устройства ввода-вывода.
LawrenceC
@johansmohan Ни ваши цифры, ни ответ Лоуренса не верны. Не существует фиксированной связи между «битовой шириной» процессора и шириной адресов ОЗУ, которые он может использовать. 32-разрядные процессоры x86 могут адресовать 64 ГБ оперативной памяти. Процессоры x64 были запущены в 40-битном физическом адресном пространстве и теперь имеют 52 бита. Что касается виртуального адресного пространства, то оно тоже может быть другим. На x64, хотя для хранения виртуальных адресов требуется 64 бита, реализовано только 48 бит, для VAS 256 ТиБ вместо 16 EiB, которые вы ожидаете от 64 бит.
Джейми Ханрахан
0

32-разрядный процессор может адресовать не более 2 ^ 32 отдельных байтов памяти (около 4 ГБ), но наличие 1 ГБ памяти приведет к 1 * 1024 * 1024 * 1024 адресуемым байтам памяти (хотя у вас, вероятно, все еще будет виртуальное адресное пространство 2 ^ 32). ). 64-битный процессор может адресовать 2 ^ 64 отдельных байтов, но я думаю, что большинство систем используют только 48 бит для адресов памяти, составляющих верхнюю границу. адресуемые байты 2 ^ 48.

кислота
источник
Вы имели в виду 1024 * 1024 * 1024, а не 1 * 1024 * 1024, верно?
Йохан Смохан
32-битный процессор может адресовать не более 2 ^ 32 октетов или бит? Просто проверяю, потому что я должен это знать наверняка.
Йохан Смохан
@johan smohan Правильно, это должно было быть 1 * 1024 * 1024 * 1024
AcId
@johan smohan 32-битный процессор может адресовать максимум 2 ^ 32 байта, при этом один байт составляет 8 бит (один октет t битов)
ACId
0

Принятый ответ дает хорошее объяснение. Но я не думаю, что это ответ. Он не содержит ничего о адресной шине . И его размер на самом деле является основной причиной ограничения памяти. Например, 8080 - это 8-битный процессор (размер его шины данных составляет 8 бит), но он имеет 16-битную адресную шину. Он может адресовать 2 ^ 16 = (2 ^ 6) * (2 ^ 10) = 64 * 1024 байта = 64 КБ.

Вы можете найти больше здесь (32-бит) в разделе «Техническая история».

Дмитрий Докшин
источник
Я согласен. Обратите внимание, что более поздние модели 16-разрядного PDP-11 имели 22-разрядную адресную шину (и, следовательно, могли адресовать 4 МБ ОЗУ), HP 1000MX, также «16-разрядный», в итоге достиг 16 МБ ОЗУ (24 -битные адреса); VAX представлял собой 32-разрядный процессор, но имел 30-разрядное физическое адресное пространство, но половина была зарезервирована для пространства ввода-вывода, для предела оперативной памяти 512 МБ; «16-битный» 8086, 1 МБ; «16-разрядный» 80286, 16 МБ; и т.д. И когда PAE был представлен с Pentium Pro, 32-битный x86 мог адресовать до 64 ГБ ОЗУ (24-битное физическое адресное пространство, хотя младшие три бита фактически никогда не выходили из процессора).
Джейми Ханрахан,
-2

Я верю, что самая основная информация теряется в этом разговоре, поэтому вот мой ответ:

Выражение «Это 32-битный процессор» означает, что размер команды или размер команды, которую процессор может понять и работать за один раз, составляет 32 бита. Аналогично с 64-разрядными процессорами: они могут обрабатывать команды максимум из 64-разрядных.

Думайте об этом как о старом механическом калькуляторе: у вас есть только столько цифр, что вы просто не можете вводить более длинные числа.

Теперь адрес, который может использовать процессор, также должен вписываться в это же пространство, поэтому для 32-разрядного процессора адрес, который он использует, также может быть максимум 32-разрядным. Таким образом, отсюда мы можем просто рассчитать максимальное количество адресов (т. Е. Максимальное количество оперативной памяти, используемой ЦП):

2 ^ 32 = 4294967296 (= 4 ГБ)

или

2 ^ 64 = 18446744073709551616 (= намного больше;)

Или, как забавный пример, мой старый Commodore 64 имел 16-битный процессор, поэтому он мог управлять памятью:

2 ^ 16 = 65536 байт (= 64 КБ)

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

Tuncay Göncüoğlu
источник
2
Существенная разница между 32- и 64-разрядными процессорами заключается в диапазоне адресов (который влияет на виртуальное адресное пространство больше, чем на «реальный»). Процессоры используют так много хитростей, что во многих случаях трудно сказать, какова фактическая ширина пути данных. И длина инструкции в значительной степени не связана с «шириной» процессора.
Даниэль Р Хикс
Объяснение совершенно правильно. Предполагая, что вы не подразумеваете фактический размер микросхемы в сантиметрах, когда говорите «ширина процессора», в этом случае вы будете правы, говоря, что он не связан, вы ошибочно принимаете методы отображения памяти / виртуальные адресные пространства с физической адресацией памяти. Более того, то, что вы говорите, больше связано с реализациями ядра, вы можете проверить ядро ​​PAE linux.
Tuncay Göncüoğlu
2
Длина инструкции не имеет никакого отношения к «ширине» процессора в современных системах. Наиболее значимыми значениями являются ширина регистров (хотя это может быть обманчиво), ширина пути передачи между процессором и памятью и размер в битах адреса памяти. Но эти 3 значения могут очень легко отличаться друг от друга.
Даниэль Р Хикс
1
@DanielRHicks Даниэль Хикс правильно. «Битовая ширина» ЦПУ не обязательно имеет отношение к «размеру команды или размеру команды». Были процессоры, которые были построены таким образом, но современные товарные процессоры (x86 / x64) не входят в их число.
Джейми Ханрахан