Homepage » hogyan kell » Hány memóriacímet kaphat a RAM a számítógépemben?

    Hány memóriacímet kaphat a RAM a számítógépemben?

    Valahogy szórakoztató, ha megnézzük a számítástechnikai élmény szintjét, és más napokon is szórakoztató, hogy belehelyezzünk a belső működésbe. Ma megnézzük a számítógép memóriájának szerkezetét és azt, hogy mennyi dolgot tudunk csomagolni egy RAM-ba.

    A mai Kérdések és válaszok munkamenet a Jóvagyon - a Stack Exchange alosztályának, a közösség által vezérelt Q&A webhelyek csoportjának köszönhetően..

    A kérdés

    A SuperUser olvasó, Johan Smohan azzal küzd, hogy a processzor és a memória mérete együttesen hozza létre a teljes címek számát. Ír:

    Hány memóriacímet kaphatunk egy 32 bites processzorral és 1 GB-os RAM-mal és hány 64 bites processzorral?

    Azt hiszem, ez valami ilyesmi:

    1 GB RAM osztva vagy 32 bites 4 bites (?), Hogy megkapja a memóriacímek számát?

    Wikipédiában olvastam, hogy 1 memóriacím 32 bites vagy 4 oktett (1 oktett = 8 bit), összehasonlítva egy 64 bites processzorral, ahol 1 memóriacím vagy 1 egész szám 64 bites vagy 8 oktett. De nem tudom, hogy jól értettem-e.

    Ezek olyan kérdések, amelyek éjszaka megőrzik egy kíváncsi geek-t. Hány cím van elérhető minden Johan hipotetikus rendszerében?

    A válasz

    A Gronostaj SuperUser közreműködője betekintést nyújt arra vonatkozóan, hogy a RAM hogyan oszlik meg és használják fel:

    Rövid válasz: A rendelkezésre álló címek száma megegyezik a következők közül:

    • Memória mérete bájtban
    • Legnagyobb aláírás nélküli egész szám, amelyet a CPU gépi szava menthet

    Hosszú válasz és magyarázat a fentiekre:

    A memória bájtokból (B) áll. Minden bájt 8 bitből áll (b).

    1 B = 8 b 

    1 GB RAM valójában 1 GiB (gibibyte, nem gigabyte). A különbség:

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

    A memória minden bájtjának saját címe van, nem számít, milyen nagy a CPU gépi szó. Például. Az Intel 8086 CPU 16 bites volt, és bájtokkal foglalkozott a memóriával, így a modern 32 bites és 64 bites processzorok is. Ez az első korlát oka - nem lehet több cím, mint a memória bájtok.

    A memóriacím csak néhány bájt, amelyet a processzornak ki kell ugrania a memória elejétől, hogy elérje azt, amit keres.

    • Az első bájt eléréséhez ki kell hagynia a 0 bájtot, így az első byte címe 0.
    • A második bájt eléréséhez ki kell ugrani az 1 bájtot, így címe 1.
    • (és így tovább… )
    • Az utolsó bájt eléréséhez a CPU kihagyja a 1073741823 bájtot, így a címe 1073741823.

    Most már tudnod kell, hogy mit jelent a 32 bites. Mint korábban említettem, ez egy gépi szó mérete.

    A gépi szó a számok tárolására használt memória (RAM, gyorsítótár vagy belső nyilvántartások). A 32 bites CPU 32 bitet (4 bájt) használ a számok megtartásához. A memóriacímek is számok, így a 32 bites CPU-n a memóriacím 32 bitből áll.

    Most gondolj erre: ha van egy bit, akkor két értéket menthetsz rá: 0 vagy 1. Add még egy bitet, és négy értéked van: 0, 1, 2, 3. Három bitben nyolc értéket menthetsz : 0, 1, 2… 6, 7. Ez valójában egy bináris rendszer, és így működik:

    Bináris decimális 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 

    Pontosan úgy működik, mint a szokásos kiegészítés, de a maximális szám 1, nem 9. decimális 0000, majd adj hozzá 1-et és kapsz 0001, adjunk hozzá még egyszer, és van 0010. Ami itt történik, olyan, mintha tizedes lenne 09 és egy: hozzáadjuk a 9-et 0-ra és a következő számjegyet növekszik.

    A fenti példából láthatjuk, hogy mindig van egy maximális érték, amit állandó számban tarthatsz, mert ha minden bit 1-es, és megpróbálod növelni az értéket 1-rel, akkor minden bit 0 lesz, így megszakad a szám. Ezt egész szám túlcsordulásnak nevezik, és sok kellemetlen problémát okoz, mind a felhasználók, mind a fejlesztők számára.

     11111111 = 255 + 1 ----------- 100000000 = 0 (9 bit itt, így 1-et vágunk) 
    • 1 bites esetén a legnagyobb érték 1,
    • 2 bit - 3,
    • 3 bit - 7,
    • 4 bit - 15

    A legnagyobb lehetséges szám mindig 2 ^ N-1, ahol N a bitek száma. Ahogy korábban említettem, egy memóriacím szám, és ez is egy maximális értékkel rendelkezik. Éppen ezért a gépi szó mérete is korlátozza a rendelkezésre álló memóriacímek számát - néha a CPU csak nem képes elég nagy számokat feldolgozni ahhoz, hogy több memóriát kezeljen.

    Tehát 32 bitesen 0 és 2 ^ 32-1 között lehet számokat tárolni, és ez 4 294 967 295. Ez több, mint a legnagyobb cím 1 GB RAM-ban, így az adott esetben a RAM mennyisége lesz a korlátozó tényező.

    A 32 bites CPU RAM korlátja elméletileg 4 GB (2 ^ 32) és 64 bites CPU esetén 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Más szavakkal, a 64 bites CPU képes teljes internetet kezelni… 200-szor;) (becslések: WolframAlpha).

    A valós életű operációs rendszerekben azonban a 32 bites processzorok körülbelül 3 GiB-t képesek kezelni. Az operációs rendszer belső architektúrája miatt - egyes címek más célokra vannak fenntartva. Az ún. 3 GB-os akadályról a Wikipédiában olvashat. A fizikai cím kiterjesztéssel emelheti ezt a korlátot.

    A memória címzésével kapcsolatban kevés dolog, amit meg kell említenem: virtuális memóriaszegmentáció és lapozás.

    Virtuális memória

    Ahogy a @Daniel R Hicks egy másik válaszban rámutatott, az OS-ek virtuális memóriát használnak. Ez azt jelenti, hogy az alkalmazások valójában nem működnek valódi memóriacímeken, hanem azok, amelyeket az operációs rendszer biztosít.

    Ez a technika lehetővé teszi az operációs rendszer számára, hogy néhány adatot RAM-ról egy úgynevezett Pagefile (Windows) vagy Swap (* NIX) fájlba helyezzen. A merevlemez-meghajtó kevésbé lassú, mint a RAM, de ez nem jelent komoly problémát a ritkán hozzáférhető adatoknál, és lehetővé teszi az operációs rendszer számára, hogy az alkalmazásoknak több RAM-ot biztosítson, mint amennyit ténylegesen telepítettél.

    személyhívó

    Eddig beszéltünk lapos címzési rendszernek.

    A címkézés egy alternatív címzési séma, amely lehetővé teszi, hogy több memóriát kezeljen, amit általában egy gépi szóval sík modellben tud.

    Képzeld el egy könyvet, amely 4 betűs szavakkal van tele. Tegyük fel, hogy minden oldalon 1024 szám van. Szám megadásához két dolgot kell tudnia:

    • Azon oldalak száma, amelyeken a szó nyomtatásra kerül.
    • Melyik szó az adott oldalon, amit keres.

    Most pontosan ez a modern x86 processzorok kezelik a memóriát. 4 KiB oldalra van osztva (1024 gépi szavak), és ezeknek az oldalaknak számuk van. (valójában az oldalak is lehetnek 4 MiB vagy 2 MiB PAE-vel). Ha a memóriacella címét szeretné megcímezni, akkor az oldalszámra és címre van szüksége. Ne feledje, hogy minden memóriacellát pontosan egy pár szám hivatkozik, ez nem lesz a szegmentálás esetében.

    szegmentálás

    Nos, ez nagyon hasonlít a lapozásra. Ezt az Intel 8086-ban használták, csak egy példa megnevezésére. A címek csoportjait ma már nem memória oldalaknak nevezik. A különbség szegmensek átfedhetnek, és sokat fednek. Például 8086-on a legtöbb memóriacellát 4096 különböző szegmensből lehetett beszerezni.

    Egy példa:

    Tegyük fel, hogy 8 bájtnyi memóriánk van, minden nullával, kivéve a 4. bájtot, ami 255-tel egyenlő.

    A lapos memóriamodell illusztrációja:

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

    A lapozott memória illusztrációja 4 bájtos oldalakkal:

     PAGE0 _____ | 0 | | 0 | | 0 | 1. oldal | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

    A szegmentált memória illusztrációja 4 bájtos szegmensekkel 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 | ----- ----- ----- ----- 

    Mint látható, a 4. bájt négyféleképpen kezelhető: (0-tól címzés)

    • 0 szegmens, eltolás 3
    • 1. szegmens, eltolás 2
    • 2. szegmens, eltolás 1
    • 3. szegmens, 0 eltolás

    Mindig ugyanaz a memóriacella.

    A valós élet megvalósításában a szegmenseket több mint 1 bájt eltolja (8086-ra 16 bájt volt).

    Mi a rossz a szegmentálás, hogy bonyolult (de azt hiszem, már tudod, hogy;) Mi a jó, hogy használhatsz néhány okos technikát a moduláris programok létrehozásához.

    Például egyes modulokat betölthet egy szegmensbe, majd úgy tesz, mintha a szegmens kisebb lenne, mint amilyennek van (csak elég kicsi ahhoz, hogy a modult tartsa), majd válassza ki az első szegmenst, amely nem fedi át ezt a pszeudo-kisebbet, és töltse be következő modul, és így tovább. Alapvetően, amit kapsz így a változó méretű oldalak.


    Van valami, amit hozzá kell adni a magyarázathoz? Kikapcsolja a megjegyzéseket. Szeretne további válaszokat olvasni más tech-savvy Stack Exchange felhasználóktól? Nézze meg a teljes beszélgetés szálát itt.