Quanti indirizzi di memoria può contenere la RAM in Risorse del computer?
Un giorno è divertente guardare il livello di superficie dell'esperienza di elaborazione, e in altri giorni è divertente approfondire il funzionamento interno. Oggi diamo uno sguardo alla struttura della memoria del computer e quanta roba è possibile inserire in un rametto di RAM.
La sessione di domande e risposte di oggi ci viene fornita per gentile concessione di SuperUser, una suddivisione di Stack Exchange, un raggruppamento di siti Web di domande e risposte basato sulla comunità.
La domanda
Il lettore SuperUser Johan Smohan è alle prese con il modo in cui il tipo di processore e le dimensioni della memoria lavorano insieme per produrre un numero totale di indirizzi. Lui scrive:
Quanti indirizzi di memoria possiamo ottenere con un processore a 32 bit e una ram da 1 GB e quanti con un processore a 64 bit?
Penso che sia qualcosa del genere:
1 GB di RAM diviso per 32 bit a 4 bit (?) Per ottenere il numero di indirizzi di memoria?
Ho letto su Wikipedia che 1 indirizzo di memoria è largo 32 bit o 4 ottetti (1 ottetto = 8 bit), rispetto a un processore a 64 bit in cui 1 indirizzo di memoria o 1 intero è 64 bit di larghezza o 8 ottetti. Ma non so se ho capito bene anche io.
Questi sono i tipi di domande che possono tenere sveglio un geek curioso di notte. Quanti indirizzi sono disponibili in ciascuno dei sistemi ipotetici di Johan?
La risposta
Il collaboratore di SuperUser Gronostaj offre alcune informazioni su come la RAM è divisa e utilizzata:
Risposta breve: Il numero di indirizzi disponibili è uguale al più piccolo di quelli:
- Dimensione della memoria in byte
- Il più grande numero intero senza segno che può essere salvato nella parola macchina della CPU
Risposta lunga e spiegazione di quanto sopra:
La memoria è composta da byte (B). Ogni byte è composto da 8 bit (b).
1 B = 8 b
1 GB di RAM è in realtà 1 GiB (gibibyte, non gigabyte). La differenza è:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B
Ogni byte di memoria ha il suo indirizzo, non importa quanto sia grande la parola della CPU. Per esempio. La CPU Intel 8086 era a 16 bit e indirizzava la memoria a byte, così come le moderne CPU a 32 e 64 bit. Questa è la causa del primo limite: non è possibile avere più indirizzi dei byte di memoria.
L'indirizzo di memoria è solo un numero di byte che la CPU deve saltare dall'inizio della memoria per arrivare a quello che sta cercando.
- Per accedere al primo byte deve saltare 0 byte, quindi l'indirizzo del primo byte è 0.
- Per accedere al secondo byte deve saltare 1 byte, quindi il suo indirizzo è 1.
- (e così via… )
- Per accedere all'ultimo byte, la CPU salta 1073741823 byte, quindi il suo indirizzo è 1073741823.
Ora devi sapere cosa significa realmente 32 bit. Come ho detto prima, è la dimensione di una parola macchina.
Parola macchina è la quantità di memoria utilizzata dalla CPU per contenere i numeri (nella RAM, nella cache o nei registri interni). La CPU a 32 bit utilizza 32 bit (4 byte) per contenere i numeri. Anche gli indirizzi di memoria sono numeri, quindi su una CPU a 32 bit l'indirizzo di memoria è composto da 32 bit.
Ora pensa a questo: se hai un bit, puoi salvare due valori su di esso: 0 o 1. Aggiungi un altro bit e hai quattro valori: 0, 1, 2, 3. Su tre bit, puoi salvare otto valori : 0, 1, 2 ... 6, 7. Questo è in realtà un sistema binario e funziona così:
Decimale binario 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
Funziona esattamente come l'aggiunta normale, ma la cifra massima è 1, non 9. Decimale 0 è
0000
, quindi aggiungi 1 e ottieni0001
, aggiungilo ancora una volta e lo hai0010
. Quello che è successo qui è come avere decimale09
e aggiungendone uno: si cambia da 9 a 0 e si incrementa la cifra successiva.Dall'esempio sopra puoi vedere che c'è sempre un valore massimo che puoi tenere in un numero con numero costante di bit - perché quando tutti i bit sono 1 e provi ad aumentare il valore di 1, tutti i bit diventeranno 0, rompendo così il valore numero. Si chiama overflow intero e causa molti spiacevoli problemi, sia per gli utenti che per gli sviluppatori.
11111111 = 255 + 1 ----------- 100000000 = 0 (9 bit qui, quindi 1 è tagliato)
- Per 1 bit il valore massimo è 1,
- 2 bit - 3,
- 3 bit - 7,
- 4 bit - 15
Il numero più grande possibile è sempre 2 ^ N-1, dove N è il numero di bit. Come ho detto prima, un indirizzo di memoria è un numero e ha anche un valore massimo. Ecco perché la dimensione della parola macchina è anche un limite per il numero di indirizzi di memoria disponibili - a volte la tua CPU non è in grado di elaborare numeri abbastanza grandi da indirizzare più memoria.
Quindi su 32 bit puoi mantenere i numeri da 0 a 2 ^ 32-1, e questo è 4 294 967 295. È più che il più grande indirizzo in 1 GB di RAM, quindi nel tuo caso specifico la quantità di RAM sarà il fattore limitante.
Il limite di RAM per CPU a 32 bit è teoricamente 4 GB (2 ^ 32) e per CPU a 64 bit è 16 EB (exabyte, 1 EB = 2 ^ 30 GB). In altre parole, la CPU a 64 bit potrebbe indirizzare l'intera Internet ... 200 volte;) (stimato da Wolfram Alfa).
Tuttavia, nei sistemi operativi reali, le CPU a 32 bit possono gestire circa 3 GB di RAM. Ciò è dovuto all'architettura interna del sistema operativo: alcuni indirizzi sono riservati per altri scopi. Puoi leggere ulteriori informazioni su questa cosiddetta barriera da 3 GB su Wikipedia. Puoi sollevare questo limite con Physical Address Extension.
Per quanto riguarda l'indirizzamento della memoria, ci sono alcune cose che dovrei menzionare: memoria virtuale, segmentazione e paging.
Memoria virtuale
Come @ Daniel R Hicks ha sottolineato in un'altra risposta, i sistemi operativi utilizzano la memoria virtuale. Ciò che significa è che le applicazioni in realtà non operano su indirizzi di memoria reali, ma su quelli forniti dal sistema operativo.
Questa tecnica consente al sistema operativo di spostare alcuni dati dalla RAM a un cosiddetto Pagefile (Windows) o Swap (* NIX). L'HDD è di poche magnitudo più lento della RAM, ma non è un problema serio per i dati a cui si accede raramente e consente al sistema operativo di fornire alle applicazioni più RAM di quelle effettivamente installate.
paging
Quello di cui stavamo parlando finora è chiamato schema di indirizzamento piatto.
Il cercapersone è uno schema di indirizzamento alternativo che consente di indirizzare più memoria che normalmente è possibile con una parola macchina in un modello piatto.
Immagina un libro pieno di parole di 4 lettere. Diciamo che ci sono 1024 numeri su ogni pagina. Per indirizzare un numero, devi sapere due cose:
- Il numero di pagina su cui viene stampata quella parola.
- Quale parola su quella pagina è quella che stai cercando.
Questo è esattamente il modo in cui le moderne CPU x86 gestiscono la memoria. È diviso in 4 pagine KiB (1024 parole macchina ciascuna) e quelle pagine hanno numeri. (in realtà le pagine possono anche essere 4 MiB grandi o 2 MiB con PAE). Quando si desidera indirizzare la cella di memoria, è necessario il numero di pagina e l'indirizzo in quella pagina. Si noti che ciascuna cella di memoria fa riferimento esattamente a una coppia di numeri, che non sarà il caso della segmentazione.
Segmentazione
Bene, questo è abbastanza simile al paging. È stato utilizzato in Intel 8086, solo per citarne un esempio. I gruppi di indirizzi sono ora chiamati segmenti di memoria, non pagine. La differenza è che i segmenti possono sovrapporsi e si sovrappongono molto. Ad esempio su 8086 la maggior parte delle celle di memoria era disponibile da 4096 segmenti diversi.
Un esempio:
Diciamo che abbiamo 8 byte di memoria, tutti con zero, tranne per il 4 ° byte che è uguale a 255.
Illustrazione per il modello di memoria piatta:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Illustrazione per memoria paginata con pagine a 4 byte:
PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
Illustrazione per memoria segmentata con segmenti a 4 byte spostati di 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 | ----- ----- ----- -----
Come puoi vedere, il 4o byte può essere indirizzato in quattro modi: (indirizzamento da 0)
- Segmento 0, offset 3
- Segmento 1, offset 2
- Segmento 2, offset 1
- Segmento 3, offset 0
È sempre la stessa cella di memoria.
Nelle implementazioni della vita reale i segmenti vengono spostati di oltre 1 byte (per 8086 erano 16 byte).
La cosa negativa della segmentazione è che è complicato (ma penso che tu lo sappia già); Ciò che è buono, è che puoi usare alcune tecniche intelligenti per creare programmi modulari.
Ad esempio, puoi caricare alcuni moduli in un segmento, quindi fingere che il segmento sia più piccolo di quello che è realmente (abbastanza piccolo da contenere il modulo), quindi scegliere il primo segmento che non si sovrappone a quello pseudo-piccolo e caricare successivamente modulo, e così via. In sostanza, ciò che ottieni in questo modo sono pagine di dimensioni variabili.
Hai qualcosa da aggiungere alla spiegazione? Sound off nei commenti. Vuoi leggere più risposte dagli altri utenti di Stack Exchange esperti di tecnologia? Controlla la discussione completa qui.