- AVAIL, 3 bit
- Disponibili per il Sistema Operativo
- RS, 1 bit
- PS, Page Size, 1 bit
- 0, pagina di 4 KB
- 1 pagina di 8KB
- A,Accessed, 1 bit
- viene settato quando il processore accede per la prima volta alla pagina, in lettura o in
scrittura
- PCD, Page Cache Disable, 1 bit
- Usato per la gestione della cache
- PWT, Page Write-Through Disable
- Usato per la gestione della cache
- U, User, 1 bit
- Stabilisce il
livello di protezione della pagina
- W, Write, 1 bit
- 1 la pagina può essere modificata, 0 può sessere solo letta
- P, Present, 1 bit
- 1, la pagina è presente in memoria fisica
- 0, la pagina non è in memoria
- In questo caso la entry ha seguente formato
- Il SO usa i 31 bit disponibili del
campo AVAILABLE per inserire informazioni utili a swappare la
pagina
- D, Dirty, 1 bit
- Si trova solo negli attributi della PT
- 1, la pagina è stata modificata (accesso in
scrittura)
- 0, la pagina non è stata modificata
La tecnica Demand On Page
La scelta delle pagine da allocare ad un processo viene effettuata mantenendo in memoria una
tabella delle pagine fisiche, la Memory Table, ogni elemento della quale
contiene il numero della pagina e un serie di informazioni necessarie per
effettuare lo swap delle paagine da disco a memoria e viceversa.
Questa operazione viene eseguita se il numero di pagine fisiche
disponibili non è sufficiente a contenere l’applicazione da eseguire. La
tecnica usata allo stato attuale è nota come Demand- On-Page.
Il SO carica in memoria solo una parte delle pagine, lasciando ciò che rimane nel disco. Per le pagine che non sono state caricate in memoria vengono create
ugualmente le entry corrispondenti nelle PT, ma queste non conterranno alcun indirizzo fisico. Il SO inoltre mette a 0 uno dei bit
d’attributo della entry , il bit P, per segnalare l’assenza della pagina.
Quando il processore si troverà a dover eseguire un istruzione o
referenziare un dato che si trova in una pagina non presente, l’accesso alla
entry provocherà un’interruzione interna, chiamata Page Fault Ecception.
Il processore in questo caso esegue le seguenti operazioni:
- Sospende il processo e ne salva lo stato
- Verifica se esiste una pagina fisica libera
- Se esiste una pagina fisica, carica la
pagina richiesta nella pagina fisica scelta e aggiorna la PT (o la PD),
inserendo nella entry corrispondente, l’indirizzo fisico della pagina e
gli attributi(P=1)
- Se non ci sono pagine disponibili, sceglie sulla base di un determinato critero (Algoritmo di rimpiazzamento) una delle
pagine già occupate. Se la pagina è stata modificata ( D=1) da
quando è stata caricata in memoria, la salva su disco in un area riservata
chiamata swap area
- Ripristina lo stato del processo e ne
riprende l’esecuzione a partire dall’istruzione che ha generato il
Page-Fault (l'indirizzo dell'istruzione che ha provocato ilpage fault si
trova in CR2)
Gli algoritmi di rimpiazzamento più comunemente usati sono due:
- LRU (Last Recently Used)
- si sceglie la meno recentemente usata
- Clock Algorithm
- La tabella delle pagine viene usata come una lista circolare
- Si verifica se la pagina è stata usata (bit A). Se A=0, si sceglie questa pagina
- Se A=1, si pone A=0 si esamina la pagina
successiva.
- In questo modo si è certi che una pagina verrà selezionata sicuramente, perchè nel caso che tutte le altre pagine
abbiano A=1, verrà scelta la prima.
Il SO aggiunge alle informazioni memorizzate negli attributi di pagina,
informazioni aggiuntive quali per es. l'età della pagina e il proprietario.
La gestione paginata in Unix
Unix descrive le pagine fisiche (libere o allocate) mediante una tabella chiamata mem_map.
Ciascun entry di questa tabella contiene
una serie di informazioni aggiuntive sulla pagina, per es. l’età, il
proprietario etc..
L'operazione di allocazione/deallocazione delle pagine viene effettuata per mezzo di un'altra
tabella chiamata free_area. Ogni elemento della tabella contiene un
puntatore ad una coda di blocchi di pagine. Il primo puntatore punta a singole
pagine, il secondo a blocchi di due pagine, il terzo a blocchi di quattro, il n-esimo
a blocchi di
L'algoritmo usato (algoritmo di Buddy) cerca di allocare pagine in blocchi contenenti un
numero di pagine uguali ad una potenza di due. Se nessun blocco delle dimensioni richieste è libero viene cercato un
blocco corrispondente all'elemento successivo e così via finchè non si trova
un blocco libero o fino a che la tabella è scandita tutta.
Se il blocco viene trovato, ma è più grande di quanto era stato
richiesto, esso viene diviso iterativamente per due , fino ad ottenere la
dimensione richiesta, mentre le parti rimanenti (che vengono dimensionate in
accordo con le potenze di 2) vengono accodate nelle corrispondenti entry della
tabella.
Quando uno o più blocchi deve essere deallocato il sistema non si limita semplicemente
a rimettere i blocchi liberi nelle code corrispondenti ma cerca di ricombinare
(quando può) i blocchi più piccoli in blocchi più grandi.
Allo scopo di rendere più
efficiente la gestione virtuale della memoria, l'operazione di swap non viene
effettuata solo in seguito al Page Fault: il sistema cerca di fare in modo che
il numero di pagine libere non scenda al di sotto di un valore prefissato.
Questo compito viene eseguito da un processo in background o per dirla con la
terminologia di Unix, da un daemon (il nome del processo è kswapd).
kswapd viene eseguito (come tutti i daemon) periodicamente e opera nel seguente modo.
-
Se ci sono abbastanza pagine libere semplicemente si sospende in attesa del
prossimo timeout.
-
In caso contrario mette in atto strategie differenti per aumentare il numero di
pagine fisiche libere:
-
Cerca fra tutti i processi presenti nel sistema se vi è un buon candidato, cioè
se possiede pagine che possono essere scartate o copiate su disco (swap out)
selezionando preferibilmente agine
con D=0, come per es. le pagine di codice che di solito non subiscono alcuna
modifica quando sono in memoria
-
Selezionato il processo, il daemon va alla ricerca di quelle pagine virtuali del
processo che non sono condivise o locked (cioè non swappabili)
-
Non scarta o swappa tutte le pagine candidate, ma solo alcune (in Linux al
massimo 4 ad ogni ciclo)
-
Il criterio principale per la scelta è l'età (che si trova nella tabella
della memoria) della pagina. Più vecchia è la pagina, più è preferita
per lo swap o lo scarto.
-
Se la pagina deve essere swappata (perché il bit D=1) viene posto P=0 e viene
inserita al posto dell'indirizzo un informazione sul punto della swap area
dove si trova la pagina.
-
Infine la pagina è inserita nella free_area