Скільки адрес пам'яті ми можемо отримати за допомогою 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 біт (b).

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-бітове. Як я вже згадував, це розмір машинного слова.

Машинне слово - це об'єм пам'яті, яку CPU використовує для утримування чисел (в оперативній пам'яті, кеші або внутрішніх регістрах). 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). HDD на кілька масштабів повільніше, ніж ОЗУ, але це не є серйозною проблемою для рідко доступних даних, і це дозволяє ОС надавати додаткам більше оперативної пам’яті, ніж ви насправді встановили.

Пейджинг

Те, про що ми говорили поки що, називається схемою плоскої адреси.

Пейджинг - це альтернативна схема адресації, яка дозволяє адресувати більше пам’яті, яку ви, як правило, могли використати одним машинним словом у плоскій моделі.

Уявіть собі книгу, наповнену 4-літерними словами. Скажімо, на кожній сторінці є 1024 номери. Щоб вирішити номер, ви повинні знати дві речі:

  • Кількість сторінки, на якій друкується це слово.
  • Яке слово на цій сторінці саме те, що ви шукаєте.

Тепер саме так обробляють пам'ять сучасні процесори x86. Він розділений на 4 сторінки KiB (по 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 байт).

Що в сегментації погано, це те, що це складно (але я думаю, ви це вже знаєте;) Що добре, що ви можете використовувати деякі розумні методи для створення модульних програм.

Наприклад, ви можете завантажити якийсь модуль у сегмент, потім зробити вигляд, що сегмент менший, ніж він є насправді (достатньо малий, щоб утримувати модуль), а потім вибрати перший сегмент, який не перетинається з цим псевдоменшим, і завантажити наступний модуль , і так далі. В основному, таким чином ви отримуєте сторінки змінного розміру.


1
ОС може надавати повний віртуальний адресний простір 4GiB (можливо, мінус одна сторінка - 4KiB для x86), але це робить системні виклики дорожчими, оскільки потрібно змінити адресний простір. За допомогою PAE та подібних механізмів кількість фізичної пам’яті, на яку адресується система, може бути збільшена, хоча адреси все ще обмежені 32 бітами.
Пол А. Клейтон

Це не те, що я шукав, але це все одно хороша інформація! Дякую за гарне пояснення макс. цифра (1 = макс., як у двійковій 9 - макс.) для порівняння двійкових та десяткових таблиць. Дійсно хороший спосіб думати про це. Я дізнався щось нове. :) Спасибі!
Йохан Смохан

Це Гібі і Гіга настільки заплутано ... Тому що на одних сайтах я читаю, що пам'ять вимірюється в Гібі, а на інших, що в Гізі ... Чи є у вас хороше / надійне джерело?
Йохан Смохан

У Вікіпедії є стаття про бінарні префікси, включаючи деякі історичні відомості. Більшість номерів, пов'язаних з обладнанням, використовують десяткові префікси, найбільш помітні винятки - це, напевно, оперативна пам'ять, а може бути і кольорова шкала - наприклад. РК-дисплеї з кольорами 16М мають три 8-бітові кольорові канали (2 ^ 24). Відповідаючи безпосередньо на ваше запитання: У цьому випадку кількість доступних адрес дорівнює кількості байтів пам'яті, оскільки оперативна пам’ять адресується на байтовій основі. 32-розрядний процесор міг обробляти до 2 ^ 32 B, 64-розрядний - 2 ^ 64.
gronostaj

Спасибі! Мені це потрібно для шкільних іспитів. :) Я думаю, що я зараз розумію більшість речей. Єдине, що все ще мене турбує - це чому 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 та опціональні ROM (у верхньому 384 Кбайт у межах першого 1 Мбайт), пристрої вводу / виводу (як APIC) та оперативна пам'ять відео. Деякі дивні речі також продовжуються в режимі управління системою "SMRAM", який я ще не повністю розумію.

Зауважте, що це фізичний адресний простір з точки зору ядра. MMU може будь-яким чином переставити все це в процесі користувальницького простору.


У Вікіпедії я червоний, що 1 адреса пам'яті шириною 32 біт або 4 октетами (1 октет = 8 біт), порівняно з 64-бітовим процесором, де 1 адреси пам'яті або 1 ціле число шириною 64 біт або 8 октетами. Ви маєте рацію щодо адресного простору 4 * 1024 * 1024 * 1024 байт, але я шукав адресний простір пам'яті, який, на мою думку, становить 1 ГБ / 32 біт, але я все ще не знаю, чи я правильно чи ні. :) Спасибі за вашу відповідь!
Йохан Смохан

Np. Процесори Intel мають два адресних простору: "Пам'ять" та "I / O". Інші речі, крім оперативної пам'яті, з’являються в просторі «Пам'ять». Інші речі, такі як пристрої вводу / виводу або ПЗУ, можуть знаходитись на місцях, не зайнятих оперативною пам’яттю. Як правило, лише пристрої вводу-виводу з’являються в адресному просторі вводу-виводу.
LawrenceC

@johansmohan Ні ваші цифри, ні відповідь Лоуренса не відповідають правильності. Немає фіксованого зв'язку між "бітовою шириною" процесора та шириною RAM-адрес, які він може використовувати. 32-бітні лише процесори x86 можуть адресувати 64 ГБ оперативної пам’яті. Процесори x64 запускалися в 40-бітовому фізичному адресному просторі і зараз на 52 біті. Що стосується віртуального адресного простору, він теж може бути різним. На x64, хоча для зберігання віртуальних адрес потрібно 64 біта, реалізовано лише 48 біт, для VAS 256 TiB замість 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 біт (один октет т біт)
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 КБ)

Це основна логіка, але, як було сказано раніше, існують способи подолання цього обмеження, такі як віртуальний простір адрес, відображення пам'яті тощо.


2
Суттєвою різницею між 32 та 64 бітовими процесорами є діапазон адрес (який впливає на віртуальний адресний простір більше, ніж на "реальний"). Процесори використовують стільки хитрощів, що важко сказати, яка фактична ширина шляху даних у багатьох випадках. А довжина інструкції багато в чому не пов'язана з "шириною" процесора.
Даніель Р Хікс

Пояснення цілком правильне. Якщо припустити, що ви не маєте на увазі фактичний розмір чіпа в сантиметрах, говорячи про "ширину процесора", то в цьому випадку ви б неправильно сказали, що це не пов'язано, ви помиляєтесь методами відображення пам'яті / віртуальними адресними просторами з фізичною адресацією пам'яті. Більше того, те, що ви говорите, більше пов'язане з реалізацією ядра, ви можете перевірити на ядрах PAE Linux.
Tuncay Göncüoğlu

2
Тривалість інструкції взагалі не має відношення до "ширини" процесора в сучасних системах. Найбільш релевантні значення - ширина регістрів (хоча це може бути оманливим), ширина від шляху передачі між процесором та пам'яттю та розмір у бітах адреси пам'яті. Але ці 3 значення дуже легко можуть відрізнятися один від одного.
Даніель Р Хікс

1
@DanielRHicks Даніель Хікс правильний. "Бітова ширина" процесора не обов'язково має нічого спільного з "розміром інструкції або розміром команди". Були створені таким чином процесори, але сьогоднішні товарні процесори (x86 / x64) не є серед них.
Джеймі Ханрахан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.