Cât de multe adrese de memorie poate RAM în computerul meu țineți?
Într-o zi este distractiv să te uiți la nivelul suprafeței experienței de calcul, iar în alte zile este distractiv să-ți dai dreptate î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 web 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 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
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 constă 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, deci adresa primului octet este 0.
- Pentru a accesa cel de-al doilea octet, trebuie să săriți un octet, deci adresa lui este 1.
- (si asa mai departe… )
- Pentru a accesa ultimul octet, CPU sare peste 1073741823 bytes, 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 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 1, nu 9. Decimal 0 este
0000
, atunci adăugați 1 și obțineți0001
, adăugați una din nou și aveți0,010
. Ce sa întâmplat aici este ca și când ai zecimal09
adăugând una: modificați 9 la 0 și creșteți cifra următoare.Din exemplul de mai sus puteți observa 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 cauzează 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. După cum am spus mai devreme, 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 răspunde mai multă memorie.
Deci, pe 32 de biți poț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 tău 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 în timp real, procesoarele pe 32 de biți se pot adresa la 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 virtuala, segmentarea și paginare.
Memorie virtuala
După cum a subliniat @Daniel R Hicks într-un alt răspuns, OS folosesc memoria virtuală. Ce inseamna ca aplicatiile de fapt nu functioneaza pe adrese reale de memorie, ci pe cele furnizate de sistemul de operare.
Această tehnică permite sistemului de operare să deplaseze anumite date din memoria RAM într-un așa-numit Pagefile (Windows) sau Swap (* NIX). HDD are câteva mărimi mai mici decât 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.
paginare
Ceea ce am vorbit până acum este numit schema de abordare plană.
Paging este o schemă de adresare alternativă care permite adresarea mai multor memorii pe care le-ați permis î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 exact așa procesoarele x86 moderne manipulează memoria. Ea este împărțită în 4 pagini KiB (1024 de cuvinte fiecare) și acele pagini 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, acest lucru este destul de similar cu paging-ul. A fost folosit în Intel 8086, pentru a numi doar 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 segmentele de implementare 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 asta;) Ce este bine, este că poț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 acel pseudo-mic și încărcați următorul modulul și așa mai departe. Practic, ceea ce obțineți în acest fel 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.