La memoria principale costituisce, insieme alla CPU, una delle risorse necessarie per fornire il supporto al concetto di processo.
Infatti, per realizzare l’astrazione di processo, o programma in esecuzione, è necessario disporre:
Supporto Hardware per la gestione della memoria (MMU).
Organizzazione logica della memoria virtuale (segmentata o contigua).
Organizzazione fisica (allocazione del processo in zone contigue o in zone non contigue).
Dimensione della memoria virtuale (dimensione dell’immagine di un processo maggiore della dimensione fisica della memoria).
Rilocazione
Allocazione
Organizzazione dello spazio virtuale
Caricamento
Generalmente, l’associazione di istruzioni e dati a indirizzi di memoria si può compiere nelle seguenti fasi:
Uno dei principali motivi che rende necessaria la rilocazione dinamica è lo swapping.
Un processo può essere trasferito temporaneamente nella memoria ausiliaria (backing store) e poi riportato nella memoria centrale al momento di riprenderne l’esecuzione.
Ciò al fine di far convivere nel sistema più processi la cui somma delle immagini eccede la memoria disponibile.
Roll out, roll in: variante impiegata per gli algoritmi di scheduling basati sulle priorità: il processo con priorità inferiore viene scaricato dalla memoria centrale.
La maggior parte del tempo di swapping è data dal tempo di trasferimento. Il tempo di trasferimento totale è direttamente proporzionale alla quantità di memoria interessata
Il concetto di spazio degli indirizzi logici associato a uno spazio degli indirizzi fisici separato è fondamentale per una corretta gestione della memoria.
Il metodo di associazione degli indirizzi nella fase di compilazione produce indirizzi logici e fisici identici.
Nell’associazione in fase di caricamento, invece, gli indirizzi logici vengono completamente rimpiazzati da quelli fisici.
Infine, nell’associazione nella fase d’esecuzione gli indirizzi logici non coincidono con gli indirizzi fisici.
Dispositivo (hardware) per l’associazione, nella fase di esecuzione, degli indirizzi logici agli indirizzi fisici.
Nello schema MMU (Memory Management Unit), quando un processo utente genera un indirizzo, prima dell’invio all’unità di memoria, si somma a tale indirizzo il valore contenuto nel registro di rilocazione.
Il programma utente tratta con gli indirizzi logici; non considera mai gli indirizzi fisici reali.
L’immagine di un processo può essere allocata in memoria fisica secondo due modalità:
La memoria centrale si divide di solito in due partizioni:
Protezione della memoria
Lo schema a registro di rilocazione viene usato per proteggere il sistema operativo dai processi utenti e i processi utenti dagli altri processi utenti.
Il registro di rilocazione contiene il valore dell’indirizzo fisico minore; il registro di limite contiene l’intervallo di indirizzi logici (ciascun indirizzo logico deve essere minore del contenuto del registro di limite).
Assegnazione su più partizioni
Hole (buco): blocco di memoria disponibile; ve ne sono di varie dimensioni, sparsi all’interno della memoria.
Quando si carica un processo che necessita di memoria, occorre cercare un hole sufficientemente grande da contenerlo.
Il sistema operativo tiene traccia di:
a) partizioni assegnate;
b) partizioni libere (hole).
Come soddisfare una richiesta di dimensione n data una lista di buchi liberi.
First-fit: si assegna il primo hole abbastanza grande.
Best-fit: si assegna l’hole più piccolo in grado di contenere il processo; occorre compiere la ricerca su tutta la lista, sempre che non sia ordinata per domensione. Produce le hole inutilizzate più piccole, ed è pertanto noto come best-fit.
Worst-fit: si assegna il hole più grande; anche in questo caso occorre esaminare tutta la lista. Produce le hole inutilizzate più grandi.
First-fit e best-fit funzionano meglio di worst-fit poiché rendono più efficienti l’utilizzo della memoria.
Frammentazione esterna: Spazio di memoria perduto sotto forma di spezzoni:
Frammentazione interna: Spazio di memoria perduto perché assegnato ma non utilizzato:
Una soluzione al problema della frammentazione esterna è data dalla compattazione:
Un aspetto importante della gestione della memoria è quello della separazione tra la visione della memoria dell’utente (spazio virtuale) e l’effettiva memoria fisica.
Lo spazio virtuale può essere visto come:
La segmentazione consiste nell’allocare segmenti indipendenti in zone di memoria fisica non contigue.
Tale tecnica consente di aumentare la complessità del linker.
Per ogni indirizzo virtuale x deve essere possibile capire a quale segmento esso appartiene ... nel caso più semplice la MMU deve avere tre coppie RB/RL
Negli attuali sistemi il linker crea lo spazio virtuale riservando un diverso segmento per ciascun modulo di programma.
In questo modo lo spazio virtuale ricalcherà fedelmente la struttura del programma!
La segmentazione evita la frammentazione interna, ma introduce quella esterna.
Il passaggio da tre soli segmenti ad un numero arbitrario implica che:
Al descrittore di un processo vengono aggiunti due campi:
Quando il processo è schedulato i valori precedenti vengono caricati in due appositi registri di macchina:
Il ricorso alla tabella dei segmenti allocata in memoria principale genera una notevole perdita di efficienza:
Al fine di ridurre questa perdita di efficienza vengono mantenuti nella MMU alcuni registri associativi.
Lookup associativo = ε unità di tempo.
Si assuma un tempo d’accesso alla memoria pari a k
Tasso di successi (hit ratio): percentuale di volte che un numero di pagina si trova nei registri associativi
Tasso di successi = α
Tempo effettivo d’accesso (EAT, effective access time)
EAT = (k + ε) α + (2k + ε)(1 – α) = (2 – α)k + ε
La località dei programmi aiuta a migliorare l’efficienza!
Aggiunta di un terzo campo di controllo nel quale sono presenti alcuni bit che rappresentano i diritti di accesso al segmento
Metodo di gestione della memoria che permette che lo spazio degli indirizzi fisici di un processo non sia contiguo.
Suddivide la memoria fisica in blocchi di memoria di dimensioni fisse (noti anche come pagine fisiche o frame). La dimensione di una pagina è tipicamente una potenza di 2, compresa tra 512 byte e 16 MB.
Tiene traccia di tutti i blocchi liberi.
Utilizza una tabella delle pagine per tradurre gli indirizzi logici in indirizzi fisici.
Può evitare la frammentazione esterna, ma introduce frammentazione interna.
Ogni indirizzo generato dalla CPU è diviso in:
La tabella delle pagine è mantenuta nella memoria principale.
Un registro di base della tabella delle pagine (page-table base register, PTBR) punta alla tabella stessa.
Un registro di lunghezza della tabella delle pagine (page-table length register, PRLR) indica la dimensione della tabella delle pagine.
Con questo metodo, per accedere a un byte occorrono due accessi alla memoria, uno per l’elemento della tabella delle pagine e uno per il byte stesso.
La soluzione tipica a questo problema consiste nell’impiego di una speciale, piccola cache di memoria veloce detta TLB (translation look-aside buffer), una memoria associativa ad alta velocità.
Traduzione dell’indirizzo (A´, A´´)
Se A´ è presente nel TLB, il corrispondente numero di blocco di memoria è immediatamente disponibile e si usa per accedere alla memoria.
Se A´ non è presente si deve consultare la tabella delle pagine nella memoria.
Lookup associativo = ε unità di tempo.
Si assuma un tempo d’accesso alla memoria pari a k.
Tasso di successi (hit ratio): percentuale di volte che un numero di pagina si trova nel TLB; relativo al numero di registri associativi.
Tasso di successi = α
Tempo effettivo d’accesso (EAT, effective access time)
EAT = (k + ε) α + (2k + ε)(1 – α) = (2 – α)k + ε
In un ambiente paginato, la protezione della memoria è assicurata dai bit di protezione associati a ogni blocco di memoria.
Di solito si associa un bit di validità a ciascun elemento della tabella delle pagine:
Spazio d’indirizzamento=32 bit.
Dimensione delle pagine di 1KBbyte (210)
Dimensione delle pagine di 64Kbyte (216)
Bisogna cercare un buon compromesso tra i due valori
Suddivide la tabella delle pagine in parti più piccole, secondo una organizzazione gerarchica.
Un metodo consiste nell’adottare un algoritmo di paginazione a due livelli, nel quale si pagina la stessa tabella delle pagine.
Un indirizzo logico (su una macchina a 32 bit con dimensione delle pagine di 4K) è suddiviso in:
Paginando la tabella delle pagine, anche il numero di pagina è a sua volta diviso in:
Quindi, l’indirizzo logico è:
dove pi è un indice della tabella esterna delle pagine, e p2 è lo scostamento all’interno della pagina indicata dalla tabella esterna delle pagine.
Comune negli spazi d’indirizzi relativi ad architetture > 32 bit.
L’argomento della funzione di hash è il numero della pagina virtuale. Ogni elemento della tabella hash contiene una lista concatenata di elementi che la funzione hash fa corrispondere alla stessa locazione.
I numeri di pagina virtuali vengono confrontati e, se coincidono, si usa l’indirizzo del relativo blocco di memoria per generare l’indirizzo fisico desiderato.
Generalmente ogni tabella delle pagine contiene un elemento per ogni pagina virtuale, ed esiste una tabella per ogni processo.
Tabella delle pagine invertita
Codice condiviso
Codice privato e dati
1. Introduzione ai Sistemi Operativi
5. Scheduling nei sistemi mono-processore
6. Threads, SMP
8. Scheduling Multiprocessore e Real-Time
9. Gestione dei processi nei sistemi operativi Unix/Linux e Window...
10. Introduzione alla Programmazione Concorrente
11. Sincronizzazione nel modello ad ambiente globale
12. Problemi di cooperazione nel modello ad ambiente globale
14. Sincronizzazione nel modello ad ambiente locale
15. Deadlock
16. Programmazione Multithread
18. Memoria Virtuale
20. Il File System
21. Primitive di sincronizzazione nel kernel Linux
22. Esercitazione: System call per la gestione dei processi
23. Esercitazione: Inteprocess Communication e Shared Memory
24. Esercitazione: System Call per la gestione dei semafori in Linu...
25. Esercitazione: Problema dei Produttori e dei Consumatori
26. Posix Threads
P. Ancilotti, M. Boari, A. Ciampolini, G. Lipari, “Sistemi Operativi”, Mc-Graw-Hill (Cap. 4)
A. Silberschatz, Galvin, G. Gagne, "Sistemi Operativi" Addison-Wesley (Capitolo 8)