Gestione della memoria centrale
• La memoria principale è una risorsa essenziale all'interno di un
elaboratore
• Un programma per essere eseguito deve risiedere all'interno
della memoria principale e lo stesso discorso vale per i dati su
cui esso opera
• Anche nel caso della memoria principale esistono dei problemi
di gestione
• Se molti processi devono essere eseguiti contemporaneamente,
si dovrà trovare un meccanismo per permettere a questi
processi di condividere l'uso della memoria principale
Informatica di Base -- R.Gaeta
75
Gestione della memoria centrale
• Esistono due aspetti fondamentali della gestione della memoria
principale:
– la gestione della memoria reale
– la gestione della memoria virtuale
• Nel primo caso si suddivide la memoria principale tra i processi;
nel secondo caso si realizza una visione astratta della memoria
principale che consente di estenderne le potenzialità
Informatica di Base -- R.Gaeta
76
Gestione della memoria reale
• Data la memoria principale fisicamente esistente all'interno di
un elaboratore, come dobbiamo allocarla ai processi che devono
essere eseguiti?
• Consideriamo dapprima il caso, molto semplice, di un sistema
mono-programmato in cui in ogni istante esiste un solo processo
di utente
• In realtà abbiamo anche dei processi di sistema, e quindi
dovremo destinare una parte della memoria alla parte
residente del sistema operativo e una parte al processo utente
Informatica di Base -- R.Gaeta
77
Gestione della memoria reale
• La memoria è costituita da una sequenza di celle, tutte della stessa
lunghezza
• Ogni cella è caratterizzata da un indirizzo che viene utilizzato per
leggere/scrivere le informazioni
• Di solito si sceglie di destinare al sistema operativo le prime o le
ultime celle della memoria
0
X
X+1
Sistema Operativo
S.O.
processo
utente
N
Informatica di Base -- R.Gaeta
78
Gestione della memoria reale
• Veniamo ora al caso di un sistema multi-programmato in cui più
programmi utente sono eseguiti in alternanza.
• Immagine di un processo: insieme di istruzioni e dati su cui le
istruzioni operano
• Consideriamo il caso di due processi P1 e P2:
–
quando P1 è in esecuzione il programma ed i dati corrispondenti devono
essere in memoria principale e lo stesso discorso deve valere per P2
• Una prima possibilità per risolvere questo problema è quella di
suddividere la memoria principale in modo da contenere
simultaneamente le immagini dei due processi
Informatica di Base -- R.Gaeta
79
Gestione della memoria reale
• Esistono due tecniche che permettono di raggiungere questo
obiettivo, e si parla di:
– sistemi a partizioni multiple con allocazione contigua
– sistemi ad allocazione non contigua
• Nel primo caso la memoria viene suddivisa in partizioni che
devono contenere le immagini dei processi; si parla di
allocazione contigua perché ciascuna partizione deve contenere
interamente l’immagine di un processo
• Nel secondo caso si divide l'immagine di un processo in più
parti che possono essere caricate in memoria separatamente
Informatica di Base -- R.Gaeta
80
Gestione della memoria reale
• Nel caso di un sistema con partizioni di memoria multiple
sorgono nuovi problemi di gestione per il sistema operativo
– Quante partizioni creare e di quali dimensioni?
– Le partizioni sono create una volta per tutte al momento della
configurazione del sistema o possono essere modificate a seconda
delle necessità correnti?
– Come si sceglie la partizione in cui caricare l'immagine di un
processo?
– Come si tiene traccia di dove sono stati caricati i processi?
– Come si proteggono i programmi tra di loro?
Informatica di Base -- R.Gaeta
81
Gestione della memoria reale
• Per tener traccia delle zone di memoria in cui sono stati
caricati i programmi è sufficiente mantenere nel descrittore
di ciascun processo l'indirizzo iniziale della partizione in cui
esso è caricato
• Quando si hanno più processi in memoria si deve fare in modo
che nessuno di essi possa operare in una zona di memoria
destinata ad un altro
• Ad ogni processo deve essere consentito di leggere e scrivere
solo all'interno della sua partizione in modo da non danneggiare
l'esecuzione degli altri
Informatica di Base -- R.Gaeta
82
Gestione della memoria reale
• Si possono utilizzare due registri per delimitare la partizione
di memoria del processo in esecuzione e, ogni volta che si vuole
fare un accesso in memoria, si dovrà controllare che l’indirizzo
prodotto sia valido, cioè all’interno della partizione in cui è
caricata l’immagine del processo
Indirizzo iniziale partizione
Sistema Operativo
S.O.
Indirizzo finale partizione
processo
utente
Informatica di Base -- R.Gaeta
83
Gestione della memoria reale
• Suddivisione della memoria in partizioni fisse e partizioni
variabili
S.O.
200KB
100KB
100KB
S.O.
S.O.
50 KB
area libera
400 KB
area libera
350 KB
Informatica di Base -- R.Gaeta
84
Gestione della memoria virtuale
• Uno degli obiettivi di un sistema operativo multi-programmato,
in particolare in ambiente multi-utente, è quello di nascondere
il più possibile a ciascun processo (a ciascun utente) la presenza
degli altri processi (utenti) che stanno condividendo le risorse
di calcolo
• Compito del sistema operativo è quello di fornire ad ogni
singolo processo una visione astratta in cui esso ha una
macchina virtuale interamente a sua disposizione
Informatica di Base -- R.Gaeta
85
Gestione della memoria virtuale
• Nel caso della gestione del processore abbiamo visto che la
tecnica di alternare l'esecuzione fa sì che ogni utente abbia
l'impressione che il suo programma sia sempre in esecuzione
• Per quanto riguarda la gestione della memoria, il problema è più
complesso. Si vuole che ogni utente possa, almeno in linea di
principio, scrivere programmi grandi almeno quanto la memoria
reale e che questi programmi possano essere eseguiti
contemporaneamente ad altri
Informatica di Base -- R.Gaeta
86
Gestione della memoria virtuale
• In alcuni casi si vogliono addirittura nascondere agli utenti le
dimensioni della memoria fisica e fare in modo che essi possano
scrivere dei programmi di dimensione qualunque, anche molto
più grandi dello spazio di memoria effettivamente esistente
sulla macchina hardware
• In questo modo, tra l'altro, è possibile che un utente esegua i
suoi programmi su macchine differenti, senza doversi
preoccupare delle dimensioni delle loro memorie centrali
Informatica di Base -- R.Gaeta
87
Gestione della memoria virtuale
• Questa visione astratta della memoria prende il nome di
memoria virtuale e i programmi di sistema che la realizzano
prendono il nome di gestori della memoria virtuale
• La tecnica fondamentale per la gestione della memoria virtuale
consiste nel caricare le immagini dei processi nella memoria
centrale a pezzi
Informatica di Base -- R.Gaeta
88
Gestione della memoria virtuale
• Supponiamo di avere a disposizione una memoria principale
(spazio utente) di 1 MByte e di voler eseguire simultaneamente
due programmi che richiedono entrambi 1 Mbyte
• Le tecniche di gestione della memoria a partizioni fisse o
variabili non ci permettono di eseguire contemporaneamente
questi due programmi perché le loro immagini non potrebbero
essere caricate nella memoria principale
• Vediamo come possiamo risolvere questo problema con la
memoria virtuale
Informatica di Base -- R.Gaeta
89
Gestione della memoria virtuale
• Si parte dalla considerazione che per eseguire un processo non
è necessario caricare completamente in memoria la sua
immagine
• È sufficiente caricare in memoria principale solo quelle parti
del programma e dei dati che servono durante una certa fase
dell'elaborazione; le altre parti possono essere tenute su un
supporto di memoria secondaria
• In questo modo la memoria potrà essere condivisa da più
processi in quanto, in ogni istante, solo una parte di ognuno di
essi risiederà in memoria
Informatica di Base -- R.Gaeta
90
Gestione della memoria virtuale
• Per realizzare il concetto di memoria virtuale, è necessario
avere a disposizione:
– La memoria principale in cui tenere solo i programmi, o i pezzi di
programmi, che servono in un certo istante.
– Un supporto di memoria secondaria in cui mantenere tutte le
immagini dei processi che verranno caricate di volta in volta nella
memoria principale (solitamente si utilizzano come supporti di
memoria secondaria i dischi rigidi perché sono necessari dei
supporti veloci e con accesso diretto, per fare in modo che il
tempo richiesto per i caricare programmi dalla memoria
secondaria a quella principale non sia troppo alto)
Informatica di Base -- R.Gaeta
91
Gestione della memoria virtuale
• Consideriamo il caso di un programma di elaborazione di testi
• Ad ogni istante non è necessario avere in memoria tutte le
parti del programma, ma solo quelle correntemente in uso
• Ad esempio, la parte di programma che effettua la verifica
dell'ortografia non serve sempre, ma può essere caricata solo
quando tale funzione viene richiesta
• Allo stesso modo non tutti i dati sono necessari. Durante la
scrittura di un libro sarà sufficiente tenere in memoria i dati
relativi al capitolo che si sta scrivendo; il resto potrà essere
caricato in memoria solo quando serve
Informatica di Base -- R.Gaeta
92
Gestione della memoria virtuale
• Si possono tenere in memoria solo alcune parti delle immagini
dei processi, purché si sia sempre in grado di caricare le altre
parti quando servono. Questa è proprio l'idea che sta alla base
delle tecniche di gestione a pezzi e, in particolare, della
tecnica di paginazione a richiesta (demand paging)
• Nella paginazione l'immagine di un processo viene suddivisa in
pagine, tutte della stessa dimensione, che vengono caricate
all'interno della memoria principale in modo indipendentemente
Informatica di Base -- R.Gaeta
93
Gestione della memoria virtuale
• Per avere un sistema di gestione della memoria basato sul
demand paging anche la memoria principale dell'elaboratore
deve essere suddivisa in un certo numero di blocchi, tutti delle
stesse dimensioni (sono uguali alla dimensione della pagina)
Informatica di Base -- R.Gaeta
94
Avviamento dell’elaboratore
• In genere il sistema operativo viene mandato in esecuzione al
momento dell'accensione della macchina
• Questa fase iniziale prende il nome di bootstrap
• In questa fase una parte del S. O. (ossia un insieme di
programmi e un insieme di dati) viene caricata in memoria
principale
Informatica di Base -- R.Gaeta
95
Avviamento dell’elaboratore
• In genere questa parte del S. O. comprende:
– i programmi per la gestione dei processi e del processore
– i programmi per la gestione della memoria
– i programmi per la gestione delle periferiche e dell'input/output
– i programmi per la gestione del file system
– un programma che crea l'interfaccia verso l’utente (che può essere sia di
tipo testuale che di tipo grafico)
Informatica di Base -- R.Gaeta
96
Avviamento dell’elaboratore
• Una parte del sistema operativo deve essere sempre
mantenuta in memoria principale e deve essere sempre pronta
per l’esecuzione
• Questo significa che parte della memoria principale dovrà
essere dedicata a mantenere i programmi e i dati riguardanti il
sistema operativo
• Durante la fase di bootstrap vengono inoltre effettuate
operazioni di inizializzazione del sistema per tener conto delle
risorse hardware collegate all'elaboratore
Informatica di Base -- R.Gaeta
97
Avviamento dell’elaboratore
• Vengono identificati i dispositivi di memoria secondaria e le
periferiche collegate e, per ciascuno di essi, viene inizializzato
il programma di gestione
• In alcuni sistemi vengono anche effettuate delle verifiche sulle
risorse hardware, ad esempio, sullo stato dei dischi per
scoprire se esistono inconsistenze che si sono create nel corso
dell'uso dell'elaboratore
Informatica di Base -- R.Gaeta
98
Avviamento dell’elaboratore
• Spesso durante questa fase sono eseguiti anche dei programmi
che verificano l'eventuale presenza di virus annidati sul disco
dell'elaboratore
• I virus sono dei programmi pirata che possono essere
trasmessi da un elaboratore ad un altro quando si copiano dei
programmi
• Un virus può danneggiare il funzionamento dell'elaboratore
generando operazioni di disturbo o condizioni di errore (in
alcuni casi i virus possono anche portare a danneggiamenti seri)
Informatica di Base -- R.Gaeta
99
Sistemi Operativi: cenni storici
• Anni ‘50: Un programmatore (utente) aveva a sua disposizione il
computer durante il periodo di uso
• Anni ‘60: Sistemi a batch
– Motivazione: i computer erano abbastanza veloci ma erano costosi, quindi
era sprecato permettere l'accesso alla macchina ad una persona per
volta.
– Soluzione: sottoporre le elaborazione a “lotti” di job (programmi)
Carico di job
Esecuzione
Raccolta dei
risultati
Informatica di Base -- R.Gaeta
100
Sistemi Operativi: cenni storici
• Anni ‘70: Sistemi time-sharing
– Un gruppo di utenti, attraverso dei terminali, possono condividere il
computer avendo l'illusione di “essere completamente padroni” della
macchina
• Anni ‘80:
– Evoluzione tecnonologica
– Personal computer, reti locali, workstation, ecc.
Informatica di Base -- R.Gaeta
101
Sistemi Operativi: linee di evoluzione
• 50 -> 60 (avvento dei sistemi a batch)
– I computer dispongono di risorse (memoria centrale, ecc.) tali da poter
caricare in memoria sia programmi applicativi che S. O.
– Il costo dei computer è molto alto, quindi è auspicabile che la produttività
(quantità di lavoro che viene eseguito) sia la più alta possibile
– La risposta a queste esigenze ha portato allo sviluppo dei sistemi a batch.
Informatica di Base -- R.Gaeta
102
Sistemi Operativi: linee di evoluzione
• 60 -> 70 (avvento dei sistemi time sharing)
– Computer sempre più potenti (velocità di esecuzione delle operazioni,
capacità della memoria centrale, quella di massa, ecc.)
– Il costo dei computer decresce.
– Necessità di aumentare la produttività dei programmatori.
– La risposta a queste esigenze ha portato allo sviluppo dei sistemi time
sharing
Informatica di Base -- R.Gaeta
103
Sistemi Operativi: linee di evoluzione
• 70 -> 80 (personal computer, reti locali, workstation)
– Costo di computer in diminuzione
– Prestazioni elevate
– Il time sharing non è una tecnica soddisfacente. Per esempio le stazioni
grafiche (workstation) richiedono un feedback (risposta del sistema) che
non può essere fornito da un sistema time sharing
– Le reti di comunicazione permettono il collegamento di vari computer in
modo semplice ed economico
– Necessità gestire risorse distribuite
– Servizi locali e remoti
– Gestione di file allocati su differenti macchine
– Tutte queste esigenze hanno portato allo sviluppo di sistemi distribuiti
Informatica di Base -- R.Gaeta
104
Sistemi Operativi: linee di evoluzione
• 80 -> 90 Quali sono stati gli sviluppi rilevanti nel decennio
’80/'90 ?
– Continuo aumento delle prestazioni dei computer
– Diminuzione dei costi
– Reti
– Popolarità di Internet
Informatica di Base -- R.Gaeta
105