20Aug

Koliko naslovov pomnilnika lahko shranite v računalniku v računalniku?

Nekega dne je zabavno pogledati površinsko raven računalniške izkušnje, drugi dnevi pa je zabavno, da se potopite v notranje delovanje. Danes si oglejmo strukturo računalniškega pomnilnika in koliko stvari lahko zapakirate v palico RAM-a.

Današnje vprašanje &S sejo odgovora prihaja uporaba SuperUserja, ki je razdeljena na Stack Exchange, skupinsko spletno stran Q & A.

Vprašalnik

SuperUser bralec Johan Smohan se spoprijema s tem, kako delujejo procesorji in velikost pomnilnika, da bi dobili skupno število naslovov. Piše:

Koliko pomnilniških naslovov lahko dobimo z 32-bitnim procesorjem in 1 GB RAM-a in koliko s 64-bitnim procesorjem?

Mislim, da je to nekaj takega:

1 GB RAM-a, deljen s 32-bitnim 4-bitnim( ?), Da bi dobili število pomnilniških naslovov?

V Wikipediji sem prebral, da je 1 pomnilniški naslov širok 32 bitov ali 4 okte( 1 oktet = 8 bitov) v primerjavi s 64-bitnim procesorjem, pri katerem je 1 pomnilniški naslov ali 1 celo število širok 64 bitov ali 8 oktov. Ampak ne vem, ali sem pravilno razumel tudi to.

To so vrste vprašanj, ki lahko ohranijo nenavadno radovednost. Koliko naslovov je na voljo v vsakem od hipotetičnih sistemov Johan?

Odgovornost

SuperUser prispevek Gronostaj ponuja nekaj vpogleda v to, kako je RAM razdeljen in uporabljen:

Kratek odgovor: Število razpoložljivih naslovov je manjše od tistih:

  • Velikost pomnilnika v bajtih
  • Največje nepotno celo število, ki se lahko shraniv strojni besedi CPU

Dolg odgovor in razlaga zgoraj:

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 GiB( gibibyte, 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 spomina ima svoj naslov, ne glede na to, kako velika je beseda strojne naprave CPU.Npr. Intelov procesor 8086 je bil 16-biten, naslov pa je bil po bajtih, tako tudi moderni 32-bitni in 64-bitni CPU.To je vzrok za prvo omejitev - ne morete imeti več naslovov kot bajtov pomnilnika.

Naslov pomnilnika je le nekaj bajtov, ki jih mora CPU preskočiti z začetka pomnilnika, da bi prišli do tistega, ki ga išče.

  • Za dostop do prvega bajta mora preskočiti 0 bajtov, zato je prvi bajtov naslov 0.
  • Za dostop do drugega bajta mora preskočiti 1 bajt, zato je njen naslov 1.
  • ( in tako naprej. ..)
  • Za dostop dozadnji bajt, CPU preskoči 1073741823 bajtov, zato je njen naslov 1073741823.

Zdaj morate vedeti, kaj dejansko pomeni 32-bitna. Kot sem že omenil, je to velikost strojne besede.

Strojna beseda je količina pomnilnika, ki ga CPU uporablja za shranjevanje številk( v RAM-ju, predpomnilniku ali notranjih registrih).32-bitni CPU uporablja 32 bitov( 4 bajtov) za shranjevanje številk. Pomnilniški naslovi so tudi številke, zato je na 32-bitnem CPU-u naslov pomnilnika 32 bitov.

Zdaj razmislite o tem: če imate en bit, lahko na njej shranite dve vrednosti: 0 ali 1. Dodajte še en bit in imate štiri vrednosti: 0, 1, 2, 3. Na treh bitih lahko prihranite osemvrednosti: 0, 1, 2. .. 6, 7. To je pravzaprav binarni sistem in deluje tako:

Binarna decimalna 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 111011 12 1100 13 1101 14 1110 15 1111

Deluje natanko kot običajen dodatek, vendar je največja številka 1, ne 9. Decimalna 0 je 0000, nato dodate 1 in dobite 0001, ponovno dodate eno in imate 0010. Kajtukaj je, da ima decimalno številko 09 in dodate eno: spremenite 9 na 0 in povečajte naslednjo številko.

Iz zgornjega primera lahko vidite, da vedno obstaja maksimalna vrednost, ki jo lahko hranite v številu s konstantnim številom bitov - ker ko so vsi bitovi 1 in poskusite povečati vrednost za 1, bodo vsi bitovi postali 0,število. Imenuje se preliv celote in povzroča številne neprijetne težave, tako za uporabnike kot za razvijalce.

11111111 = 255 + 1 ----------- 100000000 = 0( 9 bitov tukaj, tako da je 1 obrezan)
  • Za 1 bit je največja vrednost 1,
  • 2 bita - 3,
  • 3 bitov -7,
  • 4 bitov - 15

Največje število je vedno 2 ^ N-1, kjer je N število bitov. Kot sem že omenil, je pomnilniški naslov številka in ima tudi največjo vrednost. Zato je strojna beseda velikost tudi omejitev števila razpoložljivih pomnilniških naslovov - včasih vaš CPU preprosto ne more obdelati številk, ki so dovolj velike, da bi rešili več pomnilnika.

Tako na 32 bitov lahko vodite š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, zato bo v vašem specifičnem primeru količina RAM-a omejevalni dejavnik.

Omejitev RAM-a za 32-bitni CPU je teoretično 4 GB( 2 ^ 32), 64-bitni CPU pa 16 EB( exabytes, 1 EB = 2 ^ 30 GB).Z drugimi besedami, 64-bitni CPU lahko obravnava celoten internet. .. 200-krat;)( ocenjeno zWolframAlpha).

Vendar v 32-bitnih procesorskih enotah v realnih življenjskih sistemih lahko naslovite približno 3 GB RAM-a. To je zaradi notranje arhitekture operacijskega sistema - nekateri naslovi so rezervirani za druge namene. Več o tej ti 3 GB oviri lahko preberete na Wikipediji. To omejitev lahko dvignete z razširitvijo fizičnega naslova.

Ko govorimo o pomnilniškem naslavljanju, moram omeniti nekaj stvari: navideznega pomnilnika , segmentacije in pozivnikov .

Virtualni pomnilnik

Kot je @Daniel R Hicks poudaril v drugem odgovoru, operacijski sistemi uporabljajo virtualni pomnilnik. Kaj to pomeni, da aplikacije dejansko ne delujejo na resničnih naslovih pomnilnika, ampak tiste, ki jih ponuja OS.

Ta tehnika omogoča, da operacijski sistem premakne nekatere podatke iz RAM-a v tako imenovano Pagefile( Windows) ali Swap( * NIX).HDD je nekaj velikosti počasnejši od RAM-a, vendar to ni resen problem za redko dostopne podatke in OS omogoča, da aplikacijam zagotovi več RAM-ja, kot ste dejansko namestili.

Paging

O tem smo govorili doslej, se imenuje shema ravnega naslavljanja.

Paging je alternativna shema za naslavljanje, ki omogoča obravnavo več pomnilnika, ki ga običajno lahko uporabljate z eno besedo stroja v ravnem modelu.

Predstavljajte si knjigo, napolnjeno s štirimi črkami. Recimo, da je na vsaki strani 1024 številk.Če želite nasloviti številko, morate vedeti dve stvari:

  • Število strani, na kateri je natisnjena ta beseda.
  • Katera beseda na tej strani je tista, ki jo iščete.

Zdaj je to, kako sodobni procesorji x86 obdelujejo pomnilnik. Razdeljen je na 4 strani( po 1024 strojnih besed) in te strani imajo številke.(pravzaprav so lahko tudi strani 4 GB velike ali 2 MB z PAE).Ko želite nasloviti pomnilniško celico, potrebujete številko in naslov strani na tej strani. Upoštevajte, da se vsaka pomnilniška celica sklicuje na točno en par številk, kar ne velja za segmentacijo.

Segmentacija

No, ta je precej podobna pagerjavi. Uporabili so ga v Intel 8086, samo da navedemo en primer. Skupine naslovov se zdaj imenujejo segmenti pomnilnika, ne pa strani. Razlika je, da se segmenti lahko prekrivajo in se veliko prepletajo. Na primer, na 8086 večini celic pomnilnika je bilo na voljo od 4096 različnih segmentov.

Primer:

Recimo, da imamo 8 bajtov pomnilnika, pri čemer imajo vse ničele, razen za 4. bajt, ki je enak 255.

Ilustracija za ravno pomnilniški model:

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

Ilustracija za paged pomnilnik s 4-bajtnimi stranmi:

PAGE0 _____ |0 ||0 ||0 |PAGE1 |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, je 4. bajt naslovljen na štiri načine:( naslavljanje od 0)

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

Vedno je ista pomnilniška celica.

V realističnih izvedbah se segmenti premaknejo za več kot 1 bajt( za 8086 je bilo 16 bajtov).

Kaj je slabo glede segmentacije je, da je zapleteno( vendar mislim, da to že veste;) Kaj je dobro, je, da lahko uporabite nekaj pametnih tehnik za izdelavo modularnih programov.

Na primer, lahko vstavite nekaj modulov v segment, nato se pretvarjate, da je segment manjši, kot je res( le dovolj majhen, da drži modul), nato pa izberite prvi segment, ki se ne prekriva s tem psevdonimom in obremenitvijonaslednji modul in tako naprej. V bistvu je tisto, kar dobite na tej poti, strani s spremenljivo velikostjo.

Ali želite dodati nekaj pojasnila? Zvok v komentarjih.Želite prebrati več odgovorov od drugih uporabniških članov stack Exchange? Oglejte si celotno temo za razpravo tukaj.