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