sei sul sito di Giovanni Fraterno
La gestione della memoria è un compito essenziale cui deve assolvere un
sistema operativo.
I sistemi operativi, infatti, fanno avanzare un processo utilizzando un’area di memoria
principale,
ed appunto contenente il relativo programma registrato in forma di codice direttamente
eseguibile.
Si definisce:
- spazio fisico (SF) l’insieme degli indirizzi delle locazioni della memoria principale
- spazio logico (SL) uno spazio astratto di indirizzi di una memoria logica
- processo virtuale un processo che, fatto avanzare, genera indirizzi logici, in tal modo il programmatore può gestire la memoria
principale senza porsi il problema di quali siano le
aree di memoria effettivamente libere.
Ebbene, il compito fondamentale del sistema
operativo, ovvero di un componente di quest’ultimo, e cioè del gestore della memoria, è definire quello che
viene chiamato mapping, e che consiste in una traduzione T con la quale si fa corrispondere ad ogni indirizzo logico di un processo
virtuale, un indirizzo
fisico
della memoria principale, ovvero:
La traduzione T può avvenire secondo 3 modalità:
1) all’atto della formazione del programma: in tal caso assemblatori
e compilatori danno luogo a programmi direttamente caricati in specifiche porzioni di memoria già previste dal programma
2) all’atto del caricamento del programma: in tal
caso, al momento in cui il processo chiede di essere caricato, il gestore della
memoria comunicherà all’assemblatore o al
compilatore, le zone libere della memoria, così che il programma può venire
modificato in modo che gli indirizzi siano riferiti alle suddette zone libere
3) all’atto dell’esecuzione del programma: in tal caso il programma viene fedelmente copiato nelle zone libere della memoria, ma con la traduzione da indirizzo logico a
fisico che però avverrà successivamente, ovvero ad ogni richiesta di indirizzamento da parte della
CPU.
La traduzione T più applicata fra quelle sopra
descritte è la terza.
Sono
4 le modalità
secondo cui la traduzione T può essere esplicitata, dando così luogo alla gestione della memoria:
- a partizioni fisse
- a partizioni variabili
- a ricoprimenti
- e virtuale.
Esplicitazioni di T ovviamente anch’esse di competenza del gestore della
memoria.
In questa sede esamineremo solo la gestione della
memoria a partizioni fisse.
Nella gestione della memoria a partizioni fisse la memoria principale è
suddivisa in un certo numero di aree, ognuna delle
quali ha una prefissata
dimensione.
Si veda ad esempio la successiva Figura a, e dove ogni area o partizione accoglie o meno un processo, si veda ad esempio la
Figura
b, ovvero
quella che viene subito dopo.
Il sistema operativo, ovvero il gestore della memoria a partizioni fisse, mantiene una tabella di occupazione, contenente, per ciascuna partizione, le
seguenti informazioni:
- l’indirizzo iniziale della partizione
- la dimensione della partizione
- se e quale processo occupa la partizione (ad una partizione vuota corrisponde NIL).
Si veda a tal fine la tabella di occupazione di Figura c relativa all’esempio
descritto nelle Figure a e b.
Se dunque il processo richiedente necessita
di uno spazio fisico di
memoria di dimensione n, il gestore consulta la tabella per vedere se esiste una partizione libera di dimensione maggiore o uguale ad n.
Se la partizione non esiste il processo richiedente
dovrà attendere che se ne libera uno.
Se la partizione esiste ha luogo l’aggiornamento della tabella, e ciò perché se lo spazio logico è
costituito da tutti gli i appartenenti all’intervallo (0, n-1), e se l’indirizzo iniziale o base della partizione libera è ad esempio A, ha luogo la seguente specifica traduzione T :
T(i) = A + i (per ogni i).
Traduzione specifica che prende il nome di rilocazione.
Come si è più su detto, tale
traduzione può avvenire all’atto del caricamento del programma, ed in tal caso si parla di rilocazione statica.
Se invece tale traduzione avviene all’atto dell’esecuzione del programma si parla rilocazione dinamica.
Questa specifica traduzione prende il nome di rilocazione perchè con essa è
possibile spostare il programma
da una partizione ad un altra, anche dopo che ha avuto inizio la sua
implementazione, basterà infatti aggiornare con una nuova base A, il registro base che la contiene, registro base che è anch’esso
sotto il controllo del gestore della memoria.