Úvodná » ako » Koľko pamäťových adries môže pamäť RAM v počítači držať?

    Koľko pamäťových adries môže pamäť RAM v počítači držať?

    V niektorých prípadoch je zábavné pozrieť sa na povrchovú úroveň počítačového zážitku a v iných dňoch je zábavné naskočiť priamo do vnútorných funkcií. Dnes sa pozrieme na štruktúru počítačovej pamäte a koľko vecí si môžete zabaliť do pamäte RAM.

    Dnešná relácia otázok a odpovedí sa k nám pridelí zdvorilosťou SuperUser - podskupiny Stack Exchange, zoskupenia webových stránok typu Q & A.

    Otázka

    Čítačka SuperUser Johan Smohan sa zaoberá tým, ako typ procesora a veľkosť pamäte pracujú spoločne, aby sa získal celkový počet adries. On píše:

    Koľko pamäťových adries môžeme získať pomocou 32-bitového procesora a 1GB pamäte a koľko je so 64-bitovým procesorom?

    Myslím, že je to niečo takéto:

    1GB rama rozdelených buď 32 bitmi 4 bitmi (?), Aby ste dostali počet adries pamäte?

    Čítam na Wikipédii, že 1 adresy pamäte sú 32 bitov alebo 4 oktety (1 oktet = 8 bitov) v porovnaní so 64 bitovým procesorom, kde 1 adresy pamäte alebo 1 celé číslo je 64 bitov alebo 8 oktetov. Ale neviem, či som to správne pochopil.

    Toto sú druhy otázok, ktoré môžu v noci udržiavať zvedavý nadšenec. Koľko adries je k dispozícii v každom z hypotetických systémov Johana?

    Odpoveď

    Príspevok SuperUser Gronostaj ponúka niekoľko informácií o tom, ako je RAM rozdelená a využívaná:

    Stručná odpoveď: Počet dostupných adries sa rovná menším z týchto:

    • Veľkosť pamäte v bajtoch
    • Najväčšie celé číslo bez znamienka, ktoré možno uložiť v slove stroja CPU

    Dlhá odpoveď a vysvetlenie vyššie uvedeného:

    Pamäť pozostáva z bajtov (B). Každý bajt pozostáva z 8 bitov (b).

    1 B = 8 b 

    1 GB pamäte RAM je skutočne 1 GiB (gibibyte, nie gigabajt). Rozdiel 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äte má svoju vlastnú adresu, bez ohľadu na to, aké veľké je slovo stroja CPU. Napr. Procesor Intel 8086 bol 16-bitový a zaoberal sa pamäťou bajtami, takže moderné 32-bitové a 64-bitové CPU. To je príčina prvého limitu - nemôžete mať viac adries ako pamäťové bajty.

    Pamäťová adresa je len niekoľko bajtov, ktoré procesor musí preskočiť od začiatku pamäte, aby sa dostal k tej, ktorú hľadá.

    • Prístup k prvému bajtu musí preskočiť 0 bajtov, takže adresa prvého bajtu je 0.
    • Prístup k druhému bajtu musí preskočiť 1 bajt, takže jeho adresa je 1.
    • (a tak ďalej ...)
    • Prístup k poslednému bajtu CPU preskočí 1073741823 bajtov, takže jeho adresa je 1073741823.

    Teraz musíte vedieť, čo 32-bit skutočne znamená. Ako som už spomenul, je to veľkosť strojového slova.

    Strojové slovo je množstvo pamäte, ktoré CPU používa na uloženie čísel (v pamäti RAM, cache alebo interných registroch). 32-bitový procesor používa 32 bitov (4 bajty) na držanie čísel. Pamäťové adresy sú aj číslice, takže na 32-bitovom CPU sa pamäťová adresa skladá z 32 bitov.

    Teraz premýšľajte o tom: ak máte jeden bit, môžete uložiť dve hodnoty: 0 alebo 1. Pridajte ešte jeden bit a máte štyri hodnoty: 0, 1, 2, 3. Na troch bitoch môžete uložiť osem hodnôt : 0, 1, 2 ... 6, 7. Toto je vlastne binárny systém a funguje to takto:

    Binárny desiatkový 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 to presne ako obvykle, ale maximálna číslica je 1, nie 9. Desiatková hodnota 0 je 0000, potom pridáte 1 a dostanete 0001, pridajte jeden znova a máte 0010. Čo sa stalo, je tu ako s desatinnou čiarkou 09 a pridať jeden: zmeníte 9 na 0 a zvyšujete ďalšiu číslicu.

    Z vyššie uvedeného príkladu môžete vidieť, že vždy existuje maximálna hodnota, ktorú môžete udržiavať v čísle s konštantným počtom bitov - pretože keď sú všetky bity 1 a pokúsite sa zvýšiť hodnotu o 1, všetky bity sa stanú 0, čím sa prelomí číslo. Nazýva sa to celočíselný pretek a spôsobuje mnoho nepríjemných problémov pre používateľov i vývojárov.

     11111111 = 255 + 1 ----------- 100000000 = 0 (9 bitov tu, takže 1 je orezaná) 
    • Pre 1 bit je najväčšia hodnota 1,
    • 2 bity - 3,
    • 3 bity - 7,
    • 4 bity - 15

    Najväčšie možné číslo je vždy 2 ^ N-1, kde N je počet bitov. Ako som už povedal, pamäťová adresa je číslo a má tiež maximálnu hodnotu. Preto veľkosť strojového slova je tiež limitom počtu dostupných adries pamäte - niekedy CPU jednoducho nedokáže spracovať čísla dostatočne veľké na to, aby adresovali viac pamäte.

    Takže na 32 bitoch môžete držať čísla od 0 do 2 ^ 32-1, a to je 4 294 967 295. Je to viac ako najväčšia adresa v 1 GB RAM, takže vo vašom konkrétnom prípade množstvo RAM bude limitujúcim faktorom.

    Limit RAM pre 32-bitový CPU je teoreticky 4 GB (2 ^ 32) a pre 64-bitový CPU je to 16 EB (exabajty, 1 EB = 2 ^ 30 GB). Inými slovami, 64-bitový procesor by sa mohol zaoberať celým internetom ... 200 krát;) (odhadovanýWolframAlpha).

    V operačných systémoch v reálnom živote však môžu 32-bitové procesory spracovávať približne 3 GiB RAM. Je to kvôli vnútornej architektúre operačného systému - niektoré adresy sú vyhradené na iné účely. Viac informácií o tejto tzv. 3 GB bariére nájdete na Wikipédii. Tento limit môžete zdvihnúť pomocou rozšírenia fyzickej adresy.

    Keď hovoríme o adresovaní pamäti, je niekoľko vecí, ktoré by som spomenul: virtuálna pamäťsegmentácia paging.

    Virtuálna pamäť

    Ako uviedol @Daniel R Hicks v inej odpovedi, OS používajú virtuálnu pamäť. Čo to znamená, že aplikácie skutočne nefungujú na skutočných adresách pamäte, ale tie, ktoré poskytuje operačný systém.

    Táto technika umožňuje operačnému systému presunúť niektoré údaje z pamäte RAM na takzvaný súbor Pagefile (Windows) alebo Swap (* NIX). HDD je málo magnitudes pomalšie ako RAM, ale to nie je vážny problém pre zriedkavo prístupné dáta a umožňuje OS poskytovať aplikácie viac pamäte RAM ako ste skutočne nainštalovali.

    paging

    To, o čom sme sa doteraz hovorili, sa nazýva schéma plochého adresovania.

    Stránkovanie je alternatívna schéma adresovania, ktorá umožňuje adresovať viac pamäte, ktoré ste normálne mohli dosiahnuť jedným strojovým slovom v plochom modeli.

    Predstavte si knihu plnú 4-písmenových slov. Povedzme, že na každej stránke je 1024 čísel. Ak chcete osloviť číslo, musíte vedieť dve veci:

    • Počet stránok, na ktorých je vytlačené toto slovo.
    • Ktoré slovo na tejto stránke je ten, ktorý hľadáte.

    Teraz presne to, ako moderné procesory x86 spracovávajú pamäť. Je rozdelená na 4 KiB stránok (1024 strojových slov) a tieto stránky majú čísla. (vlastne stránky môžu byť tiež 4 MiB veľké alebo 2 MiB s PAE). Ak chcete adresovať pamäťovú bunku, potrebujete číslo stránky a adresu na tejto stránke. Všimnite si, že každá pamäťová bunka je odkazovaná presne na jeden pár čísiel, čo nebude v prípade segmentácie.

    segmentácia

    No toto je veľmi podobné stránkovaniu. Bolo použité v procesore Intel 8086, len aby som uviedol jeden príklad. Skupiny adries sa teraz nazývajú segmenty pamäte, nie stránky. Rozdiel je, že segmenty sa môžu prekrývať a veľmi sa prekrývajú. Napríklad na 8086 boli väčšina pamäťových buniek k dispozícii z 4096 rôznych segmentov.

    Príklad:

    Povedzme, že máme 8 bajtov pamäte, všetky majú nuly, s výnimkou štvrtého bajtu, ktorý sa rovná 255.

    Obrázok modelu s plochou pamäťou:

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

    Ilustrácia stránenej pamäte so stránkami s 4 bajtami:

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

    Obrázok pre segmentovanú pamäť so segmentmi 4 bajtov posunutými 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 | ----- ----- ----- ----- 

    Ako vidíte, štvrtý byte je možné riešiť štyrmi spôsobmi: (adresovanie od 0)

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

    Je to vždy tá istá pamäťová bunka.

    V reálnych implementáciách sa segmenty posunuli o viac ako 1 bajt (pre 8086 to bolo 16 bajtov).

    Čo je zlý s segmentáciou, je to, že je to zložité (ale myslím, že už to viete;) Čo je dobré, je, že môžete použiť niektoré šikovné techniky na vytvorenie modulárnych programov.

    Napríklad môžete načítať niektorý modul do segmentu a predstierať, že segment je menší, než je skutočne (je dostatočne malý na to, aby držal modul), potom si vyberte prvý segment, ktorý sa nepresahuje s týmto pseudomajším a načíta sa ďalší modul a tak ďalej. V podstate to, čo dostanete týmto spôsobom, sú stránky s premenlivou veľkosťou.


    Máte niečo doplniť vysvetlenie? Vyjadrite sa v komentároch. Chcete sa dozvedieť viac odpovedí od iných používateľov technickej úrovne Stack Exchange? Pozrite sa na celý diskusný príspevok tu.