Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
S.O.
nella ROM
Programma
utente Programma
utente
Programma
utente
S.O.
nella ROM S.O.
nella RAM
0 0 0
a b c
4.1.2 Multiprogrammazione con partizioni fisse
Quasi tutti i sistemi di elaborazione consentono ai diversi processi di girare contemporaneamente
sulla CPU, nel senso che, quando un processo è bloccato (in attesa di risorsa) la CPU viene
assegnata ad un altro processo.
Il modo più semplice per realizzare la multiprogrammazione è di dividere la memoria in n partizioni
di dimensioni diverse.
Come definire e quando effettuare la partizione: la partizione può essere effettuata quando il
sistema sta per attivarsi ed è l'operatore di sistema che può definire le partizioni.
Come agisce il processo sulla partizione: il gestore della memoria assegna al processo la più
piccola partizione di memoria utile per farlo lavorare, poichè la partizione non è dinamica, al
processo sarà assegnata una parte di memoria non utilizzata.
Svantaggio delle code multiple: la partizione della memoria in aree diverse, ciascuna con una
dimensione diversa dall'altra, implica che, in certi momenti, alcune partizioni non sono utilizzate in
quanto prive di processi in coda mentre altre saranno estremamente affollate.
Prima alternativa: una singola coda per i processi in attesa della memoria, ogni volta che si libera
una partizione, il job più vicino alla testa della coda che può entrare nella partizione è caricato.
Poichè non è desiderabile sprecare partizioni grandi per processi piccoli (cosa frequente in questa
alternativa), allora un'altra opzione è data da una seconda alternativa.
Seconda alternativa: scegliere tra la coda dei processi in attesa della memoria il processo più
grande che può entrare. Lo svantaggio di tale strategia è quello di non agevolare i processi piccoli,
che di solito sono quelli interattivi e che quindi dovrebbero essere più agevolati.
Terza alternativa: due code, una per i processi piccoli e l'altra per i processi più grandi.
Quarta alternativa: assegnare a un job un valore numerico che stabilisce il numero di volte che il
processo è stato messo da parte. Superata una soglia, il processo viene eseguito.
Un gestore della memoria per la multi-programmazione basato su partizioni fisse, qualsiasi sia
l'alternativa utilizzata, è impensabile negli attuali sistemi di elaborazione.
4.1.3 Rilocazione e protezione
L'attività di programmazione introduce 2 problemi essenziali che devono essere risolti: rilocazione
e protezione.
Ad esempio, quando viene effettuato un link, il linker deve conoscere l'indirizzo dove sarà caricato
il programma.
Soluzione 1: cambiare l'indirizzo ad ogni istruzione. Ai programmi caricati nella partizione 1 si
somma il valore 100, a quelli in posizione 2 il valore 200, ....
La rilocazione non risolve i problemi della protezione!
La protezione fu risolta, sul 360 dell'IBM, assegnando ad ogni partizione di 2KB un codice di 4 bit
PSW che il gestore della memoria controlla ogni volta che un processo effettua un accesso ad una
specifica locazione di memoria.
Soluzione 2: sono stati definiti 2 registri hardware (base, limite) che rappresentano il campo di
azione del programma e contengono rispettivamente l'indirizzo dove il programma è stato caricato e
il suo limite di azione (indirizoo finale). Tale soluzione risolve contemporaneamente i problemi di
rilocazione e di protezione.
L'hardware protegge i registri base e limite per evitare che qualcuno li possa modificare.
4.2 Un'astrazione della memoria: gli spazi degli indirizzi
Esporre la memoria fisica ai processi presenta tanti inconvenienti:
se i programmi utente possono indirizzare ogni byte della memoria, allora possono
– facilmente spazzar via il SO, intenzionalmente o accidentalmente, conducendo il sistema a
un brusco stop;
con questo modello è difficile che siano eseguiti contemporaneamente molteplici
– programmi.
Sui personal computer è normale avere parecchi programmi aperti contemporaneamente. Poichè è
difficile ottenere una simile situazione della memoria fisica, occorre fare qualcosa.
4.2.1 Nozione di spazio degli indirizzi
Per permettere a molteplici applicazioni di risiedere in memoria contemporaneamente senza
interferire l'un l'altra, devono essere risolti 2 problemi: la protezione e il riposizionamento.
Una soluzione primitiva, usata sull'IBM 360, è quella di etichettare grossi pezzi di memoria con una
chiave di protezione e confrontare la chiave del processo in esecuzione con quella di ogni parola di
memoria prelevata. Tuttavia, quest'approccio non risolve il problema del riposizionamento, sebbene
si possano riposizionare i programmi quando vengono caricati, ma si tratta di una soluzione lenta e
complicata.
Una soluzione migliore è inventare una nuova astrazione per la memoria: lo spazio degli indirizzi.
Uno spazio degli indirizzi è l'insieme degli indirizzi che un processo può usare per indirizzare la
memoria. Ogni processo ha il suo spazio degli indirizzi personale, indipendente da quello
appartenente ad altri processi.
Il concetto di uno spazio degli indirizzi è molto generale ed è appropriato in molti contesti. Per
esempio, per un numero di 7 cifre, lo spazio degli indirizzi va da 0000000 a 9999999, gli indirizzi
32
IPv4 sono numeri a 32 bit, così il loro spazio degli indirizzi va da 0 a 2 -1.
Gli spazi degli indirizzi non devono essere numerici. Anche l'insieme dei domini Internet .com è
uno spazio degli indirizzi. Questo spazio consiste di tutte le stringhe da 2 a 63 caratteri che possono
essere creati usando lettere, numeri e trattini, seguiti da .com.
Una cosa difficile invece è dare a ogni programma il suo spazio degli indirizzi: l'indirizzo 28 in un
programma significa una locazione fisica diversa dall'indirizzo 28 in un altro programma.
Registri base e registri limite
Questa soluzione si basa su una versione particolarmente semplice della rilocazione dinamica.
Quello che fa è mappare lo spazio degli indirizzi di ogni processo su di una parte diversa di
memoria fisica in modo semplice.
La soluzione classica è quella di equipaggiare ogni CPU con 2 registri hardware speciali,
solitamente chiamati registro base e registro limite. Quando sono usati questi registri, i programmi
sono caricati in posizioni di memoria consecutive dovunque vi sia spazio e senza riposizionamento
durante il caricamento. Al momento dell'esecuzione di un processo, il registro base è caricato con
l'indirizzo fisico dove comincia il suo programma in memoria e il registro limite è caricato con la
lunghezza del programma.
Ogni volta che un processo consulta la memoria, sia per prelevare un'istruzione sia per leggere o
scrivere una parola dati, prima di inviare l'indirizzo sul bus di memoria, l'hardware della CPU
aggiunge automaticamente il valore di base all'indirizzo generato tramite il processo.
Contemporaneamente controlla se l'indirizzo offerto sia uguale o maggiore del valore nel registro
limite, nel cui caso è generato un errore e l'accesso viene interrotto.
Così, nel caso qui sotto, il processo esegue l'instruzione , ma l'hardware la tratta come se
JMP 28
fosse , così si dirige sull'istruzione come previsto:
JMP 16412 CMP 0 32764
.
.
CMP 16412
16408
16404
16400
16396
16392
16388
JMP 28 16384
0 16380 0 16380 0 16380
. . .
. . .
ADD 28 CMP 28 ADD 28
MOV 24 24 MOV 24
20 20 20
16 16 16
12 12 12
8 8 8
4 4 4
JMP 24 0 JMP 28 0 JMP 24 0
a b c
Poichè ad ogni indirizzo di memoria, generato automaticamente, viene aggiunto il contenuto del
registro base prima di essere spedito alla memoria, l'impiego di registri limite e base è un modo
semplice per attribuire a ciascun processo il suo spazio degli indirizzi.
In molte implementazioni i registri limite e base sono protetti in modo che solo il SO possa
modificarli.
Uno svantaggio della rilocazione per mezzo dei registri limite e base è la necessità di eseguire una
somma e un confronto per ogni riferimento alla memoria. I confronti possono avvenire
velocemente, ma le somme sono lente a causa del tempo di propagazione, a meno che non siano
usati circuiti speciali per la somma.
4.2.2 Swapping
Problema: immaginiamo che la dimensione del codice da eseguire sia maggiore della dimensione
della memoria centrale libera e, più in generale, immaginiamo di avere un numero di processi tale
che la somma delle dimensioni del loro codice sia maggiore della memoria centrale disponibile.
In questi casi il SO non è in grado di caricare il processo, sia nel primo sia nel secondo caso dovrà
attendere la fine di qualche processo per liberare la memoria.
Soluzione: la soluzione tipica per evitare questi problemi è abilitare il SO a trasferire il contenuto di
un'area di memoria centrale in un'area della memoria di massa (tipicamente della area di swap) al
fine di rendere disponibile la memoria resa libera.
Questa tenica, denominata tecnica di swapping, generalmente è applicata ai processi che sono in
attesa.
Nei sistemi timesharing o nei personal computer, in generale, la memoria centrale non è sufficiente
a mantenere tutti i processi che richiedono di andare in esecuzione.
La soluzione a tale problema è quella di spostare i processi attivi e in attesa sul disco e di reinserirli
quando necessitano della CPU.
Lo swapping carica in memoria l'intero processo da mandare in esecuzione per un tempo minore o
uguale al suo quanto di tempo, quindi lo sposterà in una speciale memoria sul disco chiamata swap
disco.
La memoria virtuale consente di caricare in memoria centrale solo porzioni del processo.
C C C C C
B B B B A
A A A D D D
S.O. S.O. S.O. S.O. S.O. S.O. S.O.
a b c d e f g
Nota: in questo contesto il S.O. sta nella parte bassa della memoria
In questo esempio:
a. il processo A viene caricato in memoria;
b,c. i processi B e C sono anch'essi caricati in memoria (dinamicità della memoria);
d. il processo A viene scaricato dalla memoria per fare posto ad altri processi;
e. viene caricato il processo D;
f. il processo B viene scaricato liberando una porzione di memoria in cui può essere
caricato il processo A;
g. viene caricato il processo A in una posizione diversa da quella originale.
La flessibilità è data dal non essere legati alla specifica dimensione della partizione della memoria
ma alle dimensioni del processo:
la flessibilità crea qualche problema di rilocazione e di rilascio della memoria;
– si deve tener conto di quale parte della memoria è stata resa