Koliko memorijskih adresa može RAM u moje računalo držite?
Jednoga dana je zabavno gledati na površinsku razinu računalnog iskustva, a drugih dana je zabavno iskopati u unutarnji rad. Danas ćemo pogledati strukturu memorije računala i koliko stvari možete upakirati u RAM memoriju.
Današnja sesija pitanja i odgovora dolazi nam ljubaznošću SuperUser-a, podjele Stack Exchangea, grupiranja web-lokacija za pitanja i odgovore u zajednici.
Pitanje
Čitač SuperUser Johan Smohan bori se s načinom na koji tip procesora i veličina memorije rade zajedno kako bi dobili ukupan broj adresa. Piše:
Koliko memorijskih adresa možemo dobiti s 32-bitnim procesorom i 1GB ramom te s 64-bitnim procesorom?
Mislim da je to nešto ovako:
1GB ovna podijeljen s 32 bitova (4) da bi dobio broj memorijskih adresa?
Čitao sam na Wikipediji da je 1 memorijska adresa 32 bita široka ili 4 okteta (1 oktet = 8 bita), u usporedbi s 64 bitnim procesorom u kojem 1 memorijska adresa ili 1 cijeli broj je 64 bita ili 8 okteta. Ali ne znam ni jesam li ispravno shvatio.
To su vrste pitanja koja mogu zadržati znatiželjnog štrebera noću. Koliko je adresa dostupno u svakom od Johanovih hipotetskih sustava?
Odgovor
Suradnik SuperUser-a Gronostaj nudi uvid u način na koji se RAM dijeli i koristi:
Kratak odgovor: Broj dostupnih adresa jednak je manjem od tih:
- Veličina memorije u bajtovima
- Najveći nepotpisani cijeli broj koji se može spremiti u strojnu riječ procesora
Dug odgovor i objašnjenje gore navedenog:
Memorija se sastoji od bajtova (B). Svaki bajt se sastoji od 8 bita (b).
1 B = 8 b
1 GB RAM-a zapravo je 1 GB (gibibit, a ne gigabajt). Razlika je:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B
Svaki bajt memorije ima svoju adresu, bez obzira na veličinu riječi CPU stroja. Npr. CPU Intel 8086 bio je 16-bitni i bavio se memorijom po bajtovima, kao i suvremeni 32-bitni i 64-bitni procesori. To je uzrok prvog ograničenja - ne možete imati više adresa nego bajtova memorije.
Memorijska adresa je samo broj bajtova koje CPU mora preskočiti s početka memorije da bi došao do onoga što traži.
- Za pristup prvom bajtu mora preskočiti 0 bajtova, tako da je prva bajtova adresa 0.
- Za pristup drugom bajtu mora preskočiti 1 bajt, pa je njegova adresa 1.
- (i tako dalje… )
- Da biste pristupili posljednjem bajtu, CPU preskače 1073741823 bajtova, pa je njegova adresa 1073741823.
Sada morate znati što 32-bitni zapravo znači. Kao što sam već spomenuo, to je veličina strojne riječi.
Strojna riječ je količina memorije koju CPU koristi za držanje brojeva (u RAM-u, cacheu ili internim registrima). 32-bitni CPU koristi 32 bita (4 bajta) za držanje brojeva. Memorijske adrese su također brojevi, tako da se na 32-bitnom CPU-u memorijska adresa sastoji od 32 bita.
Sada razmislite o tome: ako imate jedan bit, na njemu možete spremiti dvije vrijednosti: 0 ili 1. Dodajte još jednu bit i imate četiri vrijednosti: 0, 1, 2, 3. Na tri bita možete spremiti osam vrijednosti : 0, 1, 2… 6, 7. To je zapravo binarni sustav i to radi tako:
Binarna decimalna znamenka 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
Radi točno kao uobičajeni dodatak, ali maksimalna znamenka je 1, a ne 9. Decimalna 0 je
0000
, onda dodajete 1 i dobivate0001
, dodajte još jednom i imate0010
. Ono što se ovdje dogodilo je kao s decimalom09
i dodavanje jednog: promijenite 9 na 0 i povećajte sljedeću znamenku.Iz gore navedenog primjera možete vidjeti da uvijek postoji maksimalna vrijednost koju možete zadržati u broju s konstantnim brojem bitova - jer kada su svi bitovi 1 i pokušate povećati vrijednost za 1, svi bitovi će postati 0, čime će se razbiti broj. To se naziva cjelobrojni overflow i uzrokuje mnoge neugodne probleme, kako za korisnike tako i za programere.
11111111 = 255 + 1 ----------- 100000000 = 0 (9 bita ovdje, tako da je 1 obrezano)
- Za 1 bita najveća vrijednost je 1,
- 2 bita - 3,
- 3 bita - 7,
- 4 bita - 15
Najveći mogući broj je uvijek 2 ^ N-1, gdje je N broj bitova. Kao što sam već rekao, adresa memorije je broj i također ima maksimalnu vrijednost. Zbog toga je veličina strojne riječi također ograničenje za broj dostupnih memorijskih adresa - ponekad vaš CPU jednostavno ne može obraditi dovoljno velike brojeve za adresiranje više memorije.
Dakle, na 32 bita možete držati brojeve od 0 do 2 ^ 32-1, a to je 4 294 967 295. To je više od najveće adrese u 1 GB RAM-a, tako da će u vašem slučaju količina RAM-a biti ograničavajući faktor.
RAM ograničenje za 32-bitni CPU teoretski je 4 GB (2 ^ 32), a za 64-bitni CPU 16 EB (eksabajti, 1 EB = 2 ^ 30 GB). Drugim riječima, 64-bitni CPU može se baviti cijelim internetom ... 200 puta;) (procjenjuje WolframAlpha).
Međutim, u stvarnim operacijskim sustavima 32-bitni CPU-ovi mogu adresirati oko 3 GB RAM-a. To je zbog interne arhitekture operativnog sustava - neke adrese su rezervirane za druge svrhe. Više o ovoj takozvanoj barijernoj 3 GB možete pročitati na Wikipediji. Ovo ograničenje možete podići pomoću proširenja fizičke adrese.
Govoreći o adresiranju memorije, moram spomenuti nekoliko stvari: virtualna memorija, segmentacija i prijelom.
Virtualna memorija
Kao što je @ Daniel R Hicks istaknuo u drugom odgovoru, operativni sustavi koriste virtualnu memoriju. To znači da aplikacije zapravo ne rade na stvarnim adresama memorije, već na onima koje osigurava OS.
Ova tehnika omogućuje operacijskom sustavu da premjesti neke podatke iz RAM-a u tzv. Pagefile (Windows) ili Swap (* NIX). HDD je malo veći od RAM-a, ali to nije ozbiljan problem za rijetko pristupane podatke, a OS-u omogućuje aplikacijama više RAM-a nego što ste zapravo instalirali..
prijelom
Ono o čemu smo do sada govorili zove se shema ravnog adresiranja.
Paging je alternativna shema adresiranja koja omogućuje adresiranje više memorije koju inače možete s jednom strojnom riječi u ravnom modelu.
Zamislite knjigu ispunjenu riječima od četiri slova. Recimo da na svakoj stranici ima 1024 broja. Da biste adresirali broj, morate znati dvije stvari:
- Broj stranice na kojoj se ta riječ ispisuje.
- Koja riječ na toj stranici tražite.
To je upravo način na koji moderni x86 procesori upravljaju memorijom. Podijeljena je na 4 KiB stranice (1024 strojne riječi svaka) i te stranice imaju brojeve. (zapravo stranice mogu biti 4 MiB velike ili 2 MiB s PAE). Kada se želite obratiti memorijskoj ćeliji, potreban vam je broj stranice i adresa na toj stranici. Imajte na umu da je svaka memorijska stanica referencirana točno jednim parom brojeva, što ne vrijedi za segmentaciju.
Segmentacija
Pa, ovaj je vrlo sličan straničenju. Koristio se u Intel 8086, samo da spomenemo jedan primjer. Skupine adresa sada se nazivaju segmenti memorije, a ne stranice. Razlika je u tome što se segmenti mogu preklapati i oni se mnogo preklapaju. Na primjer, na 8086 većini memorijskih stanica bilo je dostupno iz 4096 različitih segmenata.
Primjer:
Recimo da imamo 8 bajtova memorije, svi drže nule osim za 4. bajt koji je jednak 255.
Ilustracija za model s ravnom memorijom:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Ilustracija za memoriranu stranicu s 4-bajtnim stranicama:
STRANA 0 _____ | 0 | | 0 | | 0 | STRANICA 1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
Ilustracija za segmentiranu memoriju s 4-bajtnim segmentima pomaknutim 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 | ----- ----- ----- -----
Kao što možete vidjeti, četvrti bajt se može adresirati na četiri načina: (adresiranje od 0)
- Segment 0, pomak 3
- Segment 1, pomak 2
- Segment 2, pomak 1
- Segment 3, pomak 0
Uvijek je ista memorijska stanica.
U stvarnim izvedbama segmenti su pomaknuti za više od 1 bajta (za 8086 je 16 bajtova).
Ono što je loše u segmentaciji je to što je komplicirano (ali mislim da to već znate;) Ono što je dobro, je da možete koristiti neke pametne tehnike za stvaranje modularnih programa.
Na primjer, možete učitati neki modul u segment, a zatim se pretvarati da je segment manji nego što stvarno jest (dovoljno mali da drži modul), a zatim odaberite prvi segment koji se ne preklapa s tim pseudo-manjim i učitajte sljedeći modula i tako dalje. Uglavnom, ono što dobivate na ovaj način su stranice promjenjive veličine.
Imate li što dodati objašnjenju? Zvuk isključen u komentarima. Želite li pročitati više odgovora od drugih tehničkih korisnika Stack Exchangea? Pogledajte cjelokupnu temu za raspravu ovdje.