Sei sulla pagina 1di 17

MEMORIA VIRTUALE

Il termine memoria virtuale si riferisce alla separazione della memoria logica, vista
dallutente, dalla memoria fisica. Solo parte del programma deve essere in memoria
per lesecuzione. Lo spazio degli indirizzi logici pu essere maggiore dello spazio degli
indirizzi fisici. La memoria virtuale consente anche un miglioramento delle prestazioni
durante la creazione dei processi: quando creo un processo carico solo, per esempio,
la pagina che contiene il main.
La memoria virtuale si realizza nella forma di paginazione su richiesta o
segmentazione su richiesta.

OSS: Un altro vantaggio il consentire il parallelismo alla macchina: alloco per ogni
processo uno spazio (fino a un certo limite).

1.1 PAGINAZIONE SU RICHIESTA


Non si carica mai nella memoria una pagina non necessaria. Ci comporta minor
tempo di caricamento e minor tempo di swap (devo portare un minor numero di
pagine). Inoltre, c minore quantit di memoria fisica, risposta pi veloce e pi utenti
(multiprogrammazione).
A ciascun elemento della tabella delle pagine associato un bit di validit (1 in
memoria, 0 no). Inizialmente il bit impostato a zero. Durante la traduzione degli
indirizzi, se il bit di validit zero, la pagina non disponibile.
Di seguito riportato un esempio della tabella delle pagine quando alcune pagine non
si trovano nella memoria centrale:
1.2 PAGE FAULT
Potrebbe succedere che finch il processo esegue nella sua localit non succede
niente. Se c un cambio di localit (es. in A c un salto a sottoprogramma), verr
emesso un indirizzo virtuale con un altro indirizzo di pagina. Bisogna gestire un evento
di pagina mancante, detto page fault. Esso si verifica quando il processo tenta di
accedere a una pagina che non era stata caricata nella memoria. Larchitettura di
paginazione, traducendo lindirizzo, nota che il bit non valido e invia un segnale
deccezione al SO.
Il SO deve decidere se dare un errore di indirizzo non valido (=> abort) oppure
caricare la pagina in memoria. In questultimo caso,

Si individua un blocco di memoria libero,


Si trasferisce la pagina desiderata nel blocco di memoria libera
Si aggiornano le tabelle, bit di validit = 1
Si riavvia listruzione che era stata interrotta del segnale di eccezione.
Fasi di gestione di un Page Fault

A un certo punto, unistruzione assembler chiede di accedere a un indirizzo M


contenuto in una pagina non in memoria. Il codice contenuto gi in memoria. In
questo caso, il sistema genera la page fault trap. Essa deve essere gestita dal SO che
va sul disco, prende la pagina, la sposta in memoria centrale (in uno spazio libero),
aggiorna la tabella delle pagine e restituisce il controllo al processo.

1.3 PRESTAZIONI DELLA PAGINAZIONE SU RICHIESTA


Il tempo effettivo di accesso alla memoria consta anche di un ritardo dovuto al
fatto che bisogna chiedersi se la pagina c in memoria o sta sul disco. In questo caso,
il tempo effettivo di accesso

Dove p la frequenza di assenza di pagina 0<=p<=1.0. Se p=0, non si verifica page


fault, se p=1, ogni riferimento un page fault.
C la possibilit che la memoria fisica sia sovraccarica, occupata. Cio, devo gestire
durante un page fault anche la sostituzione di pagine. Il caricamento di quella pagina
la devo fare per forza, ma posso cercare di buttar fuori una pagina che in quel
momento non usata. Si deve impiegare un algoritmo di sostituzione delle
pagine (ci sono pi sistemi, il pi banale quello FIFO). Una possibile modalit
usare dei bit di riferimento per ridurre il sovraccarico: solo le pagine modificate
vengono scritte su disco. Ci sono tecniche che cercano di predire il comportamento
futuro facendo spazio prima che si verifichi il page fault.
1.4 ALGORITMI DI SOSTITUZIONE DELLE PAGINE
Gli algoritmi di sostituzione delle pagine cercano di minimizzare il numero di page
faults. Si valuta lalgoritmo su una particolare successione di riferimenti e si calcola il
numero di assenze di pagine su quella successione

1.4.1 Algoritmo FIFO

Inizialmente tutte le pagine sono in area di swap, dopodich sono caricate in memoria.
Se viene chiesta a pagina 4, essa verr messa al posto della pagina 1. Se viene
richiesta di nuovo la pagina 1, viene rimpiazzato il 2 Complessivamente ci sono 9
page fault.
Una prima cosa che potremmo pensare aumentare la dimensione della memoria
fisica, ma non cos. C, quindi, unanomalia nellalgoritmo. Landamento dei page
fault non decresce in maniera monotona allaumentare della dimensione dello spazio
fisico. Questanomalia nota come anomalia di Belady.

Questo algoritmo non tiene conto delluso che i processi fanno delle pagine. di facile
implementazione ma non ottimale ed affetto dalla sopracitata anomalia.

1.4.2 Sostituzione delle pagine ottimale

Possiamo sostituire la pagina che non si user per pi tempo. Con questa soluzione, e
con uno spazio di memoria fisica di 4 pagine, avrei 6 page faults. Questa soluzione,
rispetto alla FIFO, conta solo 6 page faults contro 10, quindi limpatto sulle prestazioni
migliore. Un algoritmo del genere solo ideale perch dovrei conoscere le sequenze
di accesso alle pagine (cosa non fattibile). Tuttavia, una soluzione usata negli studi di
comparazione per capire se un algoritmo si avvicina alla soluzione ottimale.

1.4.3 Algoritmo LRU (Least Recently Used)


Non prevede il futuro, ma si basa su una stima dellultimo utilizzo di una pagina.
Scelgo la pagina che non viene usata da pi tempo. unassunzione contraria rispetto
alla sostituzione ottimale. Si associa ad ogni accesso alla pagina di memoria un
contatore gestito dalla CPU. Ad ogni momento duso di una pagina la CPU aggiunge un
contatore che si incrementa a ogni accesso alla pagina. Nella tabella delle pagine mi
salvo il valore del contatore.
Vengono generate 8 assenze di pagine. Nei casi reali, se una pagina non viene
utilizzata da molto tempo, ha meno probabilit di essere usata in futuro, quindi questo
un algoritmo comprensibile.
Si associa allalgoritmo di sostituzione una pila, cio una lista doppiamente
concatenata con un puntatore allelemento iniziale e uno a quello finale. Quando si fa
riferimento a una pagina la si estrae dalla pila e la si colloca in cima. Nel caso peggiore
necessario modificare sei puntatori. Per una sostituzione non si deve compiere
alcuna ricerca.
Unimplementazione del genere un po onerosa a causa dei frequenti aggiornamenti
della lista.

1.4.4 Sostituzione delle pagine per approssimazione a LRU


Ci sono soluzioni che cercano di approssimare l LRU in maniera subottima. Sono
associate al bit di riferimento: si associa a ogni pagina un bit che viene posto a 1
quando la pagina viene usata. Questo bit viene periodicamente azzerato. Nel
momento in cui devo scegliere la vittima, la scelgo tra quelle che hanno bit di
riferimento a zero, avendo la possibilit di conoscere le pagine che nel ciclo non sono
state usate. una forte approssimazione dellLRU. Viene anche detto algoritmo della
seconda chance, perch, in pratica, limplementazione prevede che ci sia un puntatore
che indica la pagina da sostituire. Se la pagina candidata in ordine di clock ha bit di
riferimento 1, esso viene azzerato e si passa appresso. Questo vale per tutte le pagine
con bit di riferimento 1, alle quali viene appunto data una seconda chance.
Lalgoritmo interviene quando avviene un page fault, e durante il tempo tra un page
fault e laltro probabile che lalgoritmo vada a beccare proprio la pagina vittima che
effettivamente non viene usata da molto tempo. Questo mi permette di approssimare
l LRU con un solo puntatore.
Su grande scala, altamente probabile che le pagine non utilizzate abbiano bit di
riferimento a zero. Se la pagina 1 molto usata, probabile che se verr rieseguito
lalgoritmo essa avr di nuovo bit di riferimento a 1.
Nei sistemi operativi vengono utilizzate varianti di questo algoritmo perch semplice
e non aggiunge overhead di strutture dati etc, ed anche semplice dal punto di vista
computazionale.

1.4.5 Rimpiazzamento periodico delle pagine


Molti SO operano con rimpiazzamento periodico: evitano di arrivare nel caso
patologico in cui la memoria completamente piena. Loccorrenza di un page fault
critica ma molto frequente. Non dovrebbero avvenire anomalie durante la gestione di
esso. Fare in modo che ci sia gi una pagina libera in corrispondenza di un page fault
una cosa buona. Quindi, il rimpiazzamento periodico si ha per avere uno spazio libero
in cui inserire la pagina.
Lalgoritmo funziona allo stesso modo ma verr triggerato da unattivazione periodica.
Le pagine in realt non vengono effettivamente cancellate, ma solo marcate come non
valide. Se la pagina dovesse essere richiesta da qualche processo e intanto non
stata rimpiazzata, gi sta in memoria.
Come scegliere la frequenza di scansione?

1.4.6 La soluzione di Solaris 2


Prevedeva una frequenza di scansione adattativa. Questa operazione veniva fatta da
un processo noto come pageout, che esegue lalgoritmo di sostituzione, eseguendo
lalgoritmo di second chance, selezionando pagine da spostare nella lista. Questo
algoritmo esegue quando si entra in unarea di utilizzo pericolosa. Lotsfree la soglia
di memoria fisica libera, al di sotto della quale si attiva la scansione della memoria.
Scanrate la frequenza di scansione delle pagine ed compresa tra i valori slowscan
e fastscan. Pageout eseguito pi frequentemente a seconda del quantitativo di
memoria libera disponibile.
1.5 ATTIVIT DI PAGINAZIONE DEGENERE
Per quante ottimizzazioni posso fare, c il rischio della paginazione degenere,
situazione detta anche trashing. Il SO passa pi tempo a gestire le sostituzioni delle
pagine che non la reale esecuzione dei processi. Se essi eseguono incorrendo sempre
in page faults, il SO non riuscir a far eseguire correttamente i processi. Questo
comporta:

Basso utilizzo della CPU da parte dei processi perch ce n uno alto dal SO.
Questo comporta che lo scheduler di lungo termine ammetta nuovi processi in
memoria, ma questo va a sovraccaricare ancora di pi il sistema
Il processo continua a subire un numero sempre maggiore di assenze di pagine,
facendo sostituire pagine che saranno immediatamente riprese.

1.5.1 Considerazioni
La paginazione funziona grazie al modello di localit: se un processo si sposta, bisogna
far s che le localit siano in memoria principae. Le localit si possono sovrapporre, se
lo spazio fisico di memoria non sufficientemente grande per far in modo che un
processo abbia abbastanza spazio nella propria localit.
La paginazione degenere si ha perch la somma delle dimensioni della localit
maggiore della dimensione totale della memoria.

1.6 MODELLO DELLINSIEME DI LAVORO


WSS_i rappresenta il numero totale delle pagine cui il processo fa riferimento in un
periodo DELTA (finestra dellinsieme di lavoro = numero fisso di riferimenti alle
pagine). Se D troppo piccolo, non include lintera localit, se troppo grande pu
sovrapporre pi localit. Se D infinito, linsieme di lavoro coincide con linsieme di
pagine cui il processo fa riferimento durante la sua esecuzione.
La somma dei WSS la richiesta totale dei blocchi di memoria. Se essa maggiore dei
blocchi liberi, lattivit di paginazione degenera: in questo caso, il SO individua un
processo da sospendere.
1.7 TECNICA DELLA FREQUENZA DELLE ASSENZE DI PAGINE

Unaltra tecnica per controllare il trashing si basa sullo stabilire un tasso accettabile di
page faults. Se la frequenza di page faults molto bassa, il processo potrebbe disporre
di troppi blocchi di memoria, mentre se eccessiva, significa che il processo necessit
di pi blocchi di memoria.

1.7.1 Altre considerazioni


Portata del TLB: il TLB il buffer usato per velocizzare la traduzione degli
indirizzi dallMMU. Se esso non abbastanza grande da contenere il Working Set
di un processo, c un problema. I TLB ha una dimensione fissa, e non si pu
predire il WSS di qualunque processo. I sistemi operativi, per aumentare la
portata dei TLB, possono aumentare la dimensione delle pagine (potrebbe
portare a una maggiore frammentazione della memoria relativamente alle
applicazioni che non richiedono pagine cos grandi), o impiegare diverse
dimensioni delle pagine (ci consente alle applicazioni che richiedono
dimensioni di pagina maggiori di utilizzarle senza che si verifichi un aumento
della frammentazione).

Anche il modo in cui viene scritto il codice pu favorire page faults.
Vincolo di I/O: In alcuni casi, il sistema di swapping pu decidere di non
sostituire una pagina a causa di un vincolo di I/O. Questo avviene, per esempio,
se avviene un trasferimento dal disco a una certa pagina della memoria. Questa
pagina non deve essere soggetta ad alcun meccanismo di sostituzione perch
usata da un dispositivo esterno. Essa viene marcata come vincolata. Questo
viene fatto anche per le pagine del kernel, tranne alcune porzioni.
2 GESTIONE DELLA MEMORIA IN LINUX E WINDOWS

2.1 LINUX
Gestione paginata, non segmentata. unimplementazione portabile tra diverse
architetture (diverse dimensioni di pagina, livelli di paginazione, etc.).
I livelli di paginazione sono 5.

Il concetto di segmento viene rimpiazzato dalle Virtua Memory Areas (VMA). Questo
perch importante la condivisione delle pagine. Ogni pagina contiene informazioni
miste. Le VMA sono porzioni di memoria virtuale costituite da pagine virtuali contigue
che, per, devono contenere informazioni omogenee (area dati, heap, stack, etc.). Ad
un processo vengono associate, dunque, delle VMA. Quando un processo chiede
spazio, lo fa per informazioni omogenee (es. quando viene creata larea heap vengono
create pagine atte a contenere larea heap). come se il sistema implementasse la
segmentazione senza dover appoggiarsi su unarchitettura hardware che la supporti
fisicamente.
Se scrivo sulla shell cat /proc/ avr i pin di tutti i processi in esecuzione
cat/roc/3318/maps contiene le virtual memory areas associate a questo processo.
La gestione della memoria in Linux viene fatta a 3 livelli:

programma utente
la libreria standard C offre funzioni per allocare e cancellare memoria (new,
delete, free, malloc)
le richieste fatte dallutente vengono trasformate in richieste al kernel (mmap,
brk)
memoria fisica

Lallocatore di livello utente vede solo le VMA, non gli interessa sapere come
organizzata la memoria fisica. Lallocatore alloca lo spazio virtuale di un processo,
identificando un intervallo libero in una VMA e registrando lallocazione e fornendo un
puntatore ad un intervallo libero. Nel caso non vi siano VMA sufficienti, laocatore
richiede al kernel di estendere lo spazio virtuale, mediante lestensione di una VMA
esistende (brk) oppure con laggiunta di una nuova VMA al processo (mmap)
A livello kernel, il kernel deve gestire la memoria fisica. Essa viene allocata per
soddisfare le richieste di allocazione dellallocatore di livello utente e memorizzare per
le strutture dati necessarie al kernel stesso (buffer di memoria per i trasferimenti I/O,
caching di dati, etc.).
La memoria fisica di un sistema suddivisa in memoria dei processi, kernel e page
cache del disco. In sostanza, il kernel deve decidere come mappare la memoria
virtuale. Il codice del SO non dispone di uno spazio di indirizzamento separato dai
processi: dei 4 GB disponibili, i primi 3 sono per il processo, mentre lultimo
associato al kernel e contiene suoi codici e dati. Siccome alla fine i processi
condividono il kernel, inutile replicare questo spazio di indirizzamento nella tabella
delle pagine di ogni processo, ma ognuno avr nella tabella unultima entry che la
master kernel page table, che sempre la stessa per tutta lesecuzione del sistema.
Questo mapping statico fa s che lultimo GB di memoria logica venga allocato sul
primo GB di memoria fisica, che conterr il codice del kernel con mapping 1 a 1.
La memoria fisica viene divisa in tre zone:

16 Mb per i dispositivi DMA, che la memoria fisica riservata per accedere ai


dispositivi legacy (8/16 bit)
Zona Normal: memoria fisica accessibile velocemente dal codice kernel. la
parte della master kernel page table associata staticamente. utilizzata
maggiormente per allocare i dati del kernel.
Zona High Memory: memoria fisica accessibile pi lentamente dal codice kernel.
la parte della master kernel page table associata dinamicamente ed
utilizzata maggiormente per allocare le VMA dei processi.
Una delle operazioni che il kernel deve fare quando arriva una malloc, quella di usare
uno zone allocator, e il sistema prevede 3 allocatori diversi per le zone di memoria.

2.2 PAGE CACHE


Oltre ad esserci codice e dati dei processi, viene memorizzata la page cache, che
una sorta di cache del disco: ogni volta che apriamo un file, esso viene copiato anche
nella page cache. Questo avviene perch nel caso in cui continuiamo di riferirci a quel
particolare file, le informazioni sono prese da questa cache e non dal disco. Essa
contiene dati e codice.
Di questa cosa possibile rendersene conto anche guardando le VMA: per ognuna di
esse, tranne che per le aree dati che non hanno un file associato, tutte le altre ne
hanno 1 per la page cache.
Quando si scrive una pagina, questa verr scritta periodicamente sul disco (5-10s,
cache write back). La page cache tende ad espandersi se non ci sono processi in
esecuzione, altrimenti si riduce.
Il criterio con cui andiamo a scrivere sul disco pu essere programmato in due file di
/proc/. Si pu vedere il tempo massimo dopo cui un blocco sporco in memoria viene
aggiornato su disco, la percentuale di memoria sporca oltre la quale si forza
laggiornamento s disco. Pu essere utile configurare la quantit di blocchi sporchi per
favorire applicazioni write-heavy.
2.3 BUDDY SYSTEM
un algoritmo usato dal kernel per allocare pagine fisiche contigue. Allocare pagine
fisiche contigue permette di sfruttare i supporto di alcune CPU alle pagine larghe: esse
permettono di ridurre la dimensione della tabella delle pagine (minor consumo di TLB
e di memoria, migliora il tempo di accesso). Inoltre, alcuni device richiedono, o sono
avvantaggiati, da buffer di I/O contigui (es. DMA). I trasferimenti col DMA sono molto
frequenti: basta pensare ai file o agli swap dei processi.
Linux si serve del buddy system, che un gestore della memoria che divide ogni zona
in dei blocchi gestiti tramite liste: gestisce una lista per i blocchi grandi 1,2,4,, 1024
pagine.

Se consideriamo una zona libera di 64 pagine (2^6), se devo allocare 32 pagine vado
ad allocare la met di questo spazio, e laltra met rimane ancora libera; se devo
allocare 8 pagine, posso allocarle in maniera contigua nel blocco di 32, ma prima di
farlo lo divido in 16 e 16, e quello che rimane in 8 e 8; ora, se devo allocare un blocco
minore di 16 o 8 ce la posso fare, ma se devo allocare un blocco da 20 occorre la
frammentazione. Se due blocchi vengono deallocati possono fondersi per recuperare
lo spazio nella maniera pi contigua possibile.
Pi precisamente, se un blocco di dimensione 2^k gi disponibile, la richiesta
subito soddisfatta. Altrimenti, si verifica se esiste un blocco di dimensione 2^(k+1); se
si, si divide in due parti, delle quali la prima viene allocata, la seconda viene inserita
nella lista dei blocchi con 2^k pagina; altrimenti, si cerca un blocco di dimensione
2^(k+2): se si, lo si divide in 4 parti di cui una viene allocata, e cos via. Quando un
blocco di 2^k pagine viene deallocato, si aggiunge un blocco alla lista dei blocchi di
dimensione 2^k. Se vi un altro blocco libero adiacente con 2^k pagine, i due blocchi
vengono uniti. Essi sono rimossi dalla lista coi blocchi di 2^k pagine; un blocco libero
aggiunto alla lista di quelli con 2^(k+1) pagine. Lunione di pi blocchi contigui viene
ripetuta ricorsivamente, finch possibile.
2.4 SLAB ALLOCATOR
Spesso il kernel ha bisogni di allocare piccole porzioni di memoria, per brevi periodi di
tempo, come buffer di I/O, descrittori di file aperti, etc. Lo slab allocator permette di
allocare piccole porzioni di memoria di dimensione variabile da 32 a 4080 byte,
allinterno di un gruppo di pagine pre allocate.

2.5 OUT-OF-MEMORY KILLER


In caso di scarsit di memoria, sia su RAM sia su swap, il kernel uccide un processo
tramite questo componente.

2.6 PAGE FRAME RECAIMING


una versione modificata del second chance. Viene eseguito o quando lo spazio libero
in memoria scende al di sotto di alcune soglie oppure in maniera periodica: si
sfruttano i periodi in cui il sistema poco carico per effettuare lo swap su disco delle
pagine sporche. Le pagine ritornano al Buddy System.
Ad ogni pagina associato un bit di riferimento e un bit active: di una pagina si pu
dire che usata e viene usata spesso.
Il meccanismo di Refill si basa sullidea di avere due liste. Il second chance base becca
la prima pagina non referenziata. Il PFRA organizza le pagine in delle liste man mano
che vengono riferite. La pagina presenta nella lista delle pagine inattive, quando viene
referenziata, il bit referenced viene messo a 1 e la pagina viene posta in testa alla
lista. Se viene referenziata due volte, passa nella lista delle pagine attive. Lultima
pagina in coda quella che effettivamente viene spostata.
2.7 SWAPPINESS
un parametro definibile dallutente che regola il bilanciamento tra pagine dedicate
alla page cache, e pagine dedicate ai processi. #echo 60 > /proc/sys/vm/swappiness
Valori bassi (minimo = 0) guidano PFRA a scegliere pagine dalla page cache,
minimizzando lo swapping dei processi. Permette di migliorare la responsivit dei
processi
Valori alti (massimo = 100) forzano lo swapping dei processi, conservando la page
cache. Permette di massimizzare il throughput di sistema.
Nei SO Linux Desktop questo valore impostato a 60.

2.8 WINDOWS
Sulle piattaforme a 32 bit, ogni processo vede 4GB di memoria. Una porzione (2GB)
dedicata al SO. Ogni processo ha a disposizione 2GB di spazio di indirizzamento
virtuale. Tutti i processi condividono i 2GB allocati al sistema.
Unopzione consente di aumentare a 3GB la memoria utente, e ridurre a 1GB quella di
sistema. Sulle piattaforme a 64bit, ogni processo utente pu avere accesso fino a 8TB
di memoria virtuale su Windows Vista e Windows 7.

Anche windows utilizza la paginazione, con un meccanismo simile alla VMA per avere
una sorta di segmentazione senza il supporto di architetture hardware. Viene usato il
clustering, richiamando non solo la pagina richiesta ma anche quelle a essa adiacenti.
Ogni cluster pu essere in uno dei seguenti stati:

Available
Reserved
Committed: il cluster inizializzato per

Windows basato sul modello del working set. Alla sua creazione, un processo riceve i
valori del minimo insieme di lavoro e del massimo insieme di lavoro. Il minimo insieme
di lavoro il numero minimo di pagine caricate nella memoria di un processo che il
sistema garantisce di assegnare. Se la memoria sufficiente, il sistema potrebbe
assegnare un numero di pagine pari al suo massimo insieme di lavoro. Quando occorre
un page fault, la pagina richiesta aggiunta al processo senza rimuovere una vecchia
pagina. Quindi, il working set cresce.
La gestione del working set fatta mediante una routine detta Working Set
Manager, eseguita nel contesto del thread di sistema Balance Set Manager Thread.
Nel caso in cui la quantit di memoria libera scenda al si sotto di una soglia critica, il
gestore della memoria virtuale usa un metodo noto come regolazione automatica
dellinsieme di lavoro per riportare il valore sopra la soglia. In pratica, se a un processo
sono state assegnate pi pagine del suo minimo insieme di lavoro, il gestore della
memoria virtuale rimuove le pagine usate meno recentemente da tutti i processi, fino
a raggiungere quel valore.
Tra le pagine dei processi sopra soglia, scelgo la pagina da eliminare secondo una
variante del second chance: ad ogni pagina associato un bit di riferimento e un
contatore relativo allet della pagina. Se, durante lo scan, il bit di riferimento 1,
viene riportato a 0, mentre se 0 viene incrementato il contatore dellet. Verr scelta
quella con contatore massimo.