Koliko pomnilniških naslovov lahko RAM v računalniku držite?
Nekoč je zabavno pogledati površinsko raven računalniške izkušnje, v drugih dneh pa je zabavno vdreti v notranje delovanje. Danes si bomo ogledali strukturo računalniškega pomnilnika in koliko stvari lahko spakirate v palico RAM-a.
Današnja seja vprašanj in odgovorov prihaja z namenom SuperUser-a, ki je del skupine Stack Exchange, ki temelji na skupnostih spletnih mest za vprašanja in odgovore.
Vprašanje
Bralnik SuperUser Johan Smohan se ukvarja s tem, kako tip procesorja in velikost pomnilnika sodelujeta, da dobita skupno število naslovov. On piše:
Koliko pomnilniških naslovov lahko dobimo z 32-bitnim procesorjem in 1 GB pomnilnikom ter s 64-bitnim procesorjem?
Mislim, da je nekaj takega:
1 GB pomnilnika, ki ga delimo z 32 bitnimi bitmi (?), Da dobimo število naslovov pomnilnika?
Na Wikipediji sem prebral, da je 1 pomnilniški naslov 32 bitov širok ali 4 oktet (1 oktet = 8 bitov), v primerjavi s 64-bitnim procesorjem, kjer je 1 pomnilniški naslov ali 1 celo število 64 bitov širok ali 8 oktetov. Ampak ne vem, ali sem ga pravilno razumel.
To so vrste vprašanj, ki lahko vodijo radovednega geka ponoči. Koliko naslovov je na voljo v vsakem od Johanovih hipotetičnih sistemov?
Odgovor
Sodelavka SuperUser Gronostaj ponuja nekaj vpogleda v to, kako je RAM razdeljen in uporabljen:
Kratek odgovor: Število razpoložljivih naslovov je enako manjšemu od teh:
- Velikost pomnilnika v bajtih
- Največje celo število, ki je nepodpisano in se lahko shrani v strojni besedi CPU
Dolgo odgovor in pojasnilo zgoraj navedenega:
Pomnilnik je sestavljen iz bajtov (B). Vsak bajt je sestavljen iz 8 bitov (b).
1 B = 8 b
1 GB RAM-a je dejansko 1 GB (gibibit, ne gigabajt). Razlika je:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B
Vsak bajt pomnilnika ima svoj naslov, ne glede na to, kako velika je beseda CPU stroja. Npr. CPU Intel 8086 je bil 16-bitni in se je ukvarjal s pomnilnikom po bajtih, prav tako tudi s sodobnimi 32-bitnimi in 64-bitnimi procesorji. To je vzrok prve omejitve - ne morete imeti več naslovov kot pomnilniških bajtov.
Naslov pomnilnika je le število bajtov, ki jih mora CPU preskočiti od začetka pomnilnika do tistega, ki ga išče.
- Za dostop do prvega bajta mora preskočiti 0 bajtov, tako da je prvi naslov bajta 0.
- Za dostop do drugega bajta mora preskočiti 1 bajt, zato je njegov naslov 1.
- (in tako naprej… )
- Za dostop do zadnjega bajta CPU preskoči 1073741823 bajtov, zato je njegov naslov 1073741823.
Zdaj morate vedeti, kaj v bistvu pomeni 32-bitni. Kot sem že omenil, je velikost strojne besede.
Strojna beseda je količina pomnilnika, ki jo CPU uporablja za shranjevanje številk (v pomnilniku RAM, predpomnilniku ali notranjih registrih). 32-bitni CPU uporablja 32 bitov (4 bajtov) za shranjevanje številk. Tudi pomnilniški naslovi so številke, zato je na 32-bitnem CPU pomnilniški naslov sestavljen iz 32 bitov.
Sedaj razmislite o tem: če imate en bit, lahko shranite dve vrednosti: 0 ali 1. Dodajte še en bit in imate štiri vrednosti: 0, 1, 2, 3. Na treh bitih lahko shranite osem vrednosti : 0, 1, 2… 6, 7. To je dejansko binarni sistem in deluje tako:
Binarni decimalni številki 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
Deluje natanko tako kot običajni dodatek, vendar je največja številka 1, ne 9. Decimalna 0 je
0000
, potem dodate 1 in dobite0001
, dodajte še enkrat in imate0010
. Kar se je zgodilo tukaj, je kot pri decimalki09
in dodajanje enega: spremenite 9 na 0 in povečajte naslednjo številko.Iz zgornjega primera lahko vidite, da vedno obstaja največja vrednost, ki jo lahko obdržite v številu s konstantnim številom bitov - ker, ko so vsi bitovi 1 in poskušate povečati vrednost za 1, bodo vsi bitovi postali 0, s čimer boste prekinili številko. Imenuje se prelivanje celih števil in povzroča veliko neprijetnih težav tako za uporabnike kot za razvijalce.
11111111 = 255 + 1 ----------- 100000000 = 0 (tu je 9 bitov, tako da je 1 obrezan)
- Za 1 bit je največja vrednost 1,
- 2 bita - 3,
- 3 bitov - 7,
- 4 bitov - 15
Največje možno število je vedno 2 ^ N-1, kjer je N število bitov. Kot sem že povedal, je pomnilniški naslov številka in ima tudi najvišjo vrednost. Zato je velikost strojne besede tudi omejitev števila razpoložljivih pomnilniških naslovov - včasih vaš CPU preprosto ne more obdelati dovolj velikih številk za obravnavo pomnilnika.
Torej na 32 bitov lahko shranite številke od 0 do 2 ^ 32-1, in to je 4 294 967 295. To je več kot največji naslov v 1 GB RAM-a, tako da bo v vašem primeru količina RAM-a omejevalni dejavnik.
Omejitev RAM za 32-bitno CPU je teoretično 4 GB (2 ^ 32), za 64-bitno CPU pa 16 EB (eksabajti, 1 EB = 2 ^ 30 GB). Z drugimi besedami, 64-bitna CPU bi lahko obravnavala celoten internet… 200-krat;) (ocenjeno z WolframAlpha).
Vendar pa lahko v resničnih operacijskih sistemih 32-bitne procesorje obravnavajo približno 3 GB RAM-a. To je zaradi notranje arhitekture operacijskega sistema - nekateri naslovi so rezervirani za druge namene. Več o tako imenovani pregradi 3 GB lahko preberete na Wikipediji. To omejitev lahko dvignete z razširitvijo fizičnega naslova.
Če govorimo o naslavljanju pomnilnika, moram omeniti nekaj stvari: virtualni pomnilnik, segmentacijo in paging.
Navidezni pomnilnik
Kot je v drugem odgovoru poudaril @ Daniel R Hicks, operacijski sistemi uporabljajo virtualni pomnilnik. To pomeni, da aplikacije dejansko ne delujejo na dejanskih naslovih pomnilnika, temveč na tistih, ki jih zagotavlja OS.
Ta tehnika omogoča operacijskemu sistemu, da premakne nekatere podatke iz RAM-a v ti Pagefile (Windows) ali Swap (* NIX). HDD je nekoliko večji od RAM-a, vendar to ni resen problem za redko dostopne podatke in omogoča operacijskemu sistemu, da aplikacijam zagotovi več RAM-a, kot ste ga dejansko namestili..
Paging
O tem, o čemer smo govorili doslej, se imenuje shema ravnega naslavljanja.
Paging je alternativna shema naslavljanja, ki omogoča, da naslovite več pomnilnika, ki ga lahko običajno uporabite z eno strojno besedo v ravnem modelu.
Predstavljajte si knjigo s 4-črkovnimi besedami. Recimo, da je na vsaki strani 1024 številk. Če želite nasloviti številko, morate vedeti dve stvari:
- Število strani, na kateri se ta beseda natisne.
- Katero besedo na tej strani iščete.
Zdaj je to točno, kako moderni procesorji x86 upravljajo spomin. Razdeljen je na 4 KiB strani (vsakih 1024 strojnih besed) in te strani imajo številke. (pravzaprav so lahko strani tudi 4 MiB velike ali 2 MiB z PAE). Če želite nasloviti pomnilniško celico, potrebujete številko strani in naslov na tej strani. Upoštevajte, da je za vsako pomnilniško celico naveden natanko en par številk, kar ne velja za segmentacijo.
Segmentacija
No, ta je precej podoben paging. Uporabljen je bil za Intel 8086, samo da navedemo en primer. Skupine naslovov se zdaj imenujejo segmenti pomnilnika, ne strani. Razlika je, da se segmenti lahko prekrivajo in se preveč prekrivajo. Na primer na večini 8086 je bilo na voljo več pomnilniških celic iz 4096 različnih segmentov.
Primer:
Recimo, da imamo 8 bajtov pomnilnika, vsi imajo ničle, razen 4. bajta, ki je enak 255.
Ilustracija za model z ravnim pomnilnikom:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Ilustracija za stranski pomnilnik s 4-bajtnimi stranmi:
STRAN0 _____ | 0 | | 0 | | 0 | STRAN 1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
Ilustracija za segmentirani pomnilnik s 4-bajtnimi segmenti, premaknjenimi za 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 | ----- ----- ----- -----
Kot lahko vidite, se lahko četrti bajt obravnava na štiri načine: (naslavljanje od 0)
- Segment 0, odmik 3
- Segment 1, odmik 2
- Segment 2, odmik 1
- Segment 3, odmik 0
Vedno je ista pomnilniška celica.
V realnih izvedbah so segmenti premaknjeni za več kot 1 bajt (za 8086 je bilo 16 bajtov).
Kar je slabo pri segmentaciji, je, da je to zapleteno (vendar mislim, da že veste, da). Dobro je, da lahko uporabite nekaj pametnih tehnik za ustvarjanje modularnih programov.
Lahko na primer naložite nekaj modulov v segment, nato pa se pretvarjate, da je segment manjši, kot je v resnici (dovolj majhen, da držite modul), nato izberite prvi segment, ki se ne prekriva s psevdo-manjšim modulom, in naložite naslednji modul in tako naprej. V bistvu, kar dobite na ta način, so strani spremenljive velikosti.
Imate kaj dodati pojasnilu? Zvok izključen v komentarjih. Želite prebrati več odgovorov drugih uporabnikov tehnologije Stack Exchange? Oglejte si celotno nit razprave tukaj.