Made by Gianluca Mattiuzzi
Principio di funzionamento della memoria
virtuale
Un problema che ha sempre afflitto qualsiasi
utente e programmatore della "notte dei tempi" è stata la quantità di memoria
fisica.
Era molto frequente infatti che un programma fosse troppo grande per essere caricato
in RAM e quindi, la soluzione generalmente adottata, era quella di dividerlo in
parti più piccole dette overlay. L'esecuzione iniziava
dunque dall'overlay 0 per poi proseguire con i successivi fino al termine dell'esecuzione.
Gli overlay venivano continuamente caricati e scaricati dalla memoria. Inutile
dire che l'onere della suddivisione del programma fosse a completo carico dello
sviluppatore, il quale non trovava ne creativa ne appagante questa operazione,
peraltro dispendiosa in termini di tempo.
Nel 1961 Fotheringham pensò di automatizzare il processo e delegare l'intero lavoro
al personal computer.
L'idea di base è che la terna "codice compilato-dati-stack",
che sono gli elementi che servono per far girare un programma, possa eccedere
alla dimensione della memoria fisica (RAM) o che comunque possa eccedere allo
spazio riservatogli. Spetta allora al Sistema Operativo il compito di tenere in
RAM le parti di programma in uso e mantenere su disco le parti temporaneamente
inutilizzate. Tale situazione porta dunque ad un inevitabile
e continuo scambio (SWAP) di dati tra memoria di massa (Disco rigido) e memoria
fisica (RAM). La tecnica di swapping funziona anche in sistemi multiprogrammati,
come ad esempio Windows o Linux, nei quali vengono tenuti
in memoria fisica mozziconi di programma in uso e in memoria di massa le parti
momentaneamente inutilizzate.
Funzionamento di swap file e paginazione
Diventa ora chiaro che un sistema operativo che utilizzi memoria
virtuale deve provvedere ad organizzare i dati in memoria di massa e memoria fisica
al fine di caricare e far girare un programma che ecceda dalla pura memoria Hardware
disponibile (RAM). Il più comune sistema di organizzazione dei dati è la paginazione.
Sostanzialmente non si fa altro che suddividere logicamente la memoria RAM e la
memoria di massa in pagine di grandezza fissa e affidare ad una unità di gestione
di memoria (MMU) il compito di maneggiare le pagine. Le pagine in memoria di massa
(Disco) verranno memorizzare nello swap file, un particolare
file il cui formato dipende dal sistema operativo. La MMU è una unità implementata
nel sistema operativo che ridefinisce la politica di
gestione della memoria. Infatti ogni richiesta di accesso che fa un programma
alla memoria, deve passare per la MMU. La richiesta di accesso può generare due
comportamenti
1: la pagina che contiene l'informazione richiesta del programma
è già in RAM
In questo caso la MMU non fa altro che elaborare l'indirizzo e dirottare la richiesta
sul bus della memoria RAM.
2: la pagina non è in RAM
In questo secondo caso si verifica un fault di pagina.
È in questo momento che avviene lo scambio (swap) di pagina tra memoria fisica
(RAM) e memoria di massa (Disco). La pagina in cui è contenuta l'informazione
richiesta dal programma verrà trasferita in RAM sostituendo la pagina meno utilizzata
che verrà trasferita nello swap file. È evidente che l'operazione di scambio è
dispendiosa in quanto coinvolge processore, disco rigido e RAM. Viene infatti
occupata la CPU (processore), e lavora il disco, che è senz'altro la periferica
di memorizzazione più lenta per motivi meccanici le tre principali coinvolte nel
meccanismo.
Ottimizzazione della Memoria Virtuale
Ora che sono stati forniti dei piccoli
chiarimenti sul funzionamento della memoria virtuale si può pensare a come ottimizzarla.
Le seguenti riflessioni sono per lo più indipendenti dal sistema operativo in
cui si opera, ma prenderemo in analisi il sistema operativo Windows.
|