Domovská » jak » Kolik adres paměti může paměť RAM v počítači držet?

    Kolik adres paměti může paměť RAM v počítači držet?

    Někdy je zábavné podívat se na povrchovou úroveň výpočetní zkušenosti a další dny je zábavné se ponořit přímo do vnitřních činností. Dnes se podíváme na strukturu paměti počítače a kolik věcí můžete zabalit do paměti RAM.

    Dnešní zasedání Otázky a odpovědi nás přichází s laskavým svolením SuperUser - podřízené rozdělení Stack Exchange, které je založeno na komunitě prostřednictvím skupin webových stránek.

    Otázka

    Snímač SuperUser Johan Smohan se zabývá tím, jak typ procesoru a velikost paměti spolupracují, aby se získal celkový počet adres. Napsal:

    Kolik paměťových adres získáme s 32bitovým procesorem a 1GB pamětí a kolik je s 64bitovým procesorem?

    Myslím, že je to něco takového:

    1 GB ram se dělí buď 32 bitů 4 bitům (?), Aby se dostal počet adres paměti?

    Na Wikipedii jsem četl, že 1 adresy paměti jsou 32 bity široké nebo 4 oktety (1 oktet = 8 bitů), ve srovnání s 64 bitovým procesorem, kde 1 adresy paměti nebo 1 celé číslo má šířku 64 bitů nebo 8 oktetů. Ale nevím, jestli jsem to správně pochopil.

    To jsou druhy otázek, které mohou v noci udržet zvědavý hajzl. Kolik adres je k dispozici v rámci každého Johanova hypotetického systému?

    Odpověď

    Příspěvek SuperUser Gronostaj nabízí nějaký pohled na to, jak je RAM rozdělena a využívána:

    Stručná odpověď: Počet dostupných adres se rovná počtu dostupných adres:

    • Velikost paměti v bajtech
    • Největší celé znaménko bez znaménka, které lze uložit v slově stroje CPU

    Dlouhá odpověď a vysvětlení výše:

    Paměť se skládá z bajtů (B). Každý bajt se skládá z 8 bitů (b).

    1 B = 8 b 

    1 GB paměti RAM je ve skutečnosti 1 GiB (gibibyte, nikoli gigabyte). Rozdíl je:

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

    Každý bajt paměti má svou vlastní adresu, bez ohledu na to, jak velké je slovo stroje CPU. Např. Intel 8086 CPU byl 16bitový a byl zaměřen na paměť bajtů, takže moderní 32bitové a 64bitové CPU. To je příčina první hranice - nemáte více adres než paměťové bajty.

    Paměťová adresa je jen několik bajtů, které CPU musí vynechat od začátku paměti, aby se dostal k jednomu, který hledá.

    • Pro přístup k prvnímu bytu musí přeskočit 0 bajtů, tak adresa prvního bajtu je 0.
    • Pro přístup k druhému bytu musí přeskočit 1 bajt, takže jeho adresa je 1.
    • (a tak dále… )
    • Pro přístup k poslednímu bytu CPU přeskočí 1073741823 bajtů, takže jeho adresa je 1073741823.

    Nyní musíte vědět, co 32-bit skutečně znamená. Jak jsem již zmínil, je to velikost strojního slova.

    Strojové slovo je množství paměti, které procesor používá k zadávání čísel (v paměti RAM, mezipaměti nebo interních registrech). 32bitový procesor používá 32 bitů (4 bajty) k držení čísel. Adresy paměti jsou také číslice, takže na 32bitovém procesoru je paměťová adresa 32 bitů.

    Nyní přemýšlejte o tom: pokud máte jeden bit, můžete na něj uložit dvě hodnoty: 0 nebo 1. Přidejte ještě jeden bit a máte čtyři hodnoty: 0, 1, 2, 3. Na třech bitích můžete uložit osm hodnot : 0, 1, 2 ... 6, 7. Toto je vlastně binární systém a funguje to takto:

    Binární desetinné 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 

    Funguje přesně jako obvykle, ale maximální číslice je 1, nikoliv 9. Desítková je 0 0000, pak přidáte 1 a dostanete 0001, přidat jeden znovu a máte 0010. Co se stalo, je to, jako kdybychom měli desetinnou čárku 09 a přidáte jeden: změníte 9 na 0 a zvýšíte další číslici.

    Z výše uvedeného příkladu lze vidět, že v čísle s konstantním počtem bitů je stále vždy maximální hodnota - protože když jsou všechny bity 1 a pokusíte se zvýšit hodnotu o 1, všechny bity se stanou 0, čímž se poruší číslo. Nazývá se celočíselný přetečení a způsobuje mnoho nepříjemných problémů jak pro uživatele, tak pro vývojáře.

     11111111 = 255 + 1 ----------- 100000000 = 0 (9 bitů zde, takže 1 je oříznuto) 
    • Pro 1 bit je největší hodnota 1,
    • 2 bity - 3,
    • 3 bity - 7,
    • 4 bity - 15

    Největší možný počet je vždy 2 ^ N-1, kde N je počet bitů. Jak jsem již řekl, paměťová adresa je číslo a má také maximální hodnotu. Proto velikost počítače je také limit pro počet dostupných adres paměti - někdy CPU prostě nemůže zpracovávat čísla dostatečně velká pro adresování více paměti.

    Takže na 32 bitů můžete mít čísla od 0 do 2 ^ 32-1 a to je 4 294 967 295. Je to víc než největší adresa v 1 GB RAM, takže ve vašem konkrétním případě bude velikost paměti RAM omezujícím faktorem.

    Limit RAM pro 32bitový CPU je teoreticky 4 GB (2 ^ 32) a pro 64bitový CPU je to 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Jinými slovy, 64bitový procesor by se mohl zaměřit na celý internet ... 200krát;) (odhaduje se WolframAlpha).

    V operačních systémech v reálném životě však mohou 32bitové procesory řešit přibližně 3 GB paměti RAM. Je to kvůli vnitřní architektuře operačního systému - některé adresy jsou vyhrazeny pro jiné účely. Více informací o této tzv. 3 GB bariéře naleznete na Wikipedii. Tento limit můžete zvětšit pomocí rozšíření o fyzickou adresu.

    Když mluvíme o adresování paměti, je několik věcí, které bych měl zmínit: virtuální paměťsegmentace stránkování.

    Virtuální paměť

    Jak uvedl @Daniel R Hicks v jiné odpovědi, operační systémy používají virtuální paměť. Co to znamená, že aplikace skutečně nefungují na skutečných adresách paměti, ale ty, které poskytuje OS.

    Tato technika umožňuje operačnímu systému přesunout data z paměti RAM na takzvaný soubor Pagefile (Windows) nebo Swap (* NIX). HDD je málo magnitudes pomalejší než RAM, ale není to vážný problém pro zřídka přístupná data a umožňuje OS poskytovat aplikacím více RAM, než jste skutečně nainstalovali.

    Stránkování

    To, o čem jsme dosud mluvili, se nazývá schéma plochého adresování.

    Paging je alternativní schéma adresování, které umožňuje řešit více paměti, které byste normálně mohli s jedním slovem stroje v plochém modelu.

    Představte si knihu plnou čtyřpísmenných slov. Řekněme, že na každé stránce je 1024 čísel. Chcete-li se obrátit na číslo, musíte vědět dvě věci:

    • Počet stránek, na kterých je toto slovo vytištěno.
    • Které slovo na té stránce je ta, kterou hledáte.

    Tak to je přesně to, jak moderní procesory x86 zpracovávají paměť. Je rozdělen na 4 KiB stránky (1024 strojních slov) a tyto stránky mají čísla. (ve skutečnosti mohou být také 4 MiB velké nebo 2 MiB s PAE). Chcete-li se obrátit na paměťovou buňku, potřebujete číslo stránky a adresu na této stránce. Všimněte si, že každá paměťová buňka je odkazována přesně jeden pár čísel, to nebude případ pro segmentaci.

    Segmentace

    No, toto je velmi podobné stránkování. Byl používán v technologii Intel 8086, jen proto, abychom jmenovali jeden příklad. Skupiny adres jsou nyní nazývány segmenty paměti, nikoli stránky. Rozdíl je, že segmenty se mohou překrývat a hodně se překrývají. Například na 8086 byly většina paměťových buněk k dispozici ze 4096 různých segmentů.

    Příklad:

    Řekněme, že máme 8 bajtů paměti, přičemž všechny mají nuly, s výjimkou čtvrtého bytu, který se rovná 255.

    Ilustrace pro model s plochou pamětí:

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

    Ilustrace pro stránkovanou paměť se čtyřbajtovými stránkami:

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

    Ilustrace segmentované paměti se segmenty 4 bajtů se posunuly o 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 | ----- ----- ----- ----- 

    Jak je vidět, čtvrtý byte lze řešit čtyřmi způsoby: (adresování od 0)

    • Segment 0, offset 3
    • Segment 1, offset 2
    • Segment 2, offset 1
    • Segment 3, offset 0

    Je to vždy stejná paměťová buňka.

    V reálných implementacích jsou segmenty posunuty o více než 1 bajt (pro 8086 to bylo 16 bajtů).

    Co je špatné v segmentaci, je to, že je to složité (ale myslím, že už víte, že;) Co je dobré, je, že můžete použít nějaké chytré techniky pro vytváření modulárních programů.

    Můžete například načíst nějaký modul do segmentu a předstírat, že segment je menší, než je skutečně (je dostatečně malý na to, aby držel modul), pak zvolte první segment, který se nepřesahuje s tímto pseudo-menším a načtěte další modul a podobně. V podstatě to, co získáte tímto způsobem, jsou stránky s různou velikostí.


    Musíte něco přidat k vysvětlení? Vypadněte v komentářích. Chcete se dozvědět více odpovědí od ostatních uživatelů technologie Stack Exchange? Podívejte se na celý diskusní příspěvek zde.