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