20Aug

Cât de multe adrese de memorie poate stoca memoria RAM din computerul meu?

Uneori este distractiv să te uiți la nivelul de suprafață al experienței de calcul, iar în alte zile este distractiv să te plictisești direct în lucrările interioare. Astăzi, ne uităm la structura de memorie a calculatorului și cât de multe lucruri puteți împacheta într-un stick de RAM.

Întrebarea de astăzi &Sesiunea de răspuns vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor web Q & A.

Întrebarea

SuperUser cititorul Johan Smohan se luptă cu modul în care tipul de procesor și mărimea memoriei funcționează împreună pentru a obține un număr total de adrese. El scrie:

Câte adrese de memorie putem obține cu un procesor pe 32 de biți și un berbec de 1 GB și câte un procesor pe 64 de biți?

Cred că este ceva de genul asta:

1GB de ram împărțit fie de 32 biți 4 biți( ?) Pentru a obține numărul de adrese de memorie?

Am citit pe Wikipedia că 1 adrese de memorie are o lățime de 32 biți sau 4 octeți( 1 octet = 8 biți), comparativ cu un procesor de 64 biți în care 1 adrese de memorie sau un număr întreg este de 64 de biți sau 8 octeți. Dar nu știu dacă l-am înțeles corect.

Acestea sunt tipurile de întrebări care pot păstra un geek curios până noaptea. Câte adrese sunt disponibile în cadrul fiecăruia dintre sistemele ipotetice ale lui Johan?

Răspunsul la răspunsul

Contribuitor SuperUser Gronostaj oferă câteva informații despre modul în care este împărțită și folosită memoria RAM:

Răspuns scurt: Numărul de adrese disponibile este egal cu cel mai mic dintre acestea:

  • Dimensiunea memoriei în octeți
  • Cel mai mare număr întreg nesemnat care poate fi salvatîn cuvântul mașinii procesorului

Răspuns lung și explicație a celor de mai sus: memoria

constă din octeți( B).Fiecare octet este format din 8 biți( b).

1 B = 8 b

1 GB de memorie RAM este de fapt 1 GiB( gibibyte, nu gigabyte).Diferența este:

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

Fiecare octet de memorie are o adresă proprie, indiferent cât de mare este cuvântul mașinii CPU.De exemplu. Procesorul Intel 8086 a fost de 16 biți și se adresează memoriei prin octeți, la fel și procesoarele moderne pe 32 de biți și pe 64 de biți. Aceasta este cauza primei limite - nu puteți avea mai multe adrese decât octeții de memorie.

Adresa de memorie este doar un număr de octeți, procesorul trebuie să sări de la începutul memoriei pentru a ajunge la cel pe care îl caută.

  • Pentru a accesa primul octet, trebuie să sări peste octeți, astfel încât adresa primului octet este 0.
  • Pentru a accesa cel de-al doilea octet, trebuie să săriți 1 octet, deci adresa lui este 1.
  • ( și așa mai departe. ..)
  • Pentru a accesaultimul byte, CPU sare peste 1073741823 octeți, deci adresa lui este 1073741823.

Acum trebuie să știi ce înseamnă 32 de biți. După cum am menționat mai devreme, este vorba de mărimea unui cuvânt din mașină.

Cuvântul mașinii este cantitatea de memorie utilizată de CPU pentru a ține numerele( în memoria RAM, cache sau intern).Procesorul pe 32 de biți utilizează 32 de biți( 4 octeți) pentru a ține numerele. Adresele de memorie sunt și numere, așa că pe un procesor pe 32 de biți adresa de memorie este formată din 32 de biți.

Acum gândiți-vă la acest lucru: dacă aveți un bit, puteți salva două valori pe el: 0 sau 1. Adăugați încă un bit și aveți patru valori: 0, 1, 2, 3. Pe trei biți puteți salva optValori: 0, 1, 2. .. 6, 7. Acesta este de fapt un sistem binar și funcționează astfel:

Decimal Binar 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

Funcționează exact ca adăugarea obișnuită, dar cifra maximă este 1, nu 9. Decimal 0 este 0000, atunci adăugați 1 și obțineți 0001, adăugați una din nou și aveți 0010. Cehappend aici este ca și cum ați avea zecimal 09 și adăugați unul: modificați 9 la 0 și creșteți următoarea cifră.

Din exemplul de mai sus puteți vedea că există întotdeauna o valoare maximă pe care o puteți păstra într-un număr cu un număr constant de biți - pentru că atunci când toți biții sunt 1 și încercați să creșteți valoarea cu 1, toți biții vor deveni 0,numarul. Se numește overflow întreg și provoacă multe probleme neplăcute, atât pentru utilizatori, cât și pentru dezvoltatori.

11111111 = 255 + 1 ----------- 100000000 = 0( 9 biți aici, deci 1 este tăiat)
  • Pentru 1 bit valoarea cea mai mare este 1,
  • 2 biți - 3,
  • 3 biți -7,
  • 4 biți - 15

Cel mai mare număr posibil este întotdeauna 2 ^ N-1, unde N este numărul de biți. Așa cum am spus înainte, o adresă de memorie este un număr și are, de asemenea, o valoare maximă.De aceea, mărimea cuvântului mașinii este, de asemenea, o limită pentru numărul de adrese de memorie disponibile - uneori CPU-ul dvs. nu poate procesa numere suficient de mari pentru a adresa mai multă memorie.

Deci, pe 32 de biți puteți păstra numere de la 0 la 2 ^ 32-1, și asta e 4 294 967 295. Este mai mult decât cea mai mare adresă în memoria RAM de 1 GB, deci în cazul dvs. specific, suma RAM va fi factorul limitativ.

Limita RAM pentru CPU pe 32 de biți este teoretic de 4 GB( 2 ^ 32), iar pentru CPU pe 64 de biți este de 16 EB( exabytes, 1 EB = 2 ^ 30 GB).Cu alte cuvinte, procesorul pe 64 de biți ar putea adresa întregului Internet. .. de 200 de ori;)( estimat de WolframAlpha).

Cu toate acestea, în sistemele de operare din viața reală, procesoarele pe 32 de biți pot adresa aproximativ 3 GB de memorie RAM.Asta din cauza arhitecturii interne a sistemului de operare - unele adrese sunt rezervate pentru alte scopuri. Puteți citi mai multe despre această așa-numită barieră de 3 GB pe Wikipedia. Puteți ridica această limită cu extensia Adresă fizică.

Vorbind despre adresarea memoriei, există câteva lucruri pe care ar trebui să le menționez: memoria virtuală , segmentarea și pagingul .

Memorie virtuală

După cum a subliniat @Daniel R Hicks într-un alt răspuns, OS folosesc memoria virtuală.Ceea ce înseamnă că aplicațiile nu funcționează efectiv pe adrese de memorie reale, ci pe cele furnizate de sistemul de operare.

Această tehnică permite sistemului de operare să transfere anumite date din memoria RAM într-un așa-numit Pagefile( Windows) sau Swap( * NIX).HDD are câteva magnitudine mai lent decât memoria RAM, dar nu este o problemă serioasă pentru datele accesate rar și permite sistemului de operare să furnizeze mai multă memorie RAM decât ați instalat.

Paging

Ceea ce am vorbit până acum este numit schema de abordare plană.

Paging este o schemă alternativă de adresare care permite să se adreseze mai multă memorie pe care ați putea-o în mod normal cu un cuvânt de mașină în model plat.

Imaginați-vă o carte plină cu cuvinte de 4 litere. Să presupunem că există 1024 numere pe fiecare pagină.Pentru a adresa un număr, trebuie să știți două lucruri:

  • Numărul paginii în care este imprimat cuvântul respectiv.
  • Ce cuvânt pe acea pagină este cel pe care îl căutați.

Acum este exact modul în care CPU-urile moderne x86 gestionează memoria. Este împărțită în 4 pagini KiB( câte 1024 de cuvinte în mașină) și paginile respective au numere.(de fapt paginile pot fi, de asemenea, 4 MiB mari sau 2 MiB cu PAE).Când doriți să abordați celula de memorie, aveți nevoie de numărul și adresa paginii din acea pagină.Rețineți că fiecare celulă de memorie este menționată de exact o pereche de numere, ceea ce nu va fi cazul pentru segmentare.

Segmentare

Ei bine, aceasta este destul de similară cu paging-ul. A fost folosit în Intel 8086, doar pentru a numi un exemplu. Grupurile de adrese sunt denumite acum segmente de memorie, nu pagini. Diferența este că segmentele se pot suprapune și se suprapun foarte mult. De exemplu, pe 8086 cele mai multe celule de memorie erau disponibile din 4096 de segmente diferite.

Un exemplu:

Să presupunem că avem 8 octeți de memorie, toate cu zero, cu excepția celui de al patrulea octet, care este egal cu 255.

Ilustrație pentru modelul de memorie plat:

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

Ilustrație pentru memoria paginată cu pagini cu 4 octeți:

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

Ilustrație pentru memoria segmentată cu segmente de 4 byte mutate cu 1:

SEG 0 _____ SEG 1 |0 |_____ SEG 20 ||0 |_____ SEG 30 ||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 |----- ----- ----- -----

După cum puteți vedea, al patrulea octet poate fi abordat în patru moduri:( adresându-se de la 0)

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

Este întotdeauna aceeași celulă de memorie.

În implementările din viața reală segmentele sunt deplasate cu mai mult de 1 octet( pentru 8086 a fost 16 octeți).

Ce este rău în ceea ce privește segmentarea este că este complicat( dar cred că deja știți asta;) Ce este bine, este că puteți folosi anumite tehnici inteligente pentru a crea programe modulare.

De exemplu, puteți încărca un modul într-un segment, apoi pretindeți că segmentul este mai mic decât este într-adevăr( suficient de mic pentru a ține modulul), apoi alegeți primul segment care nu se suprapune cu cel pseudo-mic și încărcațimodulul următor și așa mai departe. Practic, ceea ce obțineți în acest mod este paginile cu dimensiuni variabile.

Aveți ceva de adăugat la explicație? Sunați în comentariile. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.