# Indirizzo di memoria

In informatica, un indirizzo di memoria è un identificatore univoco di una certa locazione di memoria alla quale il processore o un'altra periferica possono accedere per operazioni di lettura o scrittura, ad esempio salvare un dato per poterlo recuperare in seguito (nell'architettura di un processore basato su registri il registro MAR (memory address register) è dedicato all'indirizzo di memoria cui il processore punta per accedere alla rispettiva cella di memoria).

## Descrizione

Nell'indirizzamento a byte ogni indirizzo identifica un singolo byte di memoria. Dati troppo grandi per essere contenuti in un singolo byte possono risiedere in più byte occupando una sequenza di indirizzi consecutivi. Alcuni processori furono costruiti per gestire l'indirizzamento a word, così da rendere la più piccola unità di spazio allocabile una word anziché un byte. Un esempio fu il Texas Instruments TMS9900 e il National Semiconductor IMP-16, entrambi i quali utilizzavano word di 16 bit.
Sia la memoria virtuale che la memoria fisica usano l'indirizzamento di memoria. Una delle differenze riguardanti l'indirizzamento di memoria tra memoria virtuale e memoria fisica è il fatto che non necessariamente i due modi di gestire gli indirizzi siano uguali: ad esempio la memoria virtuale potrebbe contenere il doppio di indirizzi della memoria fisica. Per queste ragioni qualora vi sia scambio di dati tra le due memorie è necessaria una conversione degli indirizzi.
Per facilitare il fluire dei dati contenuti nelle memorie, il sistema operativo solitamente divide la memoria in pagine, ognuna delle quali contiene un numero predefinito di indirizzi di memoria.
La conversione degli indirizzi non è dipendente dal software, e permette ai programmi in esecuzione di operare in uguale maniera sia che i dati siano contenuti nella memoria fisica, sia che i dati risiedano nella memoria virtuale, lasciando al sistema operativo la libertà di allocare e riallocare la memoria quando necessario per gestire efficacemente le memorie.
Poiché le dimensioni della memoria virtuale possono essere decisamente maggiori della quantità di memoria fisica (RAM) disponibile nel sistema, il sistema operativo può utilizzare un file di paging e/o un file di swap per spostare temporaneamente alcune pagine di memoria alla memoria secondaria (disco rigido) quando esse non siano utilizzate o quando il processo che ne usufruisce è in uno stato di inattività.
Molto spesso, quando si fa riferimento alla dimensione della word di un computer moderno, si definisce allo stesso tempo la dimensione degli indirizzi di memoria virtuale su quel computer. Ad esempio, un processore a 32 bit solitamente tratta gli indirizzi di memoria come numeri integer codificati su 32 bit.
Un indirizzamento a 32 bit permette al computer di indirizzare $2^{32}=4.294.967.296$ byte di memoria (o 4 gibibyte).
Tuttavia, i computer più datati spesso supportavano indirizzi di memoria codificati su un numero di bit maggiore rispetto alla dimensione della word, altrimenti la capacità di memoria sarebbe stata drasticamente ridotta. Per esempio il 6502 a 8 bit supportava indirizzi a 16 bit, il processore Intel 8086 a 16 bit gestiva indirizzi a 20 bit permettendo così di avere accesso a 1 mebibyte piuttosto che 64 kibibyte.
Un computer il cui indirizzamento è a 64 bit può gestire $2^{64}$ byte (o 16 exbibyte), una dimensione che viene considerata praticamente illimitata.
A seconda dell'architettura sottostante, la performance di un computer può essere peggiorata da un accesso alla memoria non simmetrico. Per esemplificare, un computer a 16 bit con un bus di memoria a 16 bit come un Intel 8086, generalmente lavora in maniera più efficace se il dato inizia su un indirizzo pari: in questo modo prelevare un valore di 16 bit richiede un singolo accesso alla memoria. Nel caso contrario, se il dato iniziasse su un indirizzo dispari, il processore può avere la necessità di effettuare l'accesso alla memoria due volte con un dispendio di tempo ulteriore.