Nella scorsa puntata abbiamo accennato al metodo della memoria
virtuale: lidea di base della memoria virtuale è che
la dimensione combinata di testo, dati e stack dei processi può
eccedere la quantità di memoria disponibile per essi.
Abbiamo anche notato che, ad un determinato istante, i processi
non riferiscono tutto il loro spazio di indirizzamento, ma solo
una sua parte: per indicare questa proprietà si utilizza il concetto
di località.
Poiché un processo indirizza celle di memoria contigue in una piccola
porzione dello spazio di indirizzamento totale si parla di località
spaziale (un caso che possiamo immaginare è quello in cui un
processo sta scorrendo in sequenza gli elementi di un array).
Poiché una stessa cella di memoria può essere riferita frequentemente
per un certo intervallo di tempo, si parla di località temporale
(ad es. una cella di memoria viene prima letta e poi scritta).
Il SO può allora mantenere in memoria le parti che sono in uso
in un certo momento, mentre le altre parti vengono mantenute nello
swap device.
Tuttavia occorre notare che il processo cambia località quando passa
da una fase dellesecuzione allaltra, cosicché è necessario
cambiare le sue parti in memoria quando deve accedere a nuovi indirizzi.
La memoria virtuale si sposa molto bene con la multiprogrammazione:
mentre un programma aspetta che una sua porzione venga caricata
in memoria, è di fatto in attesa di unoperazione di I/O e
non può girare, cosicché il processore può essere assegnato ad un
altro processo.
Naturalmente in un sistema di questo tipo, gli indirizzi generati
dai programmi non possono riferirsi direttamente alla memoria, perché
durante lesecuzione di un processo la memoria viene dinamicamente
allocata e deallocata, per permettere di caricare e scaricare le
porzioni degli spazi di indirizzamento usate dai processi in memoria.
Per questo motivo gli indirizzi generati dai programmi vengono detti
indirizzi virtuali e formano lo spazio di indirizzamento
virtuale.
Gli indirizzi virtuali, anziché essere inviati direttamente alla
memoria - come succede nei sistemi che non hanno la memoria virtuale
-, vengono inviati ad ununità hardware, detta MMU (Memory
Management Unit unità di gestione della memoria), che
trasforma gli indirizzi virtuali in indirizzi della memoria fisica.
Possiamo pensare alla MMU come ad una funzione che riceve un parametro
dingresso (lindirizzo virtuale) e dà in uscita un valore
(lindirizzo fisico).
Lo spazio di indirizzamento virtuale viene suddiviso in unità chiamate
pagine e le corrispondenti unità nella memoria fisica vengono
dette pagine fisiche.
Pagine e pagine fisiche hanno la stessa dimensione e i trasferimenti
da e verso il disco vengono effettuati sempre in unità di una pagina.
Quando la MMU riceve un indirizzo virtuale, essa calcola il numero
della pagina alla quale appartiene: se essa è presente in memoria,
la MMU estrae il corrispondente numero della pagina fisica e lindirizzo
fisico corrispondente allindirizzo virtuale; se la pagina
non è in memoria viene invocato un page fault (fallimento
di accesso alla pagina), con il quale il controllo viene passato
al SO che si occupa di recuperare al pagina dal disco.
Questo metodo di gestire la memoria pone una complessa problematica
che deve essere accuratamente esaminata e risolta da chi progetta
un SO.
Innanzitutto la scelta della dimensione delle pagine è un fattore
molto importante, perché da essa derivano le dimensioni delle strutture
dati adibite alla gestione della memoria.
Inoltre la traduzione di un indirizzo virtuale in un indirizzo fisico
è unoperazione che ricorre ad ogni accesso in memoria, quindi,
proprio per lelevata frequenza con la quale deve essere eseguita
questa operazione, è necessario che la traduzione avvenga velocemente.
Quando si verifica un page fault il SO deve scegliere una pagina
da rimuovere dalla memoria principale per far posto a quella che
deve essere caricata; occorre perciò scegliere un efficiente algoritmo
che consenta di minimizzare i page fault futuri causati dalla rimozione
di una pagina.
Questi sono solo alcuni dei problemi che un progettista di SO incontra
nel progetto del modulo di gestione della memoria, anche se spesso
è aiutato da un hardware creato per supportare efficientemente una
scelta piuttosto che unaltra.
Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet