Corso di Sistemi Operativi

Funzioni di un SO: gestione della memoria principale (II)

 

Nella scorsa puntata abbiamo accennato al metodo della memoria virtuale: l’idea 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 dell’esecuzione all’altra, 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 un’operazione 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 l’esecuzione 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 un’unità 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 d’ingresso (l’indirizzo virtuale) e dà in uscita un valore (l’indirizzo 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 l’indirizzo fisico corrispondente all’indirizzo 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 è un’operazione che ricorre ad ogni accesso in memoria, quindi, proprio per l’elevata 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 un’altra.

 

Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet