LA GESTIONE DELLA MEMORIA



Documenti analoghi
Sistemi Operativi. 5 Gestione della memoria

Gestione della Memoria

Sistemi Operativi Kernel

Un sistema operativo è un insieme di programmi che consentono ad un utente di

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Gestione della memoria centrale

Scheduling della CPU:

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Scheduling della CPU

Il Sistema Operativo

Il software di base comprende l insieme dei programmi predisposti per un uso efficace ed efficiente del computer.

Il memory manager. Gestione della memoria centrale

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

Sistema operativo: Gestione della memoria

Lo scheduling. Tipici schedulatori

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

Pronto Esecuzione Attesa Terminazione

Scheduling. Sistemi Operativi e Distribuiti A.A Bellettini - Maggiorini. Concetti di base

Corso di Informatica

Sistemi Operativi. Scheduling della CPU SCHEDULING DELLA CPU. Concetti di Base Criteri di Scheduling Algoritmi di Scheduling

Sistemi Operativi SCHEDULING DELLA CPU. Sistemi Operativi. D. Talia - UNICAL 5.1

Processi e Thread. Scheduling (Schedulazione)

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

La Gestione delle risorse Renato Agati

Scheduling. Lo scheduler è la parte del SO che si occupa di

SISTEMI OPERATIVI. Gestione della memoria Domande di verifica. Luca Orrù Centro Multimediale Montiferru 18/06/2007

Corso di Sistemi di Elaborazione delle informazioni

Scheduling della CPU. Concetti fondamentali. Concetti fondamentali. Concetti fondamentali. Dispatcher. Scheduler della CPU

Sistemi Operativi SCHEDULING DELLA CPU

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

Calcolatori Elettronici. La memoria gerarchica La memoria virtuale

Sistemi Operativi (modulo di Informatica II) I processi

La Memoria Virtuale Ottimizzazione della memoria centrale

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Sistema operativo: Gestione dei processi

Capitolo 11 La memoria cache

GESTIONE DELLA MEMORIA CENTRALE

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

Introduzione. Coordinazione Distribuita. Ordinamento degli eventi. Realizzazione di. Mutua Esclusione Distribuita (DME)

Informatica: il sistema operativo

La memoria - generalità

Il software. la parte contro cui si può solo imprecare. Il software

INFORMATICA. Il Sistema Operativo. di Roberta Molinari

Memoria Virtuale. Lezione 29 Sistemi Operativi

Concetti di base. Scheduling della CPU. Diagramma della durata dei CPU-burst. Sequenza Alternata di CPU Burst e I/O Burst

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

Il Sistema Operativo (1)

1. Che cos è la multiprogrammazione? Si può realizzare su un sistema monoprocessore? 2. Quali sono i servizi offerti dai sistemi operativi?

Lo schedulatore del kernel

12. Implementazione di un File System Struttura a livelli Allocazione contigua

Varie tipologie di memoria

Coordinazione Distribuita

Sistemi operativi. Esempi di sistemi operativi

SCHEDULATORI DI PROCESSO

Appunti sulla Macchina di Turing. Macchina di Turing

Sistemi Operativi GESTIONE DELLA MEMORIA SECONDARIA. D. Talia - UNICAL. Sistemi Operativi 11.1

Sistemi Operativi. Memoria Secondaria GESTIONE DELLA MEMORIA SECONDARIA. Struttura del disco. Scheduling del disco. Gestione del disco

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

DMA Accesso Diretto alla Memoria

Algoritmi di scheduling

ESERCIZIO 1 (b) Dove è memorizzato il numero del primo blocco del file? Insieme agli altri attributi del file, nella cartella che contiene il file.

FONDAMENTI di INFORMATICA L. Mezzalira

Pag. 1. Introduzione allo scheduling. Concetti fondamentali. Scheduling della CPU. Concetti fondamentali. Concetti fondamentali. Algoritmi.

Capitolo Silberschatz

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

I processi. Un processo è una attività, controllata da un programma, che si svolge su un processore.

Scheduling. Scheduling 14/12/2003 1/7

La memoria centrale (RAM)

Università degli Studi di Padova Dipartimento di Matematica. - Corso di Laurea in Informatica

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Scheduling della CPU Simulazione in linguaggio Java

Il sistema operativo. Sistema operativo. Multiprogrammazione. Il sistema operativo. Gestione della CPU

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Sistemi Operativi GESTIONE DELLA MEMORIA CENTRALE. D. Talia - UNICAL. Sistemi Operativi 6.1

Il software. la parte contro cui si può solo imprecare. Funzioni principali del sistema operativo. (continua) Gestione della memoria principale

Scheduling della CPU

Sistemi Operativi 1. Mattia Monga. a.a. 2008/09. Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia mattia.monga@unimi.

Strutturazione logica dei dati: i file

Definizione di processo. Un processo è un programma (o una parte di una programma) in corso di esecuzione

Criteri di Scheduling Algoritmi di Scheduling Multiple-Processor Scheduling Asymmetric/Symmetric multiprocessing Processori Multicore

La gestione della memoria

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

J. Assfalg Appunti di Sistemi Operativi

Architettura hardware

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Strutture di Memoria 1

9. Memoria Virtuale. 9. Memoria Virtuale. 9. Memoria Virtuale

I processi Unix. Entry della tabella dei processi

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)

40. Le transizioni fra stati Lo schema di transizione fra stati può essere rappresentato graficamente nel modo seguente :

Esercitazione E6 Esercizi d esame

Cosa è un foglio elettronico

J. Assfalg Appunti di Sistemi Operativi

Esercizi su. Funzioni

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

scheduling Riedizione modifi cata delle slide della Prof. DI Stefano

PROGRAMMA GESTIONE TURNI MANUALE UTENTE. Programma Gestione Turni Manuale Utente versione 1.1

SCHEDULING DEI PROCESSI

= 0, 098 ms. Da cui si ricava t 2 medio

Transcript:

LA GESTIONE DELLA MEMORIA Ambiente Monoprogrammato (monoprogrammazione) In ambiente monoprogrammato é possibile far girare un solo programma per volta. Tutte le risorse sono dedicate all unico programma residente in memoria. Non esiste il problema della concorrenza e il S.O. risulta abbastanza semplice. Abbastanza semplice risulta anche la gestione della memoria centrale. La memoria centrale é divisa in non più di tre aree: a) Area contenente i moduli software del S.O b) Area contenente il programma utente da eseguire c) Area differenza fra Area totale a disposizione dell utente e Area occupata dal programma caricato. Tale Area resta vuota e non utilizzabile. Allocazione Singola Contigua (vedi Fig. 13) Il modo più semplice di gestione della memoria, in questo caso, consiste nel riservare una prima parte della memoria, ad accesso controllato, contenente le procedure del S.O. L utente ha quindi a disposizione la parte rimanente della memoria che inizia da un indirizzo definito staticamente. In questo caso il calcolo dell indirizzo è estremamente semplice, in quanto l indirizzo iniziale è fissato staticamente, quindi il passaggio dal nome simbolico all indirizzo rilocabile e fisico é immediato Funzioni che il S.O. deve garantire per il gestore della memoria: 1) Mantenere traccia dello stato di memoria (tutta la memoria é dedicata interamente all unico lavoro) 2) Definire la strategia di allocazione (se la memoria é sufficiente si può allocare) 3) Effettuare l allocazione (programma allocato a partire dalla prima locazione libera dal S.O.) 4) Deallocare la memoria (finito il lavoro, il programma rilascia la risorsa memoria) NB: un programma di dimensione superiore a quella fisicamente disponibile (memoria utente ), non ha nessuna possibilità di essere eseguito. Facendo riferimento al ciclo di vita del processo, il programma non supera la fase di lancio. Il S.O. verifica che non ci sono le condizioni per farlo diventare processo (verrà visualizzata una condizione di errore). Svantaggi principali: a) Utilizzazione ridotta della memoria b) Inefficiente uso del processore (resta in attesa durante le operazioni di I/O) c) Il programma utente deve avere una dimensione limitata compatibilmente con la memoria disponibile Ambiente multiprogrammato (multiprogrammazione) In questo caso il sistema di elaborazione deve gestire più programmi contemporaneamente presenti in memoria centrale. Quindi la memoria diventa una risorsa soggetta a condivisione. Un problema rilevante é quello degli accessi fuori area; il S.O. deve controllare che ogni programma faccia riferimento soltanto agli indirizzi facenti parte dell area di memoria ad esso dedicata (protezione degli accessi fuori area). Il sistema deve provvedere ad un ricalcolo degli indirizzi fisici secondo tecniche molto più sofisticate rispetto al caso 23

precedente (ci saranno dei registri che tengono traccia degli indirizzi di soglia fra le varie aree di memoria. Le aree in cui si considera divisa la memoria centrale fisica vengono chiamate partizioni. ( vedi Fig 14) Fig 14 Funzioni fondamentali svolte da un gestore della memoria 1) Mantenere traccia dello stato della memoria (conoscenza dello stato delle singole partizioni. Es: in uso/non in uso, dimensione, indirizzo iniziale ecc ). 2) Definire la strategia di allocazione: se c é una partizione libera che può contenere il programma questo può essere allocato secondo dei criteri realizzati principalmente dal job scheduler 3) Effettuare l allocazione: il programma é allocato nella partizione prescelta a partire dall indirizzo indicato dal S.O. 4) Deallocare la memoria: quando il lavoro é finito, il programma rilascia la partizione che torna nello stato di disponibilità. Allocazione Partizionata L allocazione partizionata prevede due modalità fondamentali : partizionamento statico e dinamico Partizionamento Statico La memoria centrale è divisa a priori in partizioni di dimensione prefissata e le informazioni relative allo stato della risorsa vengono inserite in una tabella delle partizioni secondo la struttura di Fig 15 Fig 15 Nell esempio indicato ci sono cinque partizioni a disposizione degli utenti. Tali partizioni variano fra gli 8 e i 520 K. Soltanto le N 1, 2, 5 sono occupate. I primi 312 K sono occupati dal S.O. In questo esempio la memoria totale é composta da 1024 Kbytes. Questa tabella serve per conoscere lo stato della risorsa memoria e per la costruzione del meccanismo di protezione. (Per ogni partizione viene indicato lo spazio di indirizzi riservato). Quando un nuovo programma vuole accedere alla memoria, il S.O. consulta la tabella alla ricerca di una partizione sufficientemente ampia 24

par contenere il programma; se la ricerca ha successo, il programma viene caricato e nella tabella viene indicato partizione in uso. Questo meccanismo di allocazione funziona bene quando si conosce, statisticamente, la frequenza e la dimensione dei programmi che richiedono la memoria. Sarà utile sapere se l elaboratore lavora con tanti piccoli programmi oppure con pochi grossi programmi. (Nel primo caso servono molte piccole partizioni nel secondo poche grandi). Questa tecnica produce lo spiacevole fenomeno definito: frammentazione. Come indicato anche in Fig 15, i programmi non occupano interamente la partizione che viene loro assegnata ma resterà sempre un piccolo spazio non utilizzato e non utilizzabile da altri utenti. Se si ha un programma di piccole dimensioni e si è costretti ad assegnargli una partizione di dimensioni notevoli, la parte che resta inutilizzata non può essere occupata da un altro programma anche se lo spazio libero risulta sufficiente. Svantaggi del partizionamento statico sono quindi: a) Rallentamento del lavoro b) Sfruttamento inefficiente della risorsa memoria Partizionamento Variabile Secondo questa tecnica il S.O. crea partizioni della esatta dimensione necessaria a contenere il programma che si sta caricando. Tale tecnica utilizza due tabelle; una tabella delle partizioni occupate e una tabella delle partizioni libere. Esempio : (vedi Fig 16 ) Fig 16 Inizialmente la tabella delle partizioni libere sarà costituita da un solo record che indica una sola partizione grande quanto l intera memoria, mentre la tabella delle partizioni occupate sarà completamente vuota. Nell istante considerato, la memoria ha tre partizioni occupate, non contigue, e due libere. Si supponga che il S.O. selezioni un programma che occupa 24 K di memoria. Il S.O. analizzando la tabella delle partizioni libere, vede che c é una partizione libera di 32 K ( vedi Fig.17) 25

Fig 17 Esempio di partizionamento dinamico La prima tabella ha guadagnato un record e contemporaneamente la seconda ha mantenuto ancora due partizioni, la prima delle quali ha ora ampiezza di soli 8 K e parte dall indirizzo 376K. Rappresentazione della memoria ( dopo allocazione Prog_4 ) A questo punto, se il prog_2 termina, viene liberato lo spazio di memoria centrale e quindi viene liberato un record nella tabella delle partizioni occupate ed occupato un record nella tabella delle partizioni libere. Se viene liberata una partizione adiacente ad un altra partizione libera, allora ne verrà costruita una unica che le comprende entrambe. Quando termina il prog_4 viene creata un unica partizione ampia 64 K a partire dalla locazione 320 K. 26

Strategie di allocazione del Gestore della Memoria Il problema consiste nello scegliere la partizione più idonea per allocare un programma. I metodi più comuni sono i tre seguenti: 1) FIRST FIT: il programma viene inserito nella prima partizione di dimensione sufficiente a contenerlo 2) BEST FIT: Il programma viene inserito nella partizione la cui dimensione è più vicina a quella richiesta, in modo da ridurre al minimo la dimensione dei frammenti 3) WORST FIT: Il programma viene inserito nella partizione più grande disponibile in quel momento, in modo da generare dei frammenti della dimensione massima possibile. Nessuna di queste tre tecniche é la migliore in assoluto. I progettisti di sistemi operativi le ritengono tutte valide. Nella seconda tecnica (BEST FIT) il vantaggio principale é dovuto al fatto che si hanno frammenti molto piccoli e quindi minor spreco di spazio. Lo svantaggio principale, in partizionamento dinamico, consiste nella difficoltà di allocare programmi in partizioni molto piccole (frammenti). Nella terza tecnica (WORST FIT) i frammenti sono abbastanza grandi per essere riutilizzati. Le due tecniche suddette richiedono che la tabella delle partizioni libere sia ordinata per dimensione delle partizioni crescente, in modo da facilitare l operazione di ricerca. Le tre tecniche suddette possono essere usate sia in partizionamento statico che dinamico. Partizionamento Rilocabile Per risolvere il problema della frammentazione si possono ricompattare tutte le aree libere di memoria in modo da avere a disposizione un unica grande area, posta nella memoria bassa oppure alta, e nuovamente utilizzabile per altri programmi. In linea di principio il procedimento sembra abbastanza semplice; praticamente invece si presentano notevoli problemi dato che il sistema deve trattare delle operazioni o istruzioni legate agli indirizzi delle locazioni; si pensi alle strutture di dati che utilizzano puntatori. Poiché il ricompattamento implica uno spostamento di un programma in altra zona di memoria, si deve mettere in atto una tecnica che riaggiusti tutti i riferimenti alla memoria. Il S.O. deve essere in grado di lavorare con partizionamento dinamico. Con il partizionamento statico non é pensabile un compattamento dei programmi. 1) Prima soluzione: si ricaricano tutti i programmi presenti in memoria centrale in modo contiguo lasciando così un unico spazio in fondo alla memoria. Tale operazione comporta una ripartenza di tutti i programmi. In questo modo non ci sono problemi di ricalcolo degli indirizzi fisici. Svantaggi : a) Ovviamente non è possibile procedere in tal modo se il programma ha prodotto dei risultati (anche una sequenza di modifica di un file). b) se, mentre avviene il ricaricamento, si presenta un nuovo programma, il S.O. deve decidere se caricarlo insieme agli altri (magari a danno di altri precedentemente presenti in memoria) oppure costringerlo ad attendere. c) Il procedimento é lungo e complesso e può rallentare in modo consistente il lavoro dell elaboratore 2) Seconda soluzione: si effettua un ricaricamento limitato al minimo necessario. Qualche programma può non richiedere di essere spostato. Per ogni partizione é prevista una coppia di registri chiamati: registro base di rilocazione e registro limite. Nel registro base di rilocazione viene memorizzato il numero di bytes di cui avviene lo spostamento. Il registro limite memorizza la dimensione della partizione. Il programma in questo modo non viene modificato (con risparmio di tempo e risorse). Ad ogni riferimento a memoria viene sommato (compattamento verso la parte alta della memoria) o sottratto (compattamento verso la parte bassa della memoria) il contenuto del registro base di rilocazione. ESEMPIO: (vedi Fig 18) Il prog_x é stato caricato in una partizione ampia 20 K a partire dalla locazione 51200 della memoria centrale. Dalla locazione 20480 fino al programma suddetto si é generato uno spazio libero che si vuole compattare verso la parte bassa degli indirizzi di memoria. (Reg_lim = 20480 ( dim part)), (Reg_base_riloc = 30720 (51200-20480)). 27

Il valore del Reg_base viene sottratto (compattamento verso il basso) a tutti i riferimenti a memoria riscontrati nel programma durante l esecuzione. Per esempio se un istruzione fa riferimento alla locazione 60350, dopo il compattamento il riferimento sarà modificato in 29630 ( 60350-30720). La funzione principale del registro limite riguarda la protezione degli accessi. Anche a compattamento avvenuto non devono esserci riferimenti non consentiti alla memoria. ESEMPIO Compattamento di tre partizioni. (vedi Fig. 19) Supponiamo di voler spostare verso l alto tre partizioni intervallate da un frammento ognuna. La nuova posizione del primo programma si ottiene sottraendo la dimensione del primo frammento che viene eliminato (valore de Reg_base) al vecchio indirizzo iniziale. Il valore del Reg_base del secondo programma é calcolato sommando al valore del registro di rilocazione precedente l ampiezza del secondo frammento. Il valore del terzo Reg_base di rilocazione si ottiene sommando al valore del secondo la dimensione del terzo frammento. Il S.O. quindi provvede ad aggiornare il valore di ogni reg_base di rilocazione sommando il contenuto del registro base precedente alla dimensione dell ultimo frammento da eliminare. 28

Quando risulta conveniente effettuare un ricompattamento della memoria? Si potrebbe fare ogni volta che viene liberata una partizione in modo da avere sempre un unica grande area vuota a disposizione senza frammentazione. In questo modo si avrebbe una notevole semplificazione della tabella delle aree libere (partizionamento dinamico) a spese però di maggiori costi di gestione (tempo e realizzazione). Una seconda soluzione consiste nell effettuare l operazione di compattamento periodicamente. Il sistema lavora, in questo caso, come in un normale partizionamento dinamico ma periodicamente c é questa riorganizzazione delle aree libere e delle relative tabelle. Nessuna delle due soluzioni é in assoluto la migliore. Fra le tecniche viste finora, il partizionamento rilocabile é la soluzione migliore in termini di utilizzo della risorsa memoria. Gli svantaggi sono relativi ai costi, alla complessità e alla limitatezza alla sola memoria fisica. La Paginazione Questo meccanismo cerca di ridurre il fenomeno della frammentazione superando il vincolo della contiguità. Nella gestione paginata della memoria, si considera lo spazio di indirizzi di un programma diviso in pagine di una dimensione predefinita che é la stessa per tutti i programmi girano nell elaboratore. La memoria é divisa in blocchi tali da contenere esattamente una qualsiasi pagina di programma. Le pagine di programma vengono smistate in memoria nei blocchi che sono liberi in quell istante. Non c è contiguità fisica fra gli indirizzi del programma ma tramite certe tabelle si riesce a stabilire una contiguità logica. Page Breakage : con questo termine si indica il fenomeno della frammentazione limitato all ultima pagina. Se per esempio definiamo dei blocchi di memoria di 4 K, non tutti i programmi richiedono un multiplo esatto di 4 K, per cui l ultima pagina occuperà meno spazio lasciando pertanto un frammento inutilizzabile (es un programma di 17 K che viene caricato in una memoria divisa in blocchi di 4 K, necessita di 5 blocchi dei quali l ultimo produrrà un frammento di 3 K). La dimensione ottimale dei blocchi di memoria è generalmente intorno ai 4 K. I blocchi non devono essere molto grandi (possono generare grossi frammenti) e nemmeno troppo piccoli perché ogni programma ne richiederebbe un numero alto con conseguente difficoltà di gestione da parte del S.O. Funzioni fondamentali del gestore 1) Mantenere traccia dello stato della memoria, per mettere in relazione le pagine con i blocchi della memoria, si utilizzano due tabelle: PAGE MAP TABLE (PMT): una per ogni programma, con tanti elementi quante sono le sue pagine, contiene la corrispondenza tra il numero della pagina ed il numero di blocco di memoria che la contiene. MEMORY BLOCK TABLE (MBT): unica nel sistema, con tanti elementi quanti sono i blocchi della memoria, e contenente lo stato dei blocchi ( liberi, occupati). 2) Definire la strategia di allocazione dei blocchi: a carico del job scheduler; consiste nel ricercare nella MBT i blocchi liberi e disponibili per il programma in attesa; 3) Effettuare l allocazione: le pagine del programma sono caricate nei blocchi prescelti dal S.O. che provvede anche all aggiornamento delle PMT e MBT; 4) Deallocare la memoria: quando il lavoro é finito, il programma rilascia i blocchi di memoria che tornano nello stato di disponibilità ( aggiornamento della MBT ). Le tabelle suddette possono essere implementate in diversi modi: in modo abbastanza semplice attraverso un gruppo di registri dedicati che vengono caricati e gestiti come i registri dei programmi ma rispetto a questi ultimi hanno una gestione prioritaria. Tale tecnica é efficace se la tabella ha dimensioni limitate. Se le tabelle sono grandi vengono utilizzate memorie di tipo associativo (come la CACHE) dove il registro si compone di due parti: chiave e valore. Se il numero di elementi delle tabelle é alto, solo una parte può essere conservato nella CACHE (tempo ridotto) altrimenti si deve accedere alla memoria centrale con conseguente tempo medio di ritrovamento alto. Alle tabelle PMT e MBT viene associata la JT (job table) che contiene l identificatore del programma, la sua dimensione e l indirizzo di memoria a partire dal quale é memorizzata la sua PMT. ESEMPIO: (vedi Fig.18) In questo esempio si considerano delle pagine di 4 K (lo stesso per i blocchi). Dalle tabelle si vede che sono presenti in memoria tre programmi ognuno con la sua PMT e restano ancora due blocchi liberi. 29

VANTAGGI : 1) Drastica riduzione della frammentazione 2) Più programmi contemporaneamente presenti in memoria SVANTAGGI : 1) Complessità della gestione 2) Grande quantità di memoria richiesta per la conservazione delle tabelle 3) Limitatezza della memoria fisica 30

La Memoria Virtuale Nelle modalità di gestione della memoria viste finora, un programma non poteva essere mandato in esecuzione se non era disponibile una quantità di memoria sufficiente a contenerlo completamente. Per questo motivo molti programmi voluminosi, erano costretti a lunghe attese oppure non avevano nessuna possibilità di ottenere una allocazione in memoria centrale. Il concetto di memoria virtuale permette di superare il vincolo della limitatezza fisica della memoria centrale. Per esempio può essere possibile far girare un programma che richiede 50 K di memoria avendone a disposizione soltanto 20 K. Il principio consiste nell immaginare di avere a disposizione una memoria ipotetica virtuale teoricamente infinita. VANTAGGI : 1) Non c é più la limitazione dovuta alla dimensione della memoria fisica, quindi diventa possibile eseguire programmi di qualsiasi dimensione 2) Si eleva notevolmente il livello di multiprogrammazione del sistema 3) Si possono sfruttare, come conseguenza, in modo più efficiente tutte le altre risorse procurate dall elaboratore. Principi di Località: Il concetto di memoria virtuale trae origine dai seguenti due principi di località: 1) Principio di località temporale: le locazioni di memoria usate recentemente é probabile che saranno riutilizzate molto presto (es. programmi con istruzioni cicliche, sottoprocedure strutture di dati composte) 2) Principio di località spaziale: se é stata indirizzata una certa locazione di memoria, è probabile che saranno indirizzate presto anche le locazioni adiacenti ad essa (programmi con struttura sequenziale oppure strutture dati lineari come i vettori ). Da questi due principi si evince che, quando é in esecuzione una certa parte del programma, non é necessario che siano presenti in memoria anche tutte le altre istruzioni. Si possono conservare solo quelle parti di programma interessate dall esecuzione secondo i criteri probabilistici enunciati con i due principi. Gestione di una memoria virtuale: 1) Si deve spezzettare un programma (tecniche di paginazione e di segmentazione) 2) Caricamento in memoria di alcuni pezzi del programma lasciando il resto su memoria di massa 3) Se durante l esecuzione di un programma viene richiesta una pagina, non presente in memoria, si dovrà provvedere al caricamento con eventuale rimozione di un blocco (algoritmi di rimozione della pagina). Questi criteri sono seguiti dalle tre strategie principali per la gestione della memoria virtuale: Gestione virtuale paginata Gestione segmentata Gestione segmentata - paginata Gestione Virtuale Paginata Questa tecnica sfrutta la politica di gestione a pagine, tenendo comunque conto del nuovo concetto di memoria virtuale. Pertanto, se le pagine che servono non sono in memoria centrale, bisogna provvedere a caricarle e si devono eventualmente rimuovere altre pagine che al momento non servono (algoritmo di rimozione). Funzioni fondamentali del gestore: 1) Mantenere traccia dello stato della memoria (si devono mettere in relazione le pagine con i blocchi di memoria e con i dispositivi di massa, per questo vengono usate tre tabelle): Page Map Table (PMT): una per ogni programma, con tanti elementi quante sono le sue pagine, contiene la corrispondenza tra il numero della pagina e il numero di blocco di memoria che la contiene; Memory Block Table (MBT): unica nel sistema, con tanti elementi quanti sono i blocchi della memoria, e contenente lo stato dei blocchi (liberi/occupati); File Map Table (FMT): una per ogni programma, mette in relazione le pagine del programma col loro indirizzo fisico sul dispositivo di memoria di massa; 2) Definire la strategia di allocazione dei blocchi: questa gestione é sviluppata dal JOB SCHEDULER che deve ricercare nella MBT dei blocchi liberi per il programma in attesa. Se la memoria centrale é occupata, parte il meccanismo di rimozione delle pagine. 3) Effettuare le allocazioni: le pagine del programma vengono caricate nei blocchi prescelti dal S.O. (dopo eventuale rimozione ) che provvede anche all aggiornamento delle tabelle. 31

4) Deallocare la memoria: quando il lavoro é finito, il S.O. rende di nuovo disponibili i blocchi di memoria che tornano così disponibili. La paginazione virtuale, rispetto alla paginazione semplice, introduce qualche modifica alle tabelle (vedi esempio in Fig 19) MBT: mantiene la stessa struttura (Num_blocco/stato) e viene interrogata per accesso alla memoria PMT: oltre ai campi Num_pag, Num_blocco contiene un bit che indica se la pagina è presente o non presente in memoria centrale FMT: contiene due campi (Num_pagina, Indirizzo_file) e serve a mettere in relazione la singola pagina con l indirizzo della sua copia su disco. Nell esempio indicato, viene considerato un programma composto da 3 pagine inizialmente residenti su disco nelle locazioni indicate dalla FMT. Le pagine 0 e 1 sono state caricate in memoria centrale nei blocchi 2 e 4. La pagina 2 non è presente in memoria. Se successivamente ci sarà necessità di tale pagina, il S.O. dovrà accedere alla locazione 5340 (indicata dalla FMT) e caricare la pagina nel blocco individuato tramite la MBT. Vengono utilizzati due bit (reference bit e change bit) associati ad ogni blocco della memoria fisica (abbinati ad ogni record della MBT) e vengono utilizzati nella procedura di rimozione delle pagine dai blocchi. Reference bit: viene impostato ad 1 quando viene effettuato un riferimento ad una qualsiasi locazione del blocco Change bit: viene impostato ad uno quando viene effettuata una modifica ad una qualsiasi locazione del blocco relativo Processo sviluppato dal S.O: Inizio esecuzione istruzione; Calcolo Num_pag di programma da utilizzare; IF <Num_pag in memoria centrale> THEN begin completa l istruzione ; passa alla prossima istruzione ; end ELSE IF < esiste un blocco libero > THEN carica la pagina nel blocco libero ( usa FMT ) ; ELSE begin scegli il blocco da liberare; se la pagina é stata modificata ( Change bit = 1 ) riscrivila sul disco ; aggiorna le MBT e PMT ; carica la pagina nel blocco liberato ( usa la FMT ) ; end aggiorna le MBT e PMT ; continua l istruzione interrotta. 32

PAGE FAULT (fallimento dell operazione di ricerca della pagina): quando il sistema deve caricare una pagina si genera un page fault, se non viene recuperato un blocco libero, parte il meccanismo di rimozione di una pagina dalla memoria centrale. Vengono usati i seguenti algoritmi : 1) FIFO (first in first out) 2) LRU (least recently used) 3) NUR (not used recently) 1) Questo algoritmo é molto semplice: viene eliminata dalla memoria la pagina che, tra quelle presenti in un certo istante, é stata caricata per prima. Il metodo é semplice ma produce molti page fault. Se una pagina é usata frequentemente (es. pagina di menu principale), diventerà presto la più vecchia e quindi viene eliminata, ma essendo sempre richiesta viene immediatamente ricaricata rallentando così il sistema. 2) Tale algoritmo seleziona la pagina che non é stata referenziata da più tempo (non necessariamente si tratta di quella in memoria da più tempo).tale tecnica si basa sul principio di località: si suppone che se una pagina é stata richiesta di recente, é probabile che presto serva nuovamente (le informazioni per la rimozione di una pagina sono contenute nel reference bit e ne change bit). L efficienza di tale metodo é superiore a quella del FIFO 3) Tale metodo parte dagli stessi principi del metodo LRU. Si cerca di eliminare una pagina non utilizzata di recente (non necessariamente quella non usata da più tempo). In questo modo la gestione si semplifica. Si prevede un azzeramento periodico dei reference bit, se al momento della selezione della pagina viene trovato ad 1, significa che é stato fatto un accesso recente; se viene trovato a 0, non é stato fatto un accesso recente e quindi può avvenire la rimozione. La scelta della pagina da eliminare, fra quelle che hanno il reference bit= 0, é casuale. L efficacia di tale tecnica é vicina alla precedente ma é di più semplice implementazione. La tecnica della gestione virtuale paginata mantiene tutti i vantaggi legati alla gestione della memoria centrale in modo virtuale (memoria teoricamente infinita, alto livello di multiprogrammazione... ) e gli svantaggi dovuti alla complessità ed al volume delle tabelle da gestire. Per quanto riguarda la frammentazione, viene conservato quel minimo relativo al Page breakage (resto nell ultima pagina di ogni programma). Gestione virtuale segmentata Quando si parla di memoria virtuale, si intende che i programmi non sono caricati per intero in memoria centrale. Si deve quindi pensare ad una eventuale suddivisione da operare su ogni programma. La tecnica della paginazione é deterministica e legata alla dimensione predefinita staticamente per i blocchi di memoria. Con la gestione virtuale segmentata i programmi vengono divisi in segmenti di dimensione variabile secondo la logica del programma. Nella paginazione si fa una suddivisione in pagine indipendentemente da quello che contengono (criterio fisico). Nella segmentazione, la suddivisione in segmenti viene fatta a seconda del significato del contenuto (criterio logico). Tutto questo viene fatto nel rispetto dei principi di località. La paginazione, essendo legata, alle dimensioni del programma, poteva anche spezzare su due pagine una stessa funzione e generare quindi un numero notevole di page faults fra le due durante l esecuzione. Il problema si elimina se tutte le istruzioni che concorrono alla realizzazione di una funzione restano adiacenti anche in memoria centrale. La segmentazione virtuale consiste nella suddivisione della memoria centrale in una entità simile alla partizione: cioè uno spazio di dimensione variabile creato dinamicamente e gestito tramite tabelle che indicano le aree libere e quelle occupate. Oltre alle tabelle che realizzano il partizionamento, ci saranno dei meccanismi che realizzano la virtualizzazione. Funzioni fondamentali svolte dal gestore della memoria 1) Mantenere traccia dello stato della memoria ; si deve conoscere lo stato delle aree di memoria (libere e occupate) e lo stato di ogni programma (quanta parte é in memoria di massa e quanta in memoria centrale). Vengono utilizzate due tabelle principali: Segment Map Table (SMT): una per ogni programma, con tanti elementi quanti sono i suoi segmenti, che contiene la corrispondenza tra le aree di memoria e il segmento e l indicazione sul tipo di accesso consentito; Unallocated Area Table (UAT): unica nel sistema, elenca i dati sulle aree libere della memoria centrale; esiste un altra tabella che realizza il meccanismo di condivisione dei segmenti da parte di più programmi: Active Segment Table ( AST ) 2) Definire la strategia di allocazione della memoria (a carico del job scheduler), si deve ricercare nella UAT se esistono aree libere per il segmento richiesto del programma in esecuzione; se la ricerca non va a buon fine, parte il meccanismo di rimozione per creare spazio in memoria centrale 33

3) Effettuare l allocazione: i segmenti del programma sono caricati nelle aree libere prescelte dal S.O. (eventualmente dopo intervento del meccanismo di rimozione) che provvede anche all aggiornamento delle tabelle. 4) Deallocare la memoria: a lavoro finito il programma rilascia le aree di memoria occupate (se non sono condivise con altri programmi) che tornano disponibili ed eventualmente aggiorna i dati posti sul disco. La tabella SMT ha una struttura più complessa rispetto alla equivalente PMT (usata nella paginazione). (vedi Fig. 20). Primo campo: numero del segmento Secondo campo: dimensione del segmento che serve per la ricerca dell area libera nellauat Terzo campo: tipo di accesso consentito al programma nel segmento specifico (R lettura, W scrittura, E: esecuzione); Quarto campo: stato (In: in memoria centrale, Out: in memoria di massa) Quinto campo: locazione iniziale del segmento all interno della memoria centrale ( ha senso se il segmento é già in memoria) La tabella delle aree libere (UAT) ha la stessa struttura di un meccanismo semplicemente partizionato. In Fig. 21 viene rappresentata lo stato della memoria 34

Vantaggi principali del metodo segmentato : Elimina frammentazione: muovendo i segmenti in aree della dimensione esatta, si elimina il problema dei frammenti inutilizzabili (grazie anche al compattamento periodico) Permette la crescita dinamica del segmento: nel caso in cui il segmento subisce delle modifiche di dimensione, non si presentano problemi poiché la dimensione del segmento non é definita a priori. Nella paginazione, una modifica della dimensione di una pagina comporta la risuddivisione di tutto il programma. Facilita la condivisione dei segmenti: la suddivisione del programma é logica e non fisica é quindi possibile consentire la condivisione di alcuni segmenti che contengono funzioni che possono essere utili a più programmi Controllo degli accessi più rigoroso: l accesso ad ogni segmento é controllato Linking e loading dinamico: i programmi voluminosi e complessi possono essere composti da centinaia di procedure e funzioni distinte. Poiché é costoso linkarle e caricarle tutte in memoria nello stesso tempo, viene caricato in memoria solo il programma principale, mentre le altre parti vengono richiamate quando servono. Tabella AST: contiene informazioni sui segmenti attivi (residenti in memoria centrale). Quando un programma richiama un segmento, le coordinate del segmento vengono inserite in tale tabella. Un programma che ha bisogno di una funzione consulta prima la AST per controllare che sia già in memoria, nel caso non ci sia il S.O. provvede al caricamento. Quando un segmento viene rimosso dalla memoria centrale devono essere aggiornate tutte le SMT e le AST. I meccanismi di rimozione del segmento sono simili a quelli della paginazione, in più c é il vincolo della dimensione del segmento. Non basta che l area da liberare sia la più vecchia o la meno usata, é importante che la sua dimensione sia sufficiente. Svantaggi principali: La necessità del compattamento aumenta la complessità della gestione; La dimensione non fissa dei segmenti del programma non garantisce i vantaggi di memorizzazione guadagnata nell organizzazione a blocchi della memoria di massa La dimensione massima di un segmento é limitata alla dimensione della memoria fisica Le tecniche per ridurre il segment fault sono più complesse dell equivalente nella gestione paginata. Gestione virtuale segmentata - paginata Questa é una tecnica di tipo segmentato; in aggiunta ogni segmento é suddiviso in pagine di uguale dimensione. Si ottengono buoni risultati a scapito di una maggiore difficoltà di gestione. L indirizzo di una locazione di memoria é composto di tre parti: un numero di segmento, un numero di pagina del segmento, uno spiazzamento all interno della pagina (vedi Fig. 22) 35

In figura é rappresentato un esempio che indica il segmento N3, la pagina N6 all interno del segmento e lo spiazzamento all interno della pagina della locazione 850. In questo tipo di gestione la SMT contiene l indirizzo della tabella PMT che definisce la relazione tra pagine del segmento 3 e blocchi della memoria: il risultato é l indirizzo fisico iniziale del blocco 30 della memoria centrale all interno del quale si ricerca la locazione 850. Le tabelle sono tutte quelle relative alla segmentazione e alla paginazione: si può così mantenere la contiguità e l unità logica tipica della segmentazione e facilitare il caricamento in memoria del segmento poiché esso viene spezzato in più pagine. Nella SMT, invece della locazione iniziale del segmento si trova l indirizzo iniziale della PMT che contiene i dati relativi a tutte le pagine di quel segmento. I vantaggi e gli svantaggi sono quelli della paginazione e della segmentazione sommati. Il meccanismo della segmentazione paginata é abbastanza efficiente e flessibile con un buon livello di protezione degli accessi ma é piuttosto gravosa la gestione da parte del S.O. Come svantaggio si ha la ricomparsa della frammentazione dovuta al page breakage. 36

GESTIONE DEL PROCESSORE Il livello di S.O. richiamato con maggior frequenza, direttamente o da altri gestori, é quello che si occupa della gestione del processore. Vengono evidenziati i seguenti tre moduli: 1) Job scheduler: seleziona il job che può essere eseguito (transizione fra gli stati di acquisizione e pronto) 2) Process scheduler: decide tutte le modalità di accesso al processore (transizione tra gli stati pronto ed esecuzione) 3) Traffic controller: mantiene traccia dello stato del processo, coordina i meccanismi di sincronizzazione e comunicazione tra i processi (transizioni in stati di attesa e terminazione e pronto) In ambiente monoprogrammato il job scheduler ed il process scheduler coincidono in quanto il job selezionato dal job scheduler è anche l unico che otterrà l uso del processore. Scheduler: con tale termine si intende un gestore di una risorsa che esegue il suo lavoro secondo certe regole e priorità. Vengono evidenziate le seguenti classi di scheduling: Short term scheduling : gestisce un utilizzo della risorsa di durata molto breve (frazioni di secondo); si tratta del process sheduler che gestisce i tempi di utilizzo della CPU (millisecondi). Si parla anche di dispatcher o schedulatore di basso livello (rappresenta il processo con cui il nucleo di un S.O fa passare un processo tra quelli presenti nella ready list dallo stato di pronto allo stato di esecuzione). Medium term scheduling: Le operazioni di gestione della risorsa fanno riferimento a tempi di media lunghezza (le operazioni interne al calcolatore sono comunque velocissime per l uomo) un esempio può essere il job scheduler che gestisce operazioni meno frequenti e che richiedono più tempo. E più importante ottimizzare l uso della risorsa (tramite algoritmo) piuttosto che la elocità di esecuzione. Long term scheduling: (detto semplicemente scheduler) riguarda un controllo delle richieste a livello ancora più alto. (Può essere la fase in cui si decide se un programma può essere accolto all interno della macchina in attesa di essere scelto dal job scheduler. Da quanto detto si intuisce che, passando dallo scheduling a basso livello allo scheduling ad alto livello vengono trattate operazioni sempre meno legate al processore fisico; quindi si passa da problematiche relative alla riduzione dei tempi di esecuzione a problematiche relative alla ottimizzazione dell uso e della condivisione delle risorse. Un esempio di gestione a lungo termine é lo spooler che si occupa di gestire le richieste di stampa di più utenti in ambiente multiprogrammato. Job Scheduler Il job scheduler é un piccolo gestore che deve assegnare le risorse del sistema ai job (o programmi) selezionati. Deve pertanto svolgere le quattro funzioni fondamentali di un gestore : prendere nota dello stato dei job richiedenti applicare la strategia prescelta per selezionare i job da portare allo stato di pronto assegnare le risorse richieste dai job che sono arrivati in stato di pronto sovrintendere alle operazioni di deallocazione delle risorse Per mantenere traccia dei job che richiedono di essere eseguiti é necessario avere una tabella per ogni job chiamata job control block che contiene le informazioni circa le richieste temporali e di risorse. L insieme di tutte le tabelle JCB costituisce la coda dei job in stato di acquisizione. ( vedi fig.23 ) 37

Alcune informazioni, come la priorità dell utente o il tempo previsto per l esecuzione dipendono dalle dichiarazioni o dalle stime dell utente, altre, come lo stato corrente sono impostate dal sistema operativo. Per selezionare i job da portare dallo stato di acquisizione allo stato di pronto vengono utilizzati principalmente due criteri: Ottimizzazione dell uso delle risorse a costi limitati (complessità degli algoritmi di gestione) Minimizzazione dei tempi di attesa dei job Facendo riferimento alla minimizzazione dei tempi di attesa si definisce la seguente grandezza : Average Turnaround Time (ATT: tempo medio di esecuzione) così definito: dove Ti = Fi - Ai Fi = istante finale Ai= istante iniziale (istante di arrivo job) n = numero dei job Il problema consiste nell individuare delle strategie che mediamente comportano le minori attese per i programmi e quindi per gli utenti. Sistema monoprogrammato: Siccome é possibile eseguire un solo programma per volta, alcuni job saranno costretti ad attendere il loro turno. Si possono individuare tre strategie: FIFO (programmi eseguiti nell ordine in cui vengono lanciati). Shortest Job First (SJF) prevede una precedenza di esecuzione per il job che ha il tempo previsto minimo c é quindi un risparmio di tempo rispetto alla tecnica FIFO. Future Knowledge (conoscenza futura) é utilizzabile se il sistema conosce a priori la sequenza di job che si presenteranno per essere eseguiti; si possono fare delle scelte che permettono di migliorare il tempo medio Sistema multiprogrammato: Si possono utilizzare gli algoritmi visti con la variante che possono lavorare più job contemporaneamente. Se per esempio viene usata la tecnica FIFO, il S.O. farà eseguire i primi N job acquisiti (se N é il livello di multiprogrammazione) Process Scheduler Questo modulo si incarica di assegnare il processore ai processi che sono stati inseriti nella coda di pronto dal job scheduler. Anche in questo caso il modulo può essere considerato come un piccolo gestore di risorse. Si possono ancora individuare le quattro funzioni fondamentali dei gestori. Process Control Block (PCB): sono delle tabelle contenenti le informazioni fondamentali relative ad un processo in esecuzione. L insieme delle PCB é organizzato come lista di record (ogni PCB é un record). (vedi fig 24 ) Fig 24 Process Control Block 38

Il traffic controller viene richiamato ogni volta che un processo cambia stato (attesa-pronto-esecuzione ecc..) e va a modificare il contenuto del campo relativo allo stato all interno della corrispondente PCB. Le PCB organizzate nella lista che si trova nello stato di pronto costituiscono la coda che prende il nome di ready list e rappresentano le richieste dei job pronti a ricevere la CPU. Altre PCB si trovano nelle code relative agli altri stati che compongono il ciclo di esecuzione di un processo. Strategie di assegnazione del processore: FCFS (First Come First Served) Round Robin (RR) Inverso del time slice residuo Priorità definita Shortest Elapsed Time (SET) FCFS: é basata sul principio del FIFO. Il primo processo che entra nella ready list é il primo che ottiene l utilizzo della CPU che mantiene per tutto il tempo necessario al completamento del lavoro. ROUND ROBIN (Fig.25): é una tecnica molto importante sulla quale si basano molte altre. Ogni processo mantiene il processore per un certo tempo (time slice). Se il processo non ha finito il suo lavoro, deve essere inserito di nuovo nella coda nella posizione definita dalla particolare strategia adottata dal S.O. La tecnica round robin prevede che la ready list venga gestita in modo FIFO perché ad ogni processo in coda venga assegnato a turno un intervallo di tempo di CPU uguale per tutti. Se il processo, al termine del suo time slice, non ha terminato il suo lavoro, deve rilasciare forzatamente la CPU (preemption) e viene inserito in fondo alla ready list. In questo modo i processi brevi non sono soggetti a lunghe attese, mentre i processi lunghi allungano i loro tempi di lavoro. La scelta del time slice é molto importante; se il tempo é troppo breve rispetto alla durata dei processi, il numero di interruzioni risulta molto alto e si abbassano le prestazioni del sistema. Se il tempo é troppo lungo quasi tutti i processi terminano il loro lavoro e si ricade così nella tecnica FCFS. Fig. 25 Round Robin INVERSO DEL TIME SLICE RESIDUO: La tecnica del tempo residuo di CPU prevede una gestione con priorità della ready list. Il S.O. fa una prima assegnazione della CPU secondo la strategia Round Robin pura, poi inserisce i processi nella lista in ordine inverso rispetto al tempo di CPU non utilizzato. Si vuole cioè dare priorità maggiore ai processi che usano poco la CPU e che quindi lasciano un grande residuo di timeslice. In questo modo si raggiungono due obiettivi : Si abbrevia il tempo medio di esecuzione (si velocizzano i processi brevi) Si intensificano le operazioni sulle periferiche (aumenta la percentuale di utilizzo) infatti se un processo interrompe il suo lavoro col processore é molto probabile che lo faccia anche per svolgere delle operazioni di I/O. Processi I/O bound: processi che presentano una notevole quantità di operazioni di I/O Processi CPU bound: processi per i quali predomina il lavoro con la CPU 39

PRIORITÁ DEFINITA: si può pensare di ordinare la coda secondo delle priorità prestabilite, per cui ogni processo prende posto nella ready list secondo la propria priorità. Si possono definire anche tante code, una per ogni livello di priorità in modo che tutti i processi della stessa importanza siano nella stessa struttura (priorità multilista). Ogni coda viene poi gestita con tecnica FCFS oppure Round Robin. I processi a priorità più alta accederanno per primi; i processi a priorità inferiore potranno accedere alla CPU solo quando non c é nessun processo nelle code superiori. Il lavoro di una coda viene interrotto quando si presenta un nuovo processo di priorità superiore. Tale tecnica potrebbe produrre il fenomeno denominato starvation (attesa infinita) di processi a bassa priorità. SHORTEST ELAPSED TIME (SET): tale tecnica é una sintesi delle precedenti. E ancora una organizzazione multilista (gestita in Round Robin) che sfrutta dinamicamente le richieste temporali dei processi. I processi che arrivano in stato di pronto vengono automaticamente inseriti nella coda di priorità maggiore ottenendo quindi la CPU entro breve tempo. Se terminano il lavoro prima della fine del time slice escono dalla struttura, altrimenti regrediscono di un livello di priorità passando alla coda immediatamente inferiore. Tale procedimento si applica a tutti i processi della lista finché non resta vuota. A questo punto viene assegnata la CPU alla seconda lista con le stesse regole e così via fini all ultima. Se arriva un processo, mentre si sta scandendo una lista inferiore,al termine del time slice, il controllo passa alla prima lista della struttura. In pratica, a regime, il sistema da priorità massima alla lista contenente i processi che richiedono brevi periodi di CPU e penalizza i processi CPU bound che acquistano il processore raramente. 40