Mappe per tecnologie e progettazione
Ogni utente desidera avere una “memoria infinita”, veloce, poco costosa e possibilmente non volatile.
Caricamento Del Programma
Il SO utilizza delle tecniche di gestione della RAM, cercando di “renderla infinita” (memoria virtuale) così da poter sempre esaudire ogni richiesta di spazio effettuata dell’utente.
Nel calcolatore sono presenti diversi tipi di memoria, classificati in base alle loro caratteristiche fondamentali, cioè velocità e capacità
1)nastro (memoria di back-up);
2)disco (memoria secondaria);
3)memoria principale
4)cache: volatile, veloce, piccola e costosa;
5)registri: estremamente veloci e ridotti ad alcuni
Il gestore della memoria deve trasformare il
programma eseguibile (su memoria di massa)
in un processo in esecuzione (in memoria di
lavoro).
I programmi che “stanno per diventare processi
“vengono messi in una coda di entrata, dalla
quale ne verrà selezionato uno (o più) da
caricare da parte del loader e quindi da
collocare nella lista dei processi pronti (RL).
L’assegnazione degli indirizzi è incompleta
vengono cioè generati degli indirizzi relativi (indirizzo
logico) e all’atto del caricamento vero e proprio questi
vengono trasformati in indirizzi assoluti (indirizzo
fisico), quello utilizzato nella memoria RAM)
Un codice che ha tali caratteristiche si chiama
codice rilocabile.
Ogni processo dispone di un proprio spazio di
indirizzamento logico [0, max], che viene
allocato nella memoria fisica
il compilatore genera gli indirizzi ipotizzando
che il programma venga caricato nella
memoria a partire dall’indirizzo 0
in base a questo valore, vengono generati tutti
gli indirizzi e i collegamenti dati/istruzioni,
secondo due modalità di rilocazione
rilocazione statica: all’atto del caricamento in
memoria viene individuato l’indirizzo iniziale,
indirizzo di base, e viene sommato a tutti i riferimenti
presenti nel programma (offset)
rilocazione dinamica: il programma viene caricato in
una zona libera di memoria e, solo in fase di
esecuzione, viene inserito in un apposito registro,
chiamato registro base (o di rilocazione RL), il
valore dell’indirizzo effettivo della prima locazione di
memoria centrale;
Il dispositivo hardware che è in grado di
associare gli indirizzi virtuali agli indirizzi fisici è
il Memory Management Unit (o MMU).
La formula generale è quindi:
indirizzo fisico = indirizzo logico + offset
Gli indirizzi logici assumono quindi valori che vanno
da 0 a un valore massimo (maxind)
i corrispondenti indirizzi fisici vanno da (RL + 0) a
(RL + maxind)
Il passaggio dall’indirizzo logico all’indirizzo fisico si
definisce address binding.
Il registro di rilocazione RL contiene quindi
l’indirizzo fisico più piccolo: è anche presente
un ulteriore registro, il registro limite che
contiene il massimo indirizzo utilizzabile dagli
indirizzi logici.
Dato che è impossibile controllare a priori quali
indirizzi di memoria un programma referenzierà
questo controllo deve essere fatto durante
l’esecuzione del processo:
Binding,Linking e Loading
Il calcolo degli indirizzi logici viene effettuato
nella fase di linking dei programmi
il passaggio dall’indirizzo logico a quello fisico
avviene nella fase di binding che può essere
fatta in momenti diversi:
compile time
load time
execution time
Sappiamo che per essere eseguito un
programma deve risiedere in memoria centrale
per poterlo fare è necessario che lo spazio
libero in memoria sia sufficientemente grande
da poterlo contenere e inoltre che questo
spazio sia contiguo.
Possiamo subito fare alcune semplici
osservazioni
2) nei sistemi multiprogrammati il continuo
caricamento e scaricamento dei programmi produce
una frammentazione della memoria creando delle
regioni libere di dimensioni spesso ridotte
magari la somma dello spazio totale libero sarebbe
sufficiente a contenere il programma,
1) oggi i programmi hanno dimensioni notevoli
sicuramente superiori alla dimensione della
memoria RAM
è impensabile che il programmatore scriva un
programma cercando di risparmiare spazio,
come si faceva negli anni Ottanta!
Sapendo che l’obiettivo è quello di ottimizzare
l’utilizzo della memoria, elenchiamo alcune
possibili soluzioni:
1 Swapping
2 Caricamento dinamico
3 Overlay
4 Partizionamento