Скільки адрес пам'яті може оперативної пам'яті в мій комп'ютер тримати?
Деякий день це цікаво дивитися на поверхню рівня обчислювального досвіду, і в інші дні це весело копатися прямо в внутрішніх роботах. Сьогодні ми подивимося на структуру пам'яті комп'ютера і на те, скільки матеріалу ви можете упакувати в палку оперативної пам'яті.
Сьогоднішня сесія запитань та відповідей приходить до нас люб'язно SuperUser - підрозділ Stack Exchange, групування веб-сайтів із запитаннями та відповідями на рівні спільноти..
Питання
Читач SuperUser Johan Smohan бореться з тим, як тип процесора і розмір пам'яті працюють разом, щоб отримати загальну кількість адрес. Він пише:
Скільки адрес пам'яті можна отримати з 32-розрядним процесором і 1 Гб оперативної пам'яті і скільки з 64-бітним процесором?
Я думаю, що це щось на зразок цього:
1 Гб оперативної пам'яті, розділеної або 32 бітами 4 біта (?), Щоб отримати кількість адрес пам'яті?
Я читав у Вікіпедії, що 1 пам'ять адреси 32 біт шириною або 4 октетів (1 октет = 8 біт), у порівнянні з 64-бітний процесор, де 1 пам'яті адреси або 1 цілого 64 біт або 8 октетів. Але не знаю, чи правильно я її зрозумів.
Це типи питань, які можуть зберегти цікаві виродки вночі. Скільки адрес доступно для кожної гіпотетичної системи Йохана?
Відповідь
Співробітник SuperUser Gronostaj пропонує деяке уявлення про те, як RAM ділиться і використовується:
Коротка відповідь: Кількість доступних адрес дорівнює меншій кількості:
- Розмір пам'яті в байтах
- Найбільше ціле число без знаку, яке можна зберегти в машинному слові процесора
Довгі відповіді та пояснення наведеного вище:
Пам'ять складається з байтів (B). Кожен байт складається з 8 бітів (b).
1 B = 8 b
1 Гб оперативної пам'яті насправді 1 ГБ (гібібайт, а не гігабайт). Різниця:
1 ГБ = 10 ^ 9 В = 1 000 000 000 В 1 ГБ = 2 ^ 30 В = 1 073 741 824 В
Кожен байт пам'яті має свою власну адресу, незалежно від того, наскільки великим є слово машинного процесора. Наприклад. Процесор 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. Це насправді двійкова система, і вона працює так:
Двійковий десятковий знак 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 біт тут, так що 1 обрізається)
- За 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). Жорсткий диск має невелику величину повільніше, ніж оперативна пам'ять, але це не є серйозною проблемою для рідко доступних даних і дозволяє ОС надавати програмам більше оперативної пам'яті, ніж ви фактично встановили..
Пейджинг
Те, про що ми говорили, називається схемою плоскої адресації.
Пейджинг - це альтернативна схема адресації, яка дозволяє звертатися до більшої кількості пам'яті, яку ви зазвичай мали б за допомогою одного машинного слова в плоскій моделі.
Уявіть собі книгу, наповнену словами з чотирьох букв. Припустимо, що на кожній сторінці є 1024 номери. Щоб вказати номер, потрібно знати дві речі:
- Номер сторінки, на якій це слово надруковано.
- Яке слово на цій сторінці ви шукаєте.
Тепер саме так працюють сучасні процесори x86 з пам'яттю. Він розділений на 4 сторінки KiB (по 1024 машинних слова кожна), і ці сторінки мають цифри. (насправді сторінки можуть бути також 4 MiB великі або 2 MiB з PAE). Якщо ви хочете звернутися до комірки пам'яті, вам знадобиться номер сторінки та адреса на цій сторінці. Зверніть увагу, що на кожну комірку пам'яті посилається рівно одна пара чисел, що не стосується сегментації.
Сегментація
Ну, це дуже схоже на пейджинг. Він був використаний в Intel 8086, тільки щоб назвати один приклад. Групи адрес тепер називаються сегментами пам'яті, а не сторінками. Різниця між сегментами може перекриватися, і вони багато в чому перекриваються. Наприклад, на 8086 більшість комірок пам'яті були доступні з 4096 різних сегментів.
Приклад:
Припустимо, у нас є 8 байт пам'яті, всі з яких містять нулі, за винятком 4-го байта, який дорівнює 255.
Ілюстрація для плоскої моделі пам'яті:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Ілюстрація для пам'ятної сторінки з 4-байтовими сторінками:
PAGE0 _____ | 0 | | 0 | | 0 | СТОРІНКА1 | 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 байт).
Що погано в сегментації - це складність (але я думаю, що ви вже знаєте, що;) Що хороше, це те, що ви можете використовувати деякі розумні методи для створення модульних програм.
Наприклад, можна завантажити деякий модуль у сегмент, а потім зробити вигляд, що сегмент менший, ніж він є насправді (достатньо малий, щоб утримувати модуль), потім вибрати перший сегмент, який не перекривається з цим псевдо-меншим і завантажувати наступний модуля тощо. В основному, це те, що ви отримуєте таким чином, сторінки зі змінною величиною.
Маєте щось додати до пояснення? Звучить в коментарях. Хочете прочитати більше відповідей від інших технологічних користувачів Stack Exchange? Перегляньте повний потік обговорення тут.