prof. Nunzio Brugaletta

atapSO

EnneBi – Computer Science
AvantiIndietroInizio




Gestione della memoria

La memoria centrale di un computer è una risorsa estremamente importante e delicata. Un programma per poter essere eseguito necessita di essere registrato in memoria centrale, la memoria inoltre è una risorsa limitata essendoci limiti fisici che non consentono di installare all'infinito memoria fisica in un computer. Si aggiunga a questo che la dimensione dei programmi cresce sempre di più, per esempio, per l'implementazione di interfacce utente sempre più sofisticate, ovvero come qualcuno afferma : “i programmi si espandono per riempire la memoria che li può contenere”. Se poi si considerano i sistemi a suddivisione di tempo, si può pensare che ci siano più utenti di quanti processi possano essere caricati in memoria contemporaneamente. La parte del kernel che si occupa della gestione della risorsa memoria centrale, si chiama memory management system.

Per poter effettivamente avere la possibilità di gestire più utenti è necessario copiare i processi in eccesso su una memoria di massa ad accesso diretto (il disco). In questo modo si crea in memoria di massa una estensione della memoria centrale, simulando l'esistenza di molta più memoria di quanta ce ne sia effettivamente installata nel sistema. Naturalmente per far girare i processi mantenuti su disco è necessario caricarli in memoria centrale.

L'operazione di spostamento dei processi dalla memoria al disco e viceversa è chiamata swapping. Nel corso degli anni sono state adottate diverse tecniche di swapping. In queste note ci si occuperà del metodo della memoria virtuale e, in particolare, verrà trattata la tecnica della paginazione.

L'idea di base su cui poggia la tecnica della memoria virtuale è che le dimensioni del codice e dei dati di un programma possono superare le dimensioni della memoria fisica. Se si suddivide in parti il programma e si effettua una scelta oculata delle parti da mantenere in memoria centrale si può, per esempio, far girare un programma di 1Mb in una memoria di 256Kb, suddividendo il programma in 4 pezzi da 256Kb che si alternano fra memoria centrale e disco. Se poi si è in multiprogrammazione, con lo stesso sistema usato nell'esempio precedente, in un computer con una memoria fisica di 1Mb, si possono far girare 4 programmi di 1Mb ciascuno, ognuno in un blocco di 256Kb. Ogni programma ha a disposizione una macchina privata di 256Kb di memoria centrale.

mappatura memoria

In un programma eseguibile, durante la compilazione, vengono generati un certo insieme di indirizzi di memoria che formano lo spazio di indirizzamento virtuale. Questo spazio viene diviso in unità dette pagine. Nell'esempio si suppone che ci sia uno spazio di indirizzamento virtuale di 64K e che ogni pagina abbia dimensione 4K, ma la dimensione potrebbe essere diversa. La memoria centrale, nell'esempio con spazio di indirizzamento di 32K, viene divisa in unità della stessa dimensione delle pagine, chiamate frame. La corrispondenza fra pagine virtuali e frame è chiamata mappatura. Per esempio la pagina 2 (8-12K) è mappata nel frame 6.

Un insieme di circuiti chiamato MMU (Memory Management Unit) si occupa di tradurre l'indirizzo virtuale in indirizzo fisico. Il processore spedisce alla MMU l'indirizzo virtuale della locazione cui vuole effettuare un accesso, la MMU traduce l'indirizzo virtuale in indirizzo fisico e inoltra la richiesta (stavolta di un indirizzo effettivo esistente) alla memoria.

Se un programma chiede, per esempio, di accedere all'indirizzo 0, viene mandato alla MMU l'indirizzo virtuale 0. Poiché l'indirizzo 0 appartiene alla pagina virtuale 0 e tale pagina, secondo lo schema precedente, è mappata nel frame 2, allora la MMU trasforma questo indirizzo in 8192 e spedisce tale indirizzo nel bus.

Con l'ausilio della MMU viene risolto il problema della corrispondenza fra indirizzi virtuali ed indirizzi fisici, ma resta un problema di fondo: in ogni caso solo 8 delle 16 pagine in cui è suddiviso il programma dell'esempio sono mappate in memoria. Se il programma richiede, per esempio, di accedere ad un indirizzo compreso nello spazio virtuale 24576-28671, cioè compreso nella settima pagina non mappata in memoria centrale, è necessario effettuare uno swapping fra una delle pagine caricate in memoria e la pagina 7. Se la pagina presente, in questo momento, in memoria non è stata modificata basta semplicemente che la pagina 7 venga scritta sopra la pagina rimpiazzata. Se la pagina ha subito delle modifiche bisogna conservare su disco la pagina aggiornata (potrebbe servire ancora).

Gli algoritmi per il rimpiazzamento delle pagine sono molto delicati perché devono tenere conto di parecchi fattori per non far decadere in modo significativo le prestazioni del sistema. Intanto bisogna tenere conto che ogni operazione di rimpiazzamento comporta l'uso della unità disco con un certo tempo di ritardo prima dell'esecuzione dell'operazione richiesta. Bisognerebbe quindi fare in modo da ridurre al minimo il page swapping evitando di scaricare pagine che possano servire immediatamente dopo.

Quando la MMU riceve la richiesta di un indirizzo virtuale appartenete ad una pagina non presente in memoria provoca una eccezione sul processore chiamata page fault. Il programma in esecuzione viene sospeso e viene lanciato il servizio del kernel per l'esecuzione dello swapping.

Le politiche più comunemente adottate per il page swapping sono:




AvantiIndietro - Inizio

http://ennebi.solira.org

ennebi@solira.org