Noen ganger er det gøy å se på overflatenivået til dataopplevelsen, og andre dager er det morsomt å dykke rett inn i det indre arbeidet. I dag ser vi på strukturen til dataminnet og hvor mye ting du kan pakke i en pinne med RAM.
Dagens spørsmål og svar-økt kommer til oss med tillatelse fra SuperUser - en underavdeling av Stack Exchange, en samfunnsdrevet gruppe av spørsmål og svar-nettsteder.
Spørsmålet
SuperUser-leser Johan Smohan sliter med hvordan prosessortype og minnestørrelse fungerer sammen for å gi et totalt antall adresser. Han skriver:
Hvor mange minneadresser kan vi få med en 32-biters prosessor og 1 GB RAM og hvor mange med en 64-biters prosessor?
Jeg tror det er noe sånt som dette:
1 GB ram delt på enten 32 bits 4 bits (?) For å få antall minneadresser?
Jeg leste på Wikipedia at 1 minneadresser er 32 bits brede eller 4 oktetter (1 oktett = 8 bits), sammenlignet med en 64-biters prosessor der 1 minnesadresser eller 1 heltall er 64 bits bred eller 8 oktetter. Men vet ikke om jeg forsto det riktig heller.
Dette er slags spørsmål som kan holde en nysgjerrig nerd oppe om natten. Hvor mange adresser er tilgjengelige under hvert av Johans hypotetiske systemer?
Svaret
SuperUser-bidragsyter Gronostaj gir litt innsikt i hvordan RAM deles og brukes:
Kort svar: Antall tilgjengelige adresser er lik den minste av dem:
- Minnestørrelse i byte
- Største usignerte heltall som kan lagres i CPUs maskinord
Langt svar og forklaring på ovenstående:
Minne består av byte (B). Hver byte består av 8 biter (b).
1 B = 8 b1 GB RAM er faktisk 1 GiB (gibibyte, ikke gigabyte). Forskjellen er:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1037741824 BHver minnebyte har sin egen adresse, uansett hvor stort CPU-maskinordet er. F.eks. Intel 8086 CPU var 16-bit, og den adresserte minne byte, det gjør også moderne 32-biters og 64-biters CPUer. Det er årsaken til den første grensen - du kan ikke ha flere adresser enn minnebytes.
Minneadresse er bare et antall byte CPUen må hoppe fra fra begynnelsen av minnet for å komme til den den leter etter.
- For å få tilgang til den første byten, må den hoppe over 0 byte, så den første bytes adresse er 0.
- For å få tilgang til den andre byten må den hoppe over 1 byte, så adressen er 1.
- (og så videre…)
- For å få tilgang til den siste byten hopper CPU over 1073741823 byte, så adressen er 1073741823.
Nå må du vite hva 32-bit faktisk betyr. Som jeg nevnte tidligere, er det størrelsen på et maskinord.
Maskinord er mengden minne CPU bruker til å holde tall (i RAM, cache eller interne registre). 32-biters CPU bruker 32 bits (4 byte) til å holde tall. Minneadresser er også tall, så på en 32-biters CPU består minneadressen av 32 bits.
Tenk nå på dette: Hvis du har en bit, kan du lagre to verdier på den: 0 eller 1. Legg til en bit til, og du har fire verdier: 0, 1, 2, 3. På tre bits kan du lagre åtte verdier : 0, 1, 2… 6, 7. Dette er faktisk et binært system og det fungerer slik:
Binær desimal 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 1111Det fungerer akkurat som vanlig tillegg, men maksimalt siffer er 1, ikke 9. Desimal 0 er
0000, så legger du til 1 og får0001, legg til en igjen, og du har0010. Det som skjedde her er som å ha desimal09og legge til en: du endrer 9 til 0 og øker neste siffer.Fra eksemplet ovenfor kan du se at det alltid er en maksimumsverdi du kan beholde i et tall med konstant antall biter - for når alle biter er 1 og du prøver å øke verdien med 1, blir alle biter 0, og bryter dermed Nummer. Det kalles heltalloverløp og forårsaker mange ubehagelige problemer, både for brukere og utviklere.
11111111 = 255 + 1 ----------- 100000000 = 0 (9 bits her, så 1 er trimmet)
- For 1 bit er den største verdien 1,
- 2 biter - 3,
- 3 biter - 7,
- 4 biter - 15
Det største mulige tallet er alltid 2 ^ N-1, hvor N er antall bits. Som jeg sa tidligere, er en minneadresse et tall, og det har også en maksimal verdi. Derfor er maskinordstørrelsen også en grense for antall tilgjengelige minneadresser - noen ganger kan ikke CPU-en din bare behandle tall som er store nok til å adressere mer minne.
Så på 32 biter kan du holde tall fra 0 til 2 ^ 32-1, og det er 4 294 967 295. Det er mer enn den største adressen i 1 GB RAM, så i ditt spesielle tilfelle vil RAM være den begrensende faktoren.
RAM-grensen for 32-biters CPU er teoretisk 4 GB (2 ^ 32) og for 64-biters CPU er det 16 EB (exabyte, 1 EB = 2 ^ 30 GB). Med andre ord kan 64-biters CPU adressere hele Internett ... 200 ganger;) (estimert av WolframAlpha ).
Imidlertid kan 32-biters CPUer i virkelige operativsystemer adressere omtrent 3 GiB RAM. Det er på grunn av operativsystemets interne arkitektur - noen adresser er reservert for andre formål. Du kan lese mer om denne såkalte 3 GB barrier on Wikipedia . Du kan heve denne grensen med Utvidelse av fysisk adresse .
Når jeg snakker om minneadressering, er det få ting jeg bør nevne: virtuell hukommelse , segmentering og personsøk .
Virtuell hukommelse
Som @Daniel R Hicks påpekte i et annet svar, bruker operativsystemer virtuelt minne. Hva det betyr er at applikasjoner faktisk ikke fungerer på ekte minneadresser, men de som leveres av OS.
Denne teknikken lar operativsystemet flytte data fra RAM til en såkalt Pagefile (Windows) eller Swap (* NIX). HDD er få størrelser langsommere enn RAM, men det er ikke et alvorlig problem for data som sjelden er tilgjengelig, og det gir OS mulighet til å gi applikasjoner mer RAM enn du faktisk har installert.
Personsøk
Det vi snakket om så langt kalles flat adresseringsordning.
Personsøk er et alternativt adresseringsskjema som gjør det mulig å adressere mer minne som du normalt kan med ett maskinord i flat modell.
Se for deg en bok fylt med ord på 4 bokstaver. La oss si det er 1024 tall på hver side. For å adressere et nummer, må du vite to ting:
- Antall sider som ordet skrives ut på.
- Hvilket ord på den siden er det du leter etter.
Nå er det akkurat slik moderne x86-prosessorer håndterer minne. Den er delt inn i 4 KiB-sider (1024 maskinord hver), og disse sidene har tall. (faktisk kan sidene også være 4 MiB store eller 2 MiB med PAE ). Når du vil adressere minnecelle, trenger du sidenummer og adresse på den siden. Merk at hver minnecelle er referert av nøyaktig ett tallpar, som ikke vil være tilfelle for segmentering.
Segmentering
Vel, denne er ganske lik personsøker. Den ble brukt i Intel 8086, bare for å nevne et eksempel. Grupper av adresser kalles nå minnesegmenter, ikke sider. Forskjellen er at segmenter kan overlappe hverandre, og de overlapper mye. For eksempel på 8086 var de fleste minnecellene tilgjengelige fra 4096 forskjellige segmenter.
Et eksempel:
La oss si at vi har 8 byte minne, alle holder nuller bortsett fra 4. byte som er lik 255.
Illustrasjon for flat minnemodell:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----Illustrasjon for sideminne med 4-byte sider:
SIDE0 _____ | 0 | | 0 | | 0 | SIDE 1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----Illustrasjon for segmentert minne med 4-bytesegmenter forskjøvet med 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 | ----- ----- ----- -----Som du kan se, kan fjerde byte adresseres på fire måter: (adressering fra 0)
- Segment 0, forskyvning 3
- Segment 1, forskyvning 2
- Segment 2, forskyvning 1
- Segment 3, forskyvning 0
Det er alltid den samme minnecellen.
I virkelige implementeringer er segmentene forskjøvet med mer enn 1 byte (for 8086 var det 16 byte).
Det som er ille ved segmentering er at det er komplisert (men jeg tror du allerede vet det;) Det som er bra, er at du kan bruke noen smarte teknikker for å lage modulære programmer.
For eksempel kan du laste inn en modul i et segment, og late som om segmentet er mindre enn det egentlig er (akkurat lite nok til å holde modulen), og deretter velge det første segmentet som ikke overlapper den pseudo-mindre og laste neste modul, og så videre. I utgangspunktet er det du får på denne måten sider med variabel størrelse.
Har du noe å legge til forklaringen? Hør av i kommentarene. Vil du lese flere svar fra andre teknologikyndige Stack Exchange-brukere? Sjekk ut hele diskusjonstråden her .