Questo è il mio primo anno che programmo in quanto sono in 3 all'ITIS e non sono così esperto..
Nonostante ciò mi è sorta una curiosità:
Quando dichiaro una variabile mi rifesco a una zona della memoria RAM sul PC. La mia curiosità sarebbe se è possibile vedere dove e precisamente posizionata nella memoria RAM. È possibile?
La risposta e' ovviamente:
si e' possibile.
Ma che cosa voglia dire questo
e' possibile dipende da quanto in dettaglio si vuole andare.
Se si intende
all'interno del processo corrente, il modo e' quello di utilizzare l'operatore
addressof che alcuni linguaggi di programmazione mettono a disposizione, come, appunto, l'operatore
& del C/C++.
In C# esiste l'operatore
& ma per usarlo devi usare anche
fixed ed indicare che il codice e'
unsafe.
In assembler usi esplicitamente l'indirizzo (virtuale) della locazione di memoria.
Altri linguaggi, invece, quelli basati su Garbage Collector, nascondono completamente l'indirizzo di memoria. Questo perche' questo indirizzo puo' cambiare al runtime, senza che il programma se ne debba accorgere.
Ma questo operatore fornisce solo l'indirizzo della locazione di memoria
all'interno del processo corrente, appunto.
#include <stdio.h>
int main()
{
int x;
printf("%08Xld\n", &x);
getchar();
return 0;
}
Se lanci due volte lo stesso processo, otterrai sempre lo stesso indirizzo, il che, ovviamente, non ha senso!
Per arrivare al vero
indirizzo fisico, e' necessario entrare a livello di Sistema Operativo.
E' infatti responsbilita' del SO quello di assegnare la memoria ai singoli processi, secondo uno schema denominato
memoria virtuale.
Piu' specificatamente, la memoria assegnata ai vari processi e' responsabilita' del
Memory Manager il quale ha il compito di gestire la memoria virtuale assegnata ai vari processi e mapparla nella memoria fisica (quella rappresentata dai banchi di memoria montati fisicamente).
La
memoria virtuale di ogni processo viene suddivisa in
segmenti, ogni segmento in
pagine.
Il MM ha il compito di tenere traccia delle
pagine in uso da parte di ogni processo, e della loro posizione all'interno della
memoria fisica.
Una volta che conosci l'indirizzo virtuale di una variabile, entrando a livello di SO puoi risalire a quale pagina di quale segmento fa riferimento, e da questo alla posizione della pagina nella memoria fisica.
Banale
@ultrasound [1]:
non ho mai visto nessuno disturbarsi a leggere un vettore saltando ad intervalli regolari gli indirizzi.
E' normale pratica quando si utilizzano i
tensori, vettori N dimensionali.
E si, vengono allocati in un'unica area di memoria contigua perche' in questo modo si possono implemetare le operazioni vettoriali in modo estremamemnte efficiente.
Se il vettore a N dimensioni fosse implementato come
vettore di vettori di vettori di ... di float/double, si perderebbe il 90% dlle performance.
@ultrasound[2]:
Si vero, file paging.
A casa mia comunque non si usa più.
Questo perche' ragioni ancora in termini di PC per uso casereccio (mail, skype o navigare in Internet).
Gia' quando inizi ad utilizzare applicazioni piu' complesse, come Photoshop, software per la modellazione 3D, ti accorgi della necessita' di avere un'adeguata disponibilita' di memoria virtuale.
Io non uso il PC per giocare, ma da quanto so, i giochi piu' moderni richiedono abbondanti quantita' di memoria, superiori, mediamente, alla quantita' di memoria fisica disponibile.
Per non parlare, ovviamente, dei
server (Web Server, Mai Server, ...) che non possono permettersi di andare in crash perche' non c'e' piu' memoria fisica! Ma non e' un problema se rallentano.