La memoria RAM

Dal momento che stiamo per affrontare i puntatori, è meglio prima capire come funziona la memoria RAM.

Sappiamo che in informatica l'unità di misura dell'informazione è il bit.
Un bit può assumere solo due valori, 0 e 1.

I componenti di un computer comprendono solo questo linguaggio.
Ad esempio la memoria RAM è composta da tanti piccoli componenti che possono assumere solo due stati, spento e acceso.

La memoria ram è divisa in locazioni di memoria, ognuna delle quali è composta da 8 di questi piccoli componenti.
Immaginiamoli come minuscole lampadine che, quando fanno passare la corrente sono accese, mentre quando non la fanno passare sono spente.

Immaginiamo che in una di queste locazioni sia memorizzato il numero 93.
Potendo assumere solo due stati, queste "lampadine" devono per forza utilizzare il codice binario per memorizzare i dati.
In codice binario il numero 93 si scrive 1011101, dove ogni cifra del numero binario è rappresentata da una di queste lampadine.
Abbiamo detto che le lampadine sono 8 in ogni locazione, mentre il nostro numero binario è composto da sole 7 cifre. Perciò l'ottava rimane spenta, e per vedere rappresentate tutte le 8 lampadine aggiungiamo una cifra: 01011101.

Da un punto di vista fisico significa che quella particolare locazione di memoria ha le sue lampadine rispettivamente: spenta - accesa - spenta - accesa - accesa - accesa - spenta - accesa.

Quando la CPU andrà a pescare il dato in memoria ad esempio per addizionarlo ad un altro numero, leggerà lo stato di quelle lampadine una dopo l'altra, sposterà quel dato in uno dei suoi registri locali, memorizzandolo sempre in binario, e così via.
Ogni cosa in un computer è espressa in forma binaria, e cioé con una successione di segnali di corrente elettrica, spenta e accesa, in base al dato che si vuole rappresentare.

Perciò abbiamo capito che la memoria RAM è formata da tante locazioni di memoria, di 8 bit ciascuna, una successiva all'altra.
Tuttavia non tutti i dati riescono ad entrare in una sola locazione. Ad esempio un dato di tipo char sta benissimo in 8 bit, mentre un dato di tipo int può essere troppo grande, e addirittura occupare 32 bit. Un tipo long occuperà 64 bit, mentre i tipi composti (le strutture) e gli oggetti possono arrivare ad occupare anche molto di più.

Come fa la CPU a capire in quale locazione è memorizzato un dato?
Semplice, ogni locazione è contraddistinta da un codice binario detto indirizzo di memoria, e grazie a dei bus di indirizzo la CPU riesce a selezionare quella particolare locazione di memoria.

Ad esempio un'istruzione in codice macchina potrebbe essere qualcosa come: salva il numero 93 nella locazione di memoria 001010011 01101011 11010100 00010111

La CPU, grazie al codice identificativo in binario della locazione di memoria, riesce ad accedervi fisicamente e a modificarne il contenuto modificando lo stato di quelle lampadine.

Gli indirizzi di memoria sono incrementali, ad esempio in un sistema a 8 bit, si va dalla locazione 00000000 alla locazione 11111111.
Un sistema del genere potrebbe gestire al massimo 255 locazioni di memoria, e considerando che ogni locazione ha una capacità di 8 bit, avremo una memoria massima di 2040 bit, cioé di 2 MB.
Gli hardware a 32 bit riescono a gestire sino a 3 GB di memoria, mentre le attuali architetture a 64 bit vanno addirittura oltre.
Naturalmente più alto è il numero di locazioni di memoria gestibili, più grande sarà il numero in binario utilizzato per indicare i vari indirizzi di memoria.
Per questo solitamente per scrivere gli indirizzi di memoria si utilizza la notazione esadecimale, altrimenti risulterebbero troppo lunghi da scrivere ogni volta.

Ok, abbiamo capito che la memoria RAM è suddivisa in locazioni di memoria, ciascuna di 8 bit, e che ogni locazione di memoria è contraddistinta da un indirizzo di memoria univoco.

Ma se un dato è troppo grande ed occupa ad esempio ben 4 locazioni (32 bit di memoria), come fa il programma in esecuzione a capire che non deve fermarsi a leggere solo la prima locazione ma che deve continuare per 4 locazioni?

Ad esempio, se abbiamo un programma che deve accedere alla memoria per recuperare un numero molto grande, scriveremo qualcosa come:

cout << varLong;

Il programma traduce la variabile varLong nella rispettiva locazione di memoria, ipotizziamo che sia 10100111.
Infatti ogni variabile, al momento della dichiarazione, viene collegata ad un indirizzo di memoria, e ogni volta che useremo la variabile in realtà staremo utilizzando quella locazione di memoria. La variabile serve solo al programmatore come nominativo facile da ricordare, per non dover tenere a mente un indirizzo di memoria in forma numerica.

Quindi l'istruzione precedente, tradotta in codice macchina sarà qualcosa di simile:

vai alla locazione 10100111 e recupera il dato memorizzato in essa

Ma la nostra variabile è di tipo long, quindi il dato memorizzato occupa 64 bit, e cioé ben 8 locazioni di memoria!

Come fa il programma a capire di dover leggere non solo il contenuto della locazione 10100111, ma di dover continuare per altre sette locazioni, e poi fermarsi?

Semplice, glielo diciamo noi durante la dichiarazione della variabile:

long varLong;

Facendo precedere la variabile dalla parola long, diciamo al programma di allocare un'area di memoria di 64 bit a partire dalla locazione 10100111 (ovviamente la locazione viene decisa automaticamente al momento dell'esecuzione del programma).

Quindi ogni volta che utilizzeremo la variabile varLong, non ci limiteremo a dire "leggi il contenuto della locazione 10100111", ma diremo qualcosa come "leggi l'area di memoria di 64 bit a partire dalla locazione 10100111".

In questo modo il processore va alla locazione 10100111, legge il contenuto, va avanti alla locazione successiva 10101000, legge il contenuto e lo mette insieme a quello precedente, e così via per 8 locazioni (64 bit), sino ad aver letto tutto il dato originale, che sarà trattato come un'unica entità.

Se avessimo dichiarato una variabile int invece di long, la memoria allocata a partire dalla locazione 10100111 sarebbe stata di 32 bit invece di 64 bit.

E' importante capire bene questo meccanismo prima di procedere, dovete avere ben chiaro cos'è una locazione di memoria, cos'è un indirizzo di memoria, cosa si intende per allocazione di un'area di memoria, come fa il programma a capire dov'è situata fisicamente nella RAM quest'area di memoria, e come fa a capire quanto è grande.

Nessun commento:

Posta un commento