logo
  • userLoginStatus

Welcome

Our website is made possible by displaying online advertisements to our visitors.
Please disable your ad blocker to continue.

Current View

Architettura degli elaborati e sistemi operativi - informatica

Memoria

Divided by topic

Memoria La gestione della memoria si occupa di allocare la memoria fisica ai processi che ne fanno richiesta. Nessun processo può diventare attivo prima di avere ottenuto un certo quantitativo di memoria . L’utilizzo globale delle risorse e tutte le altre prestazioni di un calcolatore vengono influenzate dalle prestazioni del modulo di gestio ne della memoria , sia in funzione della sua efficienza nell ’allocare memoria, sia per l’influenza che può avere sullo scheduler. Un buon gestore di memoria in un ambiente mutliprogrammato deve garantire la protezi one dei dati, impedendo ai processi attivi di sconfinare nello spazio di indirizzamento di altri processi, e permettere allo stesso tempo la loro condivisione affinché i processi cooperanti possano accedere ad aree comuni di memoria . I moduli di gestione della memoria si differenziano in base al tipo di allocazione della stessa, che può essere: contigua o non contigua . Allocazione contigua La memoria viene allocata in modo tale che ciascun oggetto occupa un insieme di locazioni i cui indirizzi sono strettamente consecutivi. Esistono vari tipi di allocazione contigua: • Monoallocazione • Partizionamento statico • Partizionamento dinamico • Segmentazione La MONOALLOCAZIONE è lo schema più semplice per la gestione della memoria che viene suddivisa in due aree contigue: • La prima allocata permanentemente ad una porzione residente del sistema operativo • La seconda assegnata ai processi in esecuzione, processi utente o porzioni non residenti del sistema operativo, per il tempo necessario al completamento Il sistema operativo compie diverse funzioni : • Tiene traccia solo della prima e dell’ultima locazione disponibile per i processi transienti • Viene posto ad uno dei due estremi della memoria • Ingloba i vettori di interrupt • Altri suoi moduli temporanei vengono posti all’a ltra estremità della memoria Alla richiesta di esecuzione di un programma , il sistema operativo si assicura che le dimensioni del processo siano compatibili con la memoria disponibile , conferisce il controllo al processo utente fino al suo completamento o ad eventuali condizioni di errore, al termine del processo la memoria viene liberata e può essere assegnata ad un altro processo in attesa . Raramente un monitor monoprocesso supporta meccanismi di protezione tra processi utente in quanto in ogni istante vi può essere al massimo un solo processo residente in memoria. Gli eventuali meccanismi si riferiscono alla protezione del codice del sistema operativo da eventuali sconfinamenti del processo transiente in esecuzione. La protezione del sistema operativo dai processi utente è spesso effettuata mediante supporti hardware come: • Registri barriera • Diritti di accesso mediante bit di protezione • Sistema operativo in memoria a solo lettura I registri barriera sono usati per tracciare un confine tra aree dei processi di sistema e dei processi transienti. Nel registro viene memorizzata la prima locazione disponibile al processo e il sistema operativo effettua i controlli di sconfinamento. Questo metodo richiede la capacità di distinguere l’esecuzione del sistema operativo da quella dei processi utente definendo gli stati utente e supervisore. Un altro metodo per progettare la memoria consiste nel memorizzare i diritti di accesso , mediante bit di protezione, nella memoria stessa. Ad ogni parola di memoria viene associato un bit di protezione che viene posto a 1 nelle zone che conte ng ono il sistema operativo e a 0 nelle restanti. I processi utente accedono solo a parole con bit 0, mentre il sistema operativo ha accesso illimitato. Un modo semplice e diffuso per proteggere il codice del sistema operativo dai programmi utente consiste nel porre il s istema oper ativo in memoria a sola lettura . Questo sistema non è solitamente utilizzato per la sua scarsa flessibilità e impossibilità di correggere o aggiornare il codice del siste ma operativo. La condivisione del codice e dei da ti in memoria non ha molto senso negli ambienti monoprocesso e raramente viene supportata dai relativi monitor. I programmi utente potrebbero passarsi dei dati, mediante accordi interni, ponendoli in locazioni di memoria che non vengono sovrascritte durante l’esecuzione di processi partecipanti, o mediante file. Quindi in monoallocazione la mancanza di supporti per la multiprogrammazione produce u n abbassamento dell’efficienza sia della memoria che della CPU , la memoria può risultare sovradimensionata per la maggioranza dei processi , processi di dimensione più grande della memoria non possono essere eseguiti, oppure richiedono particolari suddivisioni del codice , i programmi tendono ad essere ottimizzati rispetto alla dimensione comportando spesso sacrifici di funzionalità e velocità. Alcuni pregi della monoallocaz ione sono: basso costo di progettazione del modulo della gestione della memoria, contenuti e supporti hardware specifici per la gestione della memoria. Il PARTIZIONAMENTO STATICO è un metodo per supportare la multiprogrammazione e consiste nel dividere la memoria in diverse partizioni, ciascuna delle quali può essere allocata in diverse partizioni, ciascuna delle quali può essere allocata a un processo diverso. Il partizionamento statico implica che la suddivisione della memoria venga fatta fuori linea e che da quel momento le partizioni rimangono di dimensioni fisse. Il numero e la dimensione di ciascuna partizione vengono determinati durante la generazione del sistema considerando : • Capacità della memoria fisica disponibile • Grado desiderato di multiprogrammazione • Dimensione dei processi più frequentemente ese guiti Il sistema operativo deve tener traccia delle partizioni definite. Lo stato corrente delle partizioni ed i loro attributi vengono raccolti in una struttura dati chiamata tabella di descrizioni delle partizioni (TDP). L’unico campo variabile della TDP è lo stato della partizione che indica se la partizione è allocata o no. Gli altri campi contengono valori definiti al momento del partizionamento. Quando un processo non residente deve essere creato o attivato, il sistema operativo tenta di allocare una partizione di memoria libera di dimensioni suf ficienti pe r contenerlo , consultando la TDP. Se il risultato è positivo, il campo stato della partizione viene impostato ad allocata e l’immagine del processo viene caricata nella corrispondente partizione. Quando il processo termina è necessario effettuare uno swapping della memoria. Questa informazione verrà utilizzata per aggiorna re la partizione associata al valore libera. I metodi più comuni per la ricerca di una partizione libera sono: • First fit : consiste nell’allocare la prima partizione libera sufficientemente larga per contenere il processo • Best fit: consiste nell’allocare la più piccola delle partizioni libere che contenga il processo Il metodo first fit è il più veloce in esecuzione poiché si arresta, nella ricerca, alla prima partizione libera disponibile, mentre il metodo best fit deve controllare, prima di arrestarsi, tutte le partizioni libere disponibili per individuarne la migliore. Il metodo be st fit tuttavia è più accurato in esecuzione e quindi può raggiun gere un miglior utilizzo della memoria, rispetto al metodo first fit, riducendo al minimo la differenza di dimensione tra il processo e la partizione allocata. Quan do però il numero delle partiz ioni è molto grande nessuno dei due metodi si rivela particolarmente adatto. Le cause di mancata disponibilità di una partizione sono: 1. Non vi sono partizioni di memoria sufficientemente grandi pe r contenere il processo entrante 2. Tutte le partizioni sono allocate 3. Alcune partizioni sono libere ma nessuna di esse è sufficientemente grande Il primo caso è dovuto a un errore di scelta della dimensione delle partizioni o a un processo eccezionalmente più grande della norma. Si può r idefinire la dimensione delle partizioni o dividere il programma in origine in più sottoprogrammi. Il secondo caso si può risolvere mediante l’attesa di una partizione libera o mediante lo sw apping di un processo. Le stesse soluzioni si possono adottare per il caso 3. Nel caso 3 l’assegnazione di partizione può continuare: • Vengono allocate partizioni a processi più piccoli • L’utilizzo della memoria viene mantenuto più elevato • Si può violare l’ordinamento di attivazione dei processi dallo scheduler modificando le prestazioni del sistema Il funzionamento del gestore della memoria e dello scheduler sono strettamente correlati: • Lo scheduler determina quali processi sono pronti e quindi residenti nella memoria in attesa della CPU • Il gestore della memoria può decidere di sfrattare un processo in memoria per liberare una partizione Lo swapping è l’operazione di rimozione dalla memoria di un processo sospeso ed il suo successivo caricamento . Nel partizionamento statico questo aumento il livello di occupazione centrale e conseguentemente il livello di utilizzo della CPU . Quando lo scheduler decide l’introduzione in memoria di un nuovo processo il gestore dello swapping ne sceglie uno da rimuovere in base a : • Dimensione della partizione richiesta • Priorità del processo • Tipo di evento atteso dal processo • Tempo trascorso in memoria Un processo residente in memoria già parzialmente eseguito è costituito da: • Codice eseguibile • Dati finora elaborati • Stack • Registri di stato • File aperti • Descrittore del processo Al momento dello swapping questi oggetti vengono registrati in u n file su hard disk detto file di swapping. Tutti i processi che hanno subito uno swapping possono essere mantenuti in un file unico per tutto il sistema o in file separati, ciascuno associato ad un singolo processo . Un file di swapping di sistema viene soli tamente creato al momento dell’inizializzazione del sistema e collocato su una periferica veloce di memorizzazione secondaria. L’indirizzo e la dimensione di tale file sono solitamente stati ci in modo da beneficiare di un indirizzamento diretto su disco. Un parametro critico per la realizzazione di un file di swapping è la dimensione: se troppo grande spreca spazio su dischi veloci, se troppo piccolo può rendere indispensabile l’operazione di swapping. L’alternativa è disporre di un file di swapping per ciascun processo presente nel sistema che po' essere creato dinamicamente al momento della creazione del processo o staticamente al momento della preparazione del programma. Uno swapping efficiente richiede che i processi siano riallocabili dinamicamente : • Il processo può iniziare l’esecuzione in qualunque are a di memoria • Può essere spostato in un’altra area di memoria • Il calcolo degli indirizzi viene effettuato dinamicamente ad esempio con l’uso di un registro base Processi non rilocabili dinamicamente sono legati alle partizioni in cui iniziano l’esecuzione e rendono inefficiente lo swapping. In linea di principio lo swapping va utilizzato solo in casi di necessità poiché la CPU spreca un tempo elevato nelle operazioni di trasferimento . L’integrità di un sistema mutliprogrammato dipende anche dalla sua capacità di garantire l’isolamento tra spazi di indirizzi separati. Non solo si deve proteggere i l sistema operativo dai processi utente ma bisogna anche proteggere i processi utente tra di loro perché nessuno possa invadere lo spazio riservato all’altro . Un supporto di protezione efficace non può prescindere dall’ esistenza di un supporto hardware. Nei sistemi che utilizzano per la rilocazione i registri base, vengono di solito us ati dei registri limite per la protezione. Il compito base di un registro limite consiste nell’individuare i tentativi di accesso otre i limiti dello spazio di indirizzamento assegnato al programma in esecuzione dal sistema operativo. Il registro limite contiene solitamente il valore dell’indirizzo virtuale più alto dal programma. Ad ogni accesso alla memoria la CPU controlla che il programma non richieda indirizzi oltre il limite. Le violazioni vengono rilevate e riferite al sistema operativo che le gestisc e. L’indirizzo più basso del processo è contenuto nel registro base. Un buon sistema di gestione della memoria deve occuparsi anche della condivisione controllata di dati e codice tra processi cooperanti. I sistemi a partizioni fisse non sono adatti alla condi visione poiché basano i propri meccanismi sull’isolamento degli spazi di indirizzamento . Alcuni metodi di condivisione sono: 1. Affidare gli oggetti condivisi al sistema operativo che così è in grado di accedere a tutte le risorse. Gli svantaggi sono che l’area del sistema operativo dovrebbe poter variare dinamicamente e la routine dei processi utente devono poter essere linkate al sistema operativo dinamicamente . 2. Ogni processo possiede una copia identica dell’oggetto condiviso, che usa e diffonde gli aggiornamenti. Lo svantaggio di questa tecnica consiste nel fatto che se il sistema supporta lo swapping, uno o più processi potrebbero non essere in memoria e quindi non essere pronti a ricevere gli aggiornamenti 3. Collocare i dati i una partizione comune dedicata . In ques to caso però, il sistema operativo considera come violazione i tentativi dei processi partecipanti alla condivisione di accedere a zone di memoria esterne alle rispettive partizioni. Se il sistema usa registri base e limite sono necessari accorgimenti per indirizzare partizioni che potrebbero non essere contigue. Nel PARTIZIONAMENTO DINAMICO il sistema delle partizioni è analogo a quello del partizionamento statico. Il gestore della memoria crea e assegna partizioni di dime nsione variabile dinamicamente in base alle richieste dei processi. Quando un processo termina o subisce uno swapping, il gestore della memoria restituisce lo spazio liberato all’insieme di aree di memoria libere. Il gestore di memoria può creare e allocar e parti zioni finch é non viene esaurita la memoria fisica o finché non viene raggiunto il massimo grado di multiprogrammazione. Alla richiesta di una partizione il gestore della memoria (GM) ricerca una zona di memoria libera contigua di dimensione sufficiente. Se si trova un’area adatta il sistema operativo vi ricava una partizione in modo da soddisfare esattamente le necessità del processo. L’eventuale parte rimanente di memoria libera viene restituita all’insieme della memoria libera e posta a disposizione del modulo di allocazione. La partizione viene creata registrando la sua base, la sua dimensione e il suo stato nella TDP o in una tabella equivalente. Alcune di queste informazioni vengono anche registrate nel descrittore di processo. Dopo aver car icato l’immagine del processo nella partizione creata , il processo in oggetto viene sottoposto al controllo di un modulo del sistema operativo che si occupa delle operazioni successive. Quando un processo termina o subisce uno swapping , il sistema operativo restituisce la partizione all’area libera e cancella la riga corrispondente nella TDP. L’insieme del le aree libere varia dinamicamente, gli spazi interni all’area libera vengono utilizzati per mantenere una lista a puntatori. Gli algoritmi più comuni per selez ionare un’aria di memoria all’interno della quale creare una partizione sono: • First -fit e la sua variante next -fit • Best -fit • Worst -fit Il metodo first -fit termina la ricerca quando viene individuato il primo blocco di memoria sufficientemente grande da contenere il processo. Il metodo next -fit il puntatore alla lista delle aree libere, dopo avere effettuato un’allocazione , viene salvato cosicché la ricerca successiva continua da dove si era fermata la precedente. Il metodo best -fit alloca il blocco di memoria libero più piccolo che può contenere il processo. Il metodo worst -fit alloca il blocco di memoria libero più grande le cui dimensioni superino quelle della partizione richiesta. Lo schema di partizionamento dinamico genera buchi di memoria inutilizzabili . Per questo motivo può anche diventare impossibile l’allocazione di memoria richiesta da un processo, pur contenendo la memoria globalmente un’area di dimensione sufficiente. Questo fenomeno si chiama frammentazione esterna. Quando la frammentazione raggiunge un grado elevato è necessario effettuare la compattazione della memoria che consiste nello spostare i processi residenti in memoria in modo da creare partizioni libere più gra ndi. Questa operazione generalmente richiede un grande costo di CPU . La compattazione può essere effettuata : 1. Continuamente: • La memoria viene compattata ogni volta che un processo libera un’area • La frammentazione è ridotta al minimo • Questa operazione ha un grande costo di CPU 2. Su necessità: • La compattazione viene effettuata quando non si riesce ad allocare memoria ad un processo richiedente • Un controllo preliminare verifica se il totale dell’area liberale è sufficiente a contenere il processo Inoltre la compattazione può essere effettuata in diversi modi: 1. Spostamento selettivo incrementale: • Ricerca di una strategia ottima di movimento per compattare al meglio la memoria • Consente di risparmiare tempo negli spostamenti • Poco utilizzata perché richiede un sovraccarico notevole 2. Spostamento globale: • Tute le partizioni vengono rilocate ad uno dei due estremi della memoria • Il tempo di trasferimento delle partizioni non è ottimizzabile • Non richiede strategie particolari Le tecniche di protezione e condivisione son o analoghe a quelle del partizionamento statico, considerato che il supporto hardware è simile. Nel partizionamento dinamico è possibile una particolare forma di condivisione: • A due partizioni contigue è consentito sovrapporsi, mettendo un’area in comune • Questa forma di condivisione è molto restrittiva, in quanto, può avvenire solo tra due processi La SEGMENTAZIONE è uno schema di gestione della memoria che si basa sulla divisione dello spazio di indirizzamento dei processi in entità logiche che possono essere poste in aree non contigue di memoria. La segmentazione fornisce strumenti per la rilocazione dinamica, la protezione e la condivisione. La frammentazione esterna può essere ridotta se la dimensione delle aree richieste è più piccola. Un programma eseguibile può essere suddiviso, ad esempio , in codice, dati e stack ; ciascuno di questi può essere posto in un segmento diverso di dimensioni differenti. La segmentazione condivide alcune proprietà: • Dagli schemi di allocazione contigua relativamente ad un singolo segmento, poiché i dati di ogni singola entità logica devono essere posti in un’area contigua di memoria • Dagli schemi di allocazione no n contigua relativamente all’intero spazio di indirizzamento del processo, poiché blocchi logici diversi possono essere messi in segmenti non contigui La raccolta degli ogge tti in segmenti viene predisposta dal programmatore, ci ascun segmento in izia all’indirizzo virtuale zero, ogni segmento ha un nome che viene poi tradotto in un indirizzo in fase di caricamen to in memoria, un singolo dato all’interno del segmento viene identificato dallo spiazzamento relativo all’indiriz zo del segmento cui appartiene . L’indirizzo nella segmentazione è di tipo bidimensionale, infatti la designazione univoca di un dato o di un’istruzione richiede il nome del segmento e lo spiazzamento all’interno del segmento. La memoria fisica mantiene l’indiriz zo lineare per cui è necessario un meccanismo per la traduzione degli indirizzi bidimensionali di segmenti virtuali in indirizzi fisi ci. Il caricamento di un processo segmentato avviene nel seguente modo: • Il S.O. cerca di allocare n partizioni per adatte per gli n segmenti in cui è diviso il processo • Il S.O. crea un descrittore di segmento registrandovi l’indirizzo fisico in cui è stato posto il segmento e la sua dimensione • L’insieme dei descrittori di segmento di un processo viene raccolto nella tabella dei descrittori di segmento La traduzione dell’indirizzo avviene nel seguente modo: • L’indirizzo bidimensionale virtuale I (segment, displacement) è tradotto in modo equivalente al meccanismo del registro base • Il segment viene utilizzato per ritrovare l’indirizzo fisico del segmento nella TDS • Il displacement viene sommato all’indirizzo fisico del segmento per ottenere l’indirizzo fisico richiesto • La dimensione del segmento, riportata nella TDS, viene utilizzata anche per controllare eventuali violazioni Le dimensioni della TDS sono legate alle dimensioni dello spazio virtuale di indirizzamento di un processo. Essa viene tenuta in memoria, in uno dei segmenti associati al processo. Due registri hardware, RBTDS e RLTDS, contengono l’indirizzo di inizio e fine della TDS associata a processo . Ciò consente anche il controllo d’accesso a segmenti non assegnati al processo. Quando un processo subisce uno swapping , al ritorno in memoria va aggiornata la sua TDS. Generalmente si preferisce rigenerarla totalmente utilizzando la mappa statica fornita dal linker. L’eventuale compattazione richiede l’aggiornamento nella TDS delle righe relative ai segmenti spostati. La traduzione di ciascun indirizzo bidimensionale virtuale richiede due accessi in memoria: • Uno alla TDS per tradurre l’indirizzo del segmento virtuale a fisico • L’altro per accedere fisicamente alla locazione richiesta La segmentazione raddoppia il tempo per l’accesso ad una locazione di memoria. La forma più naturale di protezione per un sistema segmentato è l’uti lizzo di registri base e limite. La protezione tra spazi di indirizzamento di processi differenti è garantita dalla collocazione dei segmenti in aree disgiunte di memoria. Una caratteristica offerta dai sistemi segmentati consiste nel fornire un livello di protezione all’interno dello spazio di indirizzamento di un singolo processo. È possibile definire diritti e modalità di accesso per ogni tipo di segme nto che possono essere registrati i n un campo della TDS. La segmentazione offre una condivisione semplice e flessibile. Gli oggetti condivisi sono collocati in segmenti dedicati e separati. Il segmento condiviso può essere mappato, attraverso la TDS, nello spazio di indirizzamento virtuale di tutti i processi autorizzati ad accedervi. Lo spiazzamento interno di un dato risulta identico per tutti i processi autorizzati ad accedervi. Lo spiazzamento interno di un dato risulta identico per tutti i processi che lo condividono . Quando si applica L’ALLOCAZIONE NON CONTIGUA la memoria viene allocata in modo tale che un unico oggetto logico viene posto in aree separate e non adiacenti. Durante l’esecuzione di un processo viene eseguita la traduzione degli indirizzi per ristabilire la corrispondenza tra lo spazio virtuale di indirizzamento (contiguo) e gli indirizzi fisici . Vi sono due metodi attraverso i quali si implementa l’allocazione non contigua: la paginazione e la memoria virtuale. Quando si effettua la PAGINAZIONE la memoria fisica viene concettualmente suddivisa in pagine di dimensione fissa chiamate pagine fisiche. Anche lo spazio di indirizzamento d ei processi viene diviso in pagine virtuali della stessa dimensione delle pagine fisiche. Il meccanismo di traduzione fa corrispondere indirizzamenti all’interno di pagine virtuali ad indirizzamenti in pagine fisiche. Ogni pagina è mappata separatamente , per cui non è necessaria la contiguità delle pagine fisiche. Ogni indirizzo all’int erno di un processo è diviso in: • Bit più significativi che rappresenta il numero della pagina virtuale • Bit meno significativi che rappresentano lo spiazzamento reale Il sistema operativo tiene traccia della corrispondenza tra pagine virtuali e pagine fisiche mediante la tabella delle pagine (TDP) . La TDP viene costruita al momento del caricamento del processo, s della tabella contiene l’indirizzo di partenza della pagina fisica in cui è allocata la corrispondente pagina virtuale , la tabella è costituita da un numero di righe pari al numero di pagine occupate. La traduzione dell’indirizzo virtuale avviene nel seguente modo : 1. Un meccanismo hardware divide l’ indirizzo virtuale in: • 12 bit più significativi che rappresentano il numero della pagina • 8 bit meno significativi che rappresentano il displacement interno alla pagina 2. Il numero della pagina viene usato all’interno della TDP per ottenere il corrispondente indirizzo della pagina fisica 3. L’indirizzo ottenuto, concatenato con il displacement, fornisce l’indirizzo fisico cercato Il sistema operativo tiene traccia dello stato di tutte le pagine fisiche mediante la tabella di memoria (TDM ): • In ogni riga della TDM è indicato lo stato della relativa pagina • Il numero di righe della tabella è uguale al numero di pagine fisiche Quando un processo termina , subisce uno swapping: • Restituisce tutte le pagine fisiche ad esso assegnate • La sua TDP viene eliminata Quando il processo richiedente ha uno spazio di indirizzamento non multiplo della dimensione delle pagine fisiche si crea il fenomeno della frammentazione interna della pagina. Questo è comunque un fenomeno molto ridotto e legato alla dimensione della pagi na fisica . Particolare attenzione va posta nella scelta della tecnica di memorizzazione delle aree libere. La consultazione della TDM statica per trovare n pagine fisiche libere richiede una ricerca su un numero di righe in media x=n/q . q è la probabilità che una pagina sia libera e si lega alla percentuale di memoria libera u: q=u/100 0