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 kapsz0001
, adjunk hozzá még egyszer, és van0010
. Ami itt történik, olyan, mintha tizedes lenne09
é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ória, szegmentá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.