Jednog dana zabavno je pogledati površinsku razinu računalnog iskustva, a ostale dane je zabavno probiti se u unutrašnji rad. Danas pregledavamo strukturu memorije računala i koliko stvari možete pakirati u štapić RAM-a.
Današnja pitanja i odgovori nam se javljaju zahvaljujući SuperUseru - podjele Stack Exchange-a, zajednice-driven grupiranja Q & A web stranica.
Čitač SuperUser Johan Smohan se bori s načinom rada tipa procesora i veličine memorije kako bi se dobio ukupan broj adresa. Piše:
Koliko memorijskih adresa možemo dobiti s 32-bitnim procesorom i 1GB RAM-om i koliko s 64-bitnim procesorom?
Mislim da je nešto slično ovome:
1GB RAM-a podijeljeno bilo 32 bita 4 bita (?) Da biste dobili broj memorijskih adresa?
Čitam na Wikipediji da je 1 memorijska adresa 32 bit široka ili 4 okteta (1 oktet = 8 bitova), u usporedbi s 64 bitnim procesorom gdje 1 memorijska adresa ili 1 cijeli broj iznosi 64 bita ili 8 okteta. Ali ne znam jesam li to i ispravno razumio.
To su vrste pitanja koja mogu zadržati znatiželjne geek gore noću. Koliko je adresa dostupna pod svakim Johanovim hipotetskim sustavima?
Gronostaj, koji doprinosi SuperUseru, pruža uvid u način dijeljenja i korištenja RAM-a:
Kratak odgovor: Broj dostupnih adresa jednak je manjem od onih:
- Veličina memorije u bajtovima
- Najveći nepotpisani integer koji se može spremiti u strojnoj riječi CPU-a
Dugi 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 je zapravo 1 GiB (gibibit, a ne gigabajt). Razlika je sljedeća:
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 koliko velika CPU strojna riječ. Npr. Intel 8086 CPU je bio 16-bitni i bavi se adresiranjem memorije, pa moderni 32-bitni i 64-bitni procesori. To je uzrok prvog ograničenja - ne možete imati više adresa od memorijskih bajtova.
Memorija adresa je samo broj bytes CPU mora preskočiti od početka memorije doći do onoga što traži.
- Za pristup prvom bajtu mora preskočiti 0 bajta, tako da adresa prvog bajtova je 0.
- Za pristup drugom bajtu mora preskočiti 1 bajt, stoga je adresa 1.
- (i tako dalje… )
- Za pristup zadnjem bajtu, CPU prelazi 1073741823 bajtova, pa je adresa 1073741823.
Sada morate znati što 32-bitni zapravo znači. Kao što sam već spomenula, to je veličina strojne riječi.
Strojna riječ je količina memorije koju CPU koristi za držanje brojeva (u RAM-u, predmemoriji ili unutarnjim registrima). 32-bitni CPU koristi 32 bita (4 bajta) za držanje brojeva. Memorijske adrese su i brojevi, pa na 32-bitnom procesoru memorijska adresa sadrži 32 bita.
Sada razmislite o ovom: ako imate jedan bit, možete spremiti dvije vrijednosti na njega: 0 ili 1. Dodaj još jedan 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 tako funkcionira:
Binarni decimalni 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
Djeluje točno kao i obično dodavanje, ali maksimalna znamenka je 1, a ne 9. Desetina je 0
0000
, onda dodajete 1 i dobijete0001
, dodajte još jednom i imate0010
, Ono što se ovdje događa je s decimalnim brojem09
i dodavanje jednog: promijenite 9 do 0 i povećajte sljedeću znamenku.Iz gornjeg primjera možete vidjeti da uvijek postoji maksimalna vrijednost koju možete zadržati u broju sa stalnim brojem bitova - jer kada su svi bitovi 1 i pokušate povećati vrijednost za 1, svi bitovi će postati 0, čime će se slomiti broj. Zove se cijeli preljev i uzrokuje mnoge neugodne probleme, kako za korisnike tako i za programere.
11111111 = 255 + 1 ----------- 100000000 = 0 (ovdje je 9 bita pa je obrisan)
- 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, memorijska adresa je broj i također ima maksimalnu vrijednost. Zato je veličina strojne riječi također ograničenje broja dostupnih memorijskih adresa - ponekad vaš CPU ne može jednostavno obrađivati brojeve dovoljno velik da bi se obraćao više memorije.
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 u vašem konkretnom slučaju količina RAM-a će biti ograničavajući faktor.
RAM ograničenje za 32-bitni CPU je teoretski 4 GB (2 ^ 32) i za 64-bitni procesor je 16 EB (exabajt, 1 EB = 2 ^ 30 GB). Drugim riječima, 64-bitni CPU mogao bi adresirati cijeli Internet ... 200 puta;) (procjenjuje WolframAlpha).
Međutim, u stvarnom životu operativni sustavi 32-bitni procesori mogu adresirati oko 3 GiB od RAM-a. To je zbog unutarnje arhitekture operacijskog sustava - neke su adrese rezervirane u druge svrhe. Više o ovoj tzv. Barijeri od 3 GB možete pročitati na Wikipediji. Ograničenje možete podići s proširenjem fizičke adrese.
Govoreći o adresiranju memorije, postoji nekoliko stvari koje bih trebao spomenuti:virtualna memorija, segmentacijaiprijelom.
Virtualna memorija
Kao što je @Daniel R Hicks istaknuo u drugom odgovoru, OSes koristi virtualnu memoriju. Što znači da aplikacije zapravo ne funkcioniraju na stvarnim memorijskim adresama, već onima koje pruža OS.
Ova tehnika omogućava operacijskom sustavu da premjestiti neke podatke iz RAM-a na tzv. Pagefile (Windows) ili Swap (* NIX).Tvrdi disk je nekoliko veličina sporiji od RAM-a, ali to nije ozbiljan problem za rijetke podatke koji se mogu pristupiti i omogućuje OS-u da aplikacijama pruža više RAM-a nego što ste zapravo instalirali.
prijelom
Ono o čemu smo govorili do sada naziva se shema ravnog adresiranja.
Paging je alternativna shema adresiranja koja omogućuje adresiranje više memorije koju inače možete imati s jednim strojnim riječima u ravnom modelu.
Zamislite knjigu napunjenu 4 slova. Pretpostavimo da na svakoj stranici postoji 1024 brojeva. Da biste odgovorili na broj, morate znati dvije stvari:
- Broj stranice na kojoj se ta riječ tiska.
- Koja je riječ na toj stranici koju tražite?
Sada je upravo to kako moderni procesori x86 obrađuju memoriju. Podijeljen je na 4 kilo stranice (svaka 1024 strojnih riječi), a te stranice imaju brojeve. (zapravo stranice mogu biti 4 MiB velika ili 2 MiB s PAE). Kada želite pristupiti memorijskoj ćeliji, na toj stranici trebate broj stranice i adresu. Imajte na umu da se svaka memorijska ćelija poziva na točno jedan par brojeva, što neće biti slučaj za segmentaciju.
Segmentacija
Pa, ovo je sasvim slično pagingu. Koristio se u Intel 8086, samo da spomenemo jedan primjer. Grupe adresa sada se nazivaju segmentima memorije, a ne stranicama. Razlika je da se segmenti mogu preklapati i oni se mnogo preklapaju. Na primjer, na 8086 najveći broj memorijskih ćelija dostupan je iz 4096 različitih segmenata.
Primjer:
Recimo da imamo 8 bajta memorije, svi koji drže nula, osim četvrtog byte koji je jednak 255.
Ilustracija za model ravne memorije:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Ilustracija za pamćenu memoriju s 4 bajtnim stranicama:
PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
Ilustracija za segmentiranu memoriju s 4 bajtnim segmentima pomaknut 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 vidite, 4. bajt se može riješiti 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 stanica memorije.
U implementaciji u stvarnom životu segmenti su pomaknuti za više od 1 bajta (za 8086 to je 16 bajta).
Što je loše u segmentaciji je to što je komplicirano (ali mislim da to već znate;) Što je dobro, to je da možete koristiti neke pametne tehnike za stvaranje modularnih programa.
Na primjer, možete učitati neki modul u segment, a zatim pretvarati da je segment manji nego što je to stvarno (samo dovoljno mali da zadrži modul), a zatim odaberite prvi segment koji se ne preklapa s onim pseudo-manjim i učitavanje sljedeće modul i tako dalje. U osnovi, ono što dobivate na taj način su stranice veličine promjenjive veličine.
Imate li nešto za objašnjenje? Zvuči u komentarima. Želite li pročitati više odgovora od drugih tehnoloških korisnika Stack Exchangea? Pogledajte ovdje cijelu raspravu.