Gestione della memoria n Introduzione n Swapping n Allocazione contigua n Paginazione Introduzione n In un sistema monoprogrammato la memoria centrale è divisa n n n n in due parti: una per il sistema operativo, l’altra per il programma che è in quel momento in esecuzione. In un sistema multiprogrammato, la parte “utente” deve essere ulteriormente suddivisa per ospitare processi multipli. Tale suddivisione è effettuata dinamicamente dal sistema operativo ed è detta gestione della memoria. Una gestione efficiente della memoria è vitale: se sono presenti in memoria solo pochi processi, per la maggior parte del tempo essi saranno in attesa di I/O. Affinché il processore sia sempre occupato, la memoria deve essere allocata efficientemente per immettervi il maggior numero di processi possibile. Associazione degli indirizzi n Un programma per essere eseguito deve essere caricato in memoria centrale e inserito all’interno di un processo; durante la sua esecuzione può essere trasferito dalla memoria al disco e viceversa. n Coda di input — collezione di processi su disco in attesa di essere caricati in memoria per essere eseguiti. n Un processo può risiedere in una qualsiasi parte della memoria fisica, e un processo non è detto che venga sempre caricato a partire dal primo indirizzo. n I programmi utente passano attraverso stati diversi prima di essere eseguiti e in questi vari stati la rappresentazione degli indirizzi può essere differente. Associazione degli indirizzi n L’associazione – binding – di istruzioni e dati a indirizzi di memoria può avvenire durante la fase di… F Compilazione: se la posizione in memoria del processo è nota a priori, può essere generato un codice assoluto; se la locazione iniziale cambia, è necessario ricompilare il codice; F Caricamento: se la posizione in memoria non è nota in fase di compilazione, è necessario generare codice rilocabile; F Esecuzione: se il processo può essere spostato a run–time da un segmento di memoria all’altro, il binding viene rimandato fino al momento dell’esecuzione. È necessario un opportuno supporto hardware per mappare gli indirizzi (ad esempio attraverso registri base e limite). Spazio di indirizzi logici e fisici n Il concetto di uno spazio di indirizzi logici nettamente distinto dallo spazio degli indirizzi fisici è centrale per la gestione della memoria. F Indirizzi logici — generati dalla CPU; chiamati altrimenti indirizzi virtuali. F Indirizzi fisici — indirizzi utilizzati nell’unità di memoria. n Gli indirizzi logici corrispondono agli indirizzi fisici negli schemi di binding in fase di compilazione e caricamento, mentre differiscono in quelli in fase di esecuzione. Memory–Management Unit (MMU) n Dispositivo hardware che mappa indirizzi virtuali su indirizzi fisici. n Nello schema MMU, il valore contenuto nel registro di rilocazione viene sommato ad ogni indirizzo generato dai processi utente nel momento stesso in cui l’indirizzo viene inviato alla memoria. n Il programma utente ragiona in termini di indirizzi virtuali, né mai è (deve essere) conscio della loro mappatura fisica. Rilocazione dinamica ottenuta tramite registro di rilocazione Caricamento dinamico n I sottoprogrammi non vengono caricati in memoria fino a quando non vengono richiamati. n Si ha un miglior impiego della memoria: sottoprogrammi non utilizzati non vengono mai caricati. n Utile quando si richiedono grandi quantità di codice per gestire situazioni che avvengono raramente (condizioni di eccezione). n Al SO non è richiesto alcun supporto speciale. Il caricamento dinamico viene implementato attraverso un opportuno progetto del software. Link dinamico delle librerie n Il linking viene rinviato fino al momento dell’esecuzione. n Questa caratteristica si usa soprattutto con le librerie di sistema, ad esempio quelle del linguaggio. n In questo modo si evita che gli tutti eseguibili dispongano di una copia delle procedure a cui fanno riferimento. n Porzioni di codice (dette stub) vengono impiegate per localizzare la routine appropriata nella libreria residente in memoria: lo stub viene rimpiazzato con l’indirizzo della routine. n Se le librerie caricate in memoria possono essere utilizzate da più processi (librerie condivise), il SO deve gestirne la condivisione. Overlay n Si mantengono in memoria solo istruzioni e dati necessari in un certo istante. Se occorrono altre istruzioni, vengono caricate nello spazio che era occupato dalle istruzioni che non vengono più utilizzate. n È richiesto quando un processo è più grande della memoria allocatagli. n L’esecuzione è rallentata a causa dell’operazione di I/O necessaria per caricare l’overlay. n Viene implementato dall’utente, non viene richiesto alcun supporto speciale da parte del SO. Il progetto di software con overlay è complesso. Overlay per un assemblatore a due passi Swapping n Un processo per essere eseguito deve trovarsi nella memoria centrale. ma può venir temporaneamente riversato (swapped ) nella memoria ausiliaria backing store da cui, in seguito, viene prelevato per proseguire l’esecuzione. n Backing store — È un disco veloce, sufficientemente capiente da accogliere copie di tutte le immagini di memoria per tutti gli utenti; deve garantire accesso diretto a tali immagini. Può essere una partizione dedicata del disco (pochi movimenti della testina). n Roll out, roll in — È una variante dello swapping impiegata per algoritmi di scheduling basati su priorità; un processo a priorità più bassa è riversato sulla memoria di massa, per permettere a un processo a maggior priorità di essere caricato ed eseguito. Swapping n Se l’associazione tra indirizzi logici e fisici della memoria è effettuata in fase di assemblaggio o caricamento, il processo non può essere caricato in posizioni differenti. n La maggior parte del tempo di swap è impiegata per il trasferimento di dati; il tempo totale di trasferimento è direttamente proporzionale alla quantità di memoria riversata. n Se il binding viene effettuato in fase d’esecuzione, il processo sottoposto a swapping può successivamente essere riversato in uno spazio di memoria diverso. n Molti SO attuali supportano lo swapping, ad esempio UNIX e MS Windows. Swapping Swapping di due processi utilizzando il disco come backing store Allocazione contigua n La memoria principale viene suddivisa in due partizioni: F La parte residente del SO è generalmente memorizzata nella memoria bassa, insieme al vettore degli interrupt. F I processi utente sono memorizzati nella memoria alta. n Allocazione con partizione singola F Si impiega uno schema basato su registri base e limite per proteggere programmi e dati del SO e per proteggere reciprocamente i programmi utente. F Il registro di rilocazione contiene il valore del più piccolo indirizzo fisico di memoria allocata al processo; il registro limite contiene l’intervallo degli indirizzi logici: ciascun indirizzo logico deve essere inferiore al valore del registro limite. Supporto hardware ai registri base e limite. Allocazione contigua n Allocazione con partizioni multiple F Nei primi SO si avevano partizioni di dimensioni fisse. F Un buco (hole) è un blocco di memoria disponibile; nella memoria sono sparsi buchi di varie dimensioni. F Quando viene caricato un nuovo processo, gli viene allocato un buco grande abbastanza da contenere il processo. F Il SO conserva informazioni su: a) Partizioni allocate b) Partizioni libere (buchi) SO SO SO SO processo 5 processo 5 processo 5 processo 5 processo 9 processo 9 processo 8 processo 2 processo 10 processo 2 processo 2 processo 2 Problemi di allocazione dinamica della memoria n Come soddisfare una richiesta di dimensione n a partire da un insieme di buchi? n In ogni momento è presente un insieme di buchi di diverse dimensioni sparsi per la memoria. F First–fit: Viene allocato il primo buco grande abbastanza. F Best–fit: Viene allocato il buco più piccolo capace di contenere il processo. È necessario scandire tutta la lista dei buchi. Si produce il più piccolo buco residuo. F Worst–fit: Viene allocato il buco più grande. È ancora necessario ricercare in tutta la lista. Si produce il più grande buco residuo. n First–fit e Best–fit sono mediamente migliori di Worst–fit, rispettivamente in termini di velocità e impiego di memoria. Frammentazione n Frammentazione esterna — È disponibile lo spazio totale per soddisfare una richiesta, ma non è contiguo. n Frammentazione interna — La memoria allocata può essere leggermente maggiore della memoria richiesta (pochi byte di differenza). La differenza di dimensioni è memoria interna ad una partizione che non viene impiegata. n Si può ridurre la frammentazione esterna con la compattazione F Si postano i contenuti della memoria per avere tutta la memoria libera contigua a formare un grande blocco. F La compattazione è possibile solo con la rilocazione dinamica e viene effettuata in fase d’esecuzione. F Si possono spostare tutti i processi verso un’estremità della memoria. Paginazione n Un’altra soluzione alla frammentazione esterna è ottenuta n n n n n n consentendo la non contiguità degli indirizzi fisici: allocazione della memoria fisica ai processi ovunque essa sia disponibile. Si divide la memoria fisica in blocchi di dimensione fissa chiamati frame (la dimensione è una potenza del 2, compresa fra 512 e 8192 byte). Si divide la memoria logica in blocchi della stessa dimensione chiamati pagine. Si tiene traccia di tutti i frame liberi. Per eseguire un programma di dimensione n pagine, è necessario trovare n frame liberi prima di caricare il programma. Si impiega una tabella delle pagine per tradurre gli indirizzi logici negli indirizzi fisici. Si ha solo frammentazione interna (relativa all’ultimo frame). Schema di traduzione degli indirizzi n L’indirizzo generato dalla CPU viene suddiviso in: F Numero di pagina ( p ) — impiegato come indice in una tabella di pagine che contiene l’indirizzo base di ciascuna pagina nella memoria fisica. F Offset nella pagina ( d ) — combinato con l’indirizzo base per definire l’indirizzo fisico di memoria che viene inviato all’unità di memoria. Supporto hardware alla traduzione degli indirizzi. Modello di paginazione n Il numero di pagina serve come indice per la tabella delle pagine. n Questa contiene l’indirizzo di base nella memoria fisica di ogni pagina. n L’indirizzo di base si appaia con lo scostamento di pagina per definire l’indirizzo della memoria fisica. Modello di paginazione di memoria logica e memoria fisica Dimensione delle pagine n La dimensione di una pagina, così come quella di un frame, è definita dall’architettura del calcolatore ed è tipicamente una potenza di 2 compresa tra 512 byte e 16 MB. n Le dimensioni sono potenza di 2 perché ciò facilita la traduzione degli logici in numero di pagina e scostamento. n Se lo spazio degli indirizzi logici è 2m e la dimensione di una pagina è 2n, allora: F gli m-n bit più significativi di un indirizzo logico indicano il numero di pagina, F gli n bit meno significativi indicano lo scostamento. numero di pagina scostamento di pagina p d m-n n Esempio di paginazione n Esempio: pagine di 4 byte e memoria fisica di 32 byte (8 pagine). n Indirizzo logico 0 è Pagina 0 + scostamento 0 F Pagina 0 è Blocco 5 F Indirizzo logico 0 è Indirizzo fisico 20 n Indirizzo logico 3 è Pagina 0 + scostamento 3 F Pagina 0 è Blocco 5 F Indirizzo logico 3 è Indirizzo fisico 23 n Indirizzo logico 4 è Pagina 1 + scostamento 0 F Pagina 1 è Blocco 6 F Indirizzo logico 4 è Indirizzo fisico 24 Esempio di paginazione per una memoria da 32 byte con pagine da 4 byte Paginazione vs rilocazione n La paginazione è una forma di rilocazione dinamica: ad ogni n n n n indirizzo logico l’architettura di paginazione fa corrispondere un indirizzo fisico. Ciascuna riga della tabella delle pagine è analoga ad un registro di rilocazione. Con la paginazione si evita la frammentazione esterna, ma non la paginazione interna, che mediamente è pari alla metà di un blocco. Blocchi piccoli diminuiscono la frammentazione interna, blocchi grandi facilitano il trasferimento dalla memoria secondaria. Alcune CPU e kernel permettono l’utilizzo di pagine di dimensione variabile (Solaris) Esempi di paginazione Frame liberi Prima dell’allocazione Dopo l’allocazione Tabella dei blocchi di memoria n Nella paginazione vi è una netta differenza tra memoria fisica e memoria logica: per il programma utente la memoria è un unico spazio contiguo. n In realtà il programma è sparso nella memoria fisica, che contiene anche altri programmi. n La differenza tra memoria fisica e memoria logica è contenuta nell’architettura di traduzione degli indirizzi, che fa corrispondere indirizzi fisici e logici. n Queste operazioni sono controllate dal sistema operativo, che mantiene le informazioni sull’assegnazione in una tabella dei blocchi di memoria.