Gestione_Memoria_Centrale Il compito principale del gestore della memoria è portare i programmi i memoria centrale perché il processore li esegua. Una di queste tecniche, il partizionamento, è stata usata con diverse variazioni, in alcuni sistemi operativi ora obsoleti. Le altre due tecniche sono la paginazione e la segmentazione. Partizionamento fisso La memoria è partizionata in regioni con confini prefissati. Sistema operativo Sistema Operativo 4 Mbyte 16 MByte 8 Mbyte 16 MByte 8 Mbyte 16 MByte 16 Mbyte 16 Mbyte 16 Mbyte Partizioni di uguali dimensioni Partizioni di diverse dimensioni Sono due le difficoltà che si presentano usando partizioni fisse della stessa dimensione. Il programma può essere troppo grande per risiedere in una partizione. In questo caso il programmatore deve progettare il programma con l’uso di overlay, in modo da averne solo una porzione residente in memoria principale. L’utilizzazione della memoria è estremamente inefficiente: infatti qualunque programma, indipendentemente dalla sua dimesnsione, occupa un’intera partizione. Entrambi questi problemi possono essere minimizzati, sebbene non risolti, usando partizioni con diversa dimensione. Partizionamento dinamico Con il partizionamento dinamico si usano partizioni in numero e lunghezza variabile; quando un processo è caricato in memoria gli è allocata tanta memoria quanta richiesta. Se un processo termina o non è più Ready il sistema operativo libera la porzione di memoria assegnatagli. Questo metodo comincia bene ma, prima o poi porta ad avere tanti piccoli buchi in memoria. Questo fenomeno è chiamato frammentazione esterna. Rilocazione Quando si usa lo schema i partizionamento fisso, si può ritenere che un processo sia sempre assegnato alla stessa partizione. In questo caso si può usare una tecnica di caricamento con rilocazione . Quando un processo è caricato in memoria tutti gli indirizzi relativi presenti nel codice, sono sostituiti dagli indirizzi assoluti della memoria principale, determinati dall’indirizzo base del processo caricato. Le locazioni ( delle istruzioni e dei dati) cui un processo fa riferimento non sono fisse, ma cambieranno ogni volta che un processo è caricato in memoria o spostato. Si distinguono diversi tipi di indirizzo: un indirizzo logico è un riferimento a una locazione di memoria indipendente dall’assegnazione attuale dei dati in memoria. Un indirizzo relativo è un caso particolare di indirizzo logico espresso in riferimento ad un punto conosciuto, solitamente l’inizio del programma. Un indirizzo fisico o indirizzo assoluto, è una locazione effettiva nella memoria principale. Utilizzando un caricamento dinamico dei processi a tempo di esecuzione è necessario utilizzare gli indirizzi relativi. Si utilizza a questo scopo un registro base . Registro base Indirizzo relativo Programma sommatore Indirizzo assoluto Dati Stack Immagine di processo nella memoria principale Swapping Un processo per poter essere eseguito deve essere presente nella memoria centrale, ma può essere temporaneamente scambiato (swapped) con un altro spostandolo dalla memoria centrale a una memoria secondaria per poi riportarlo nuovamente in memoria centrale. Ad esempio, supponiamo di essere in un ambiente multiprogrammabile con un algoritmo di schedulazione della CPU roundrobin. Quando terminerà il quanto di tempo di un processo, il gestore della memoria centrale comincerà ad eliminare tale processo e caricherà un altro processo sfruttando lo spazio di memoria centrale che è stato liberato. Questa tecnica è detta swapping. Il tempo del cambiamento di contesto in tale scambio è piuttosto alto. Supponiamo che il processo abbia le dimensioni di 1 MB e venga utilizzato un disco rigido dotato di una velocità di trasferimento di 5 MB al secondo. sistema operativo scaricamento processo P1 processo P2 caricamento Spazio utente Il trasferimento del processo di 1 MB da o nella memoria centrale impiega: 1000 KB / 5000 KB al secondo = 1/5 secondo = 200 millisecondi Supponendo che vi sia uno stato latente medio di 8 millisecondi, il tempo di swap è di 208 ms. Poiché si deve eseguire lo swap due volte, una per l’ingresso e una per l’uscita dalla memoria centrale, il tempo totale è di 416 ms. Paginazione La paginazione è uno schema di gestione della memoria che consente allo spazio di indirizzi fisici di essere non contiguo. Il metodo prevede la suddivisione della memoria fisica in blocchi di dimensione fissa chiamati frame ( o pagine fisiche) e il frazionamento della memoria logica in blocchi delle stesse dimensioni chiamate pagine ( o pagine logiche). Quando deve essere eseguito un processo, le sue pagine sono caricate in tutti i frame di memoria centrale disponibili. f CPU indirizzo logico indirizzo fisico d P d f Tabella delle pagine d memoria fisica La dimensione della pagina logica ( uguale alla dimensione della pagina fisica) è definita dall’hardware. La dimensione di una pagina è tipicamente una potenza di 2 e varia da 512 byte in su a seconda dell’architettura del computer. La scelta di una potenza di 2 come dimensione della pagina rende particolarmente facile la traduzione di un indirizzo logico in un numero di pagina e nello piazzamento nella pagina: se la dimensione di un indirizzo logico è 2m e la dimensione della pagina è 2n (byte o parole) con m>n, allora i bit di ordine più basso indicano lo piazzamento nella pagina. Numero di pagina P m-n bit Spiazzamento nella pagina d n bit Se si usa la paginazione non si ha frammentazione esterna. Si può avere una certa frammentazione interna in quanto, quasi sicuramente, l’ultima pagina di un processo non sarà completamente utlizzata. Un aspetto importante della paginazione è la chiara separazione tra la visione della memoria centrale da parte dell’utente e la memoria fisica attuale. L’utente vede la memoria centrale come un unico singolo spazio, contenente soltanto il programma, ma in realtà il programma è sparpagliato nella memoria fisica, che contiene anche altri programmi. Gli indirizzi logici sono tradotti in indirizzi fisici, con una trasformazione che è nascosta all’utente ed è controllata dal sistema operativo. Il sistema operativo deve essere al corrente di quali frame sono allocati, quali sono disponibili, quanti sono i frame totali. Queste informazioni sono mantenute generalmente in una struttura dati chiamata tabella dei frame. La tabella dei frame ha un elemento per ogni frame, che indica se questo è libero o allocato, a quale pagina di quale processo. Il sistema operativo mantiene, per ogni processo , una copia della tabella delle pagine per tradurre gli indirizzi. La paginazione di conseguenza aumenta il tempo di cambiamento di contesto. Supporto hardware alla paginazione L’implemetazione hardware della tabella delle pagine avviene nel caso più semplice come gruppo di registri dedicati. Il DEC PDP-11 è un esempio di tale architettura: l’indirizzo è a 16 bit e il formato della pagina 8 Kbyte. La tabella delle pagine consiste in otto elementi conservati in registri veloci. La maggior parte dei computer odierni, tuttavia permette che la tabella sia molto grande ( ad esempio un milione di elementi. La tabella è mantenuta in memoria centrale e il registro base della tabella delle pagine punta alla tabella. Con questo metodo il problema risulta essere il tempo richiesto per accedere a una locazione di memoria centrale. La soluzione standard a questo problema consiste nell’usare una speciale, piccola cache hardware per l’indicizzazione veloce detta memoria associativa TLB (Translation LookAside Buffer). Potrebbero occorrere 20 nanosecondi per cercare nella TLB e 100 nanonesondi per accedere alla memoria centrale. indirizzo logico CPU p d n° pagina n° frame TLB hit f TLB d indirizzo fisico p TLB miss f memoria fisica tabella delle pagine