Demand Paging
La memoria usr è suddivisa in estensioni contigue dette pagine di memoria. In Linux la dimensione di una pagina è di 4 kB.
Quando un processo nasce, il Memory Mapping Unit (MMU) istanzia in RAM solo un numero limitato di pagine del processo, prima di iniziarbe l'esecuzione.
Ben presto il processo tenta di accedere a pagine che non sono ancora presenti in memoria RAM. Questo produce una condizione anomala detta Page Fault, per risolvere la quale:
- il processo viene sospeso in modalità sleeping
- la MMU recupera le pagine richieste, più altre, e le istanzia in RAM
- il processo viene risvegliato
Ogni processo quindi nasce con un numero limitato di pagine in RAM - il suo Resident Set Size (RSS), ma nel corso del tempo queste aumentano. E' uno dei motivi per cui Linux è più lento dopo un boot, ma la sua velocità tende sempre ad aumentare.
Sistema Carico
Se vi sono molti processi attivi simultaneamente, e poca memoria complessiva, il sistema tende prima o poi ad esaurire le pagine disponibili in RAM (Free Pages).
Quando il numero di pagine libere scende al di sotto di un numero soglia, dell'ordine di 5000 pagine, il kernel attiva un processo detto Page Stealing Daemon. Il compito di questo processo di sistema è di identificare le pagine che di cui processi utente no hanno più bisogno, e di marcarle per possibile rimozione.
Sicuramente tutte le pagine provenienti dalle regioni Text e Data sono rimuovibili, poichè facilmente re-istanziabili dall'immagine del file su disco. Differente discorso per le regioni BSS e Heap, che contengono dati generati dal processo durante l'esecuzione. La regione Stack è la più preziosa, essendo la traccia di esecuzione delle funzioni del processo.
Mon si può prevedere se un processo avrà bisogno di una pagina in futuro, così il principio è che se un processo non usa una pagina per un certo periodo di tempo, probabilmente non ne avrà più bisogno. L'algoritmo è detto Least Recently Used o di ritardo temporale. Il Page Stealing Daemon:
- setta a 0 il bit used di tutte le pagine in RAM
- ogni processo quando usa una pagina setta a 1 tale bit
- attende un intervallo di tempo
- riscandisce le pagine, quelle col bit used ancora a 0 vengono marcate come scaricabili
Non è però compito del Page Stealing Daemon rimuovere le pagine, solo di marcarle. Quando la memoria è veramente quasi terminata, viene risvegliato il processo di sistema swapper, che rimuove le pagine e le salva su disco, nell'Area di Swap. Qualora un processo rivoglia una o più pagine swappate, il Memory Mapping Unit è programmato per vedere se già si trovino nell'area di swap, prima di istanziarle di fresco.
Dato che la lettura e scrittura su disco è 100.000 volte più lenta delle operazioni in memoria, il regime di swapping produce un rallentamento notevole, e patologico, delle performance di sistema.
I modi per evitare lo swapping sono:
- aumentare la RAM di sistema
- diminuire il numero di processi simultanei
- dedicare singoli sistemi a singoli processi con vasti requisiti di RAM
I programmatori possono contribuire alla performance di sistema evitando chiamate a funzioni remote ed usando ottimizzatori di codice che pongano le funzioni più piccole e più usate inline nel codice.