If-Koubou

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

Cât de multe adrese de memorie poate stoca memoria RAM din computerul meu? (Cum să)

Într-o zi este distractiv să te uiți la nivelul suprafeței experienței de calcul, iar alte zile este distractiv să te plictisești chiar î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.

Sesiunea de întrebări și răspunsuri din ziua de astăzi vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor Q & A.

Intrebarea

Editorul de aplicații super-utilizator Johan Smohan se luptă cu modul în care tipul de procesor și dimensiunea 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:

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 este de 32 biți sau 4 octeți (1 octet = 8 biți), comparativ cu un procesor pe 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

Contribuitorul 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 CPU

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

Memoria este formată 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 0 octeți, astfel încât adresa primului octet este 0.
  • Pentru a accesa cel de-al doilea octet, trebuie să sări peste un octet, deci adresa lui este 1.
  • (si asa mai departe… )
  • Pentru a accesa ultimul octet, CPU sare peste 1073741823 octeți, deci adresa acestuia este 1073741823.

Acum trebuie să știți ce semnifică de fapt 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 deține numerele (în memorie RAM, cache sau interne). 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 acesta: 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 opt valori : 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 11 1011 12 1100 13 1101 14 1110 15 1111 

Funcționează exact ca adăugarea obișnuită, dar cifra maximă este de 1, nu de 9. Decimal 0 este0000, atunci adăugați 1 și obțineți0001, adăugați o dată din nou și aveți0010. Ce sa întâmplat aici este ca și cum ai avea zecimal09 și adăugați una: modificați 9 la 0 și creșteți cifra următoare.

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, număr. 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 biți cea mai mare valoare 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 aborda 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 abordarea memoriei, sunt puține lucruri pe care ar trebui să le menționez:memorie virtualasegmentareașipaginare.

Memorie virtuala

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 RAM, dar nu este o problemă gravă pentru datele accesate rar și permite sistemului de operare să furnizeze aplicații mai multă RAM decât ați instalat.

paginare

Ceea ce am vorbit până acum este numit schema de adresare 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 x86 moderne 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.

Segmentarea

Ei bine, acesta 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 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 | ----- ----- ----- ----- 

După cum puteți vedea, 4 octeți pot fi abordați în patru moduri: (adresându-se de la 0)

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

Este întotdeauna aceeași celulă de memorie.

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

Ce este rău în ceea ce privește segmentarea este faptul că este complicat (dar cred că deja știți acest lucru); Ce este bine, este că puteți utiliza 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 acel pseudo-mic și încărcați următorul modulul ș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.