4.4. Memoria virtuale: Dettagli

Introduciamo prima un nuovo concetto: Lo spazio dell'indirizzo virtuale. Tale spazio rappresenta la quantità massima di spazio per l'indirizzo disponibile per una applicazione. Lo spazio dell'indirizzo virtuale varia a seconda dell'architettura del sistema e del sistema operativo. Esso dipande dall'architettura perchè è quest'ultima che definisce il numero di bit disponibili per l'indirizzo. Dipende anche dal sistema operativo e a seconda del modo con il quale è stato implementato il sistema operativo stesso potrebbe apportare dei limiti aggiuntivi, superiori o inferiori, a quelli imposti dall'architettura.

La parola "virtuale" nello spazio dell'indirizzo virtuale, stà ad indicare il numero totale di luoghi della memoria indirizzabili in modo unico disponibili per una applicazione, e non la quantità di memoria fisica installata nel sistema o dedicata all'applicazione.

Nel caso del nostro esempio, lo spazio per l'indirizzo virtuale è di 15000 byte.

Per implementare la memoria virtuale è necessario, per il sistema del computer, avere un hardware speciale per la gestione della memoria. Questo hardware è spesso conosciuto come MMU (Memory Management Unit). Senza di esso, quando la CPU accede alla RAM, le posizioni della RAM non cambiano mai — l'indirizzo della memoria 123 rappresenta sempre la stessa posizione fisica all'interno della RAM.

Tuttavia, con una MMU, gli indirizzi della memoria attraversano una fase di traslazione prima dell'accesso alla memoria. Ciò significa che l'indirizzo 123 della memoria, potrebbe essere direzionato verso l'indirizzo fisico 82043 prima, e verso l'indirizzo privato 20468 poi, l'overhead nel seguire in modo individuale la traslazione virtuale e fisica per bilioni di byte di memoria, potrebbe essere troppo grande. Invece, l'MMU divide la RAM in pagine — sezioni contigue di memoria di misura predeterminata gestite dalla MMU come entità singole.

Mantenere le informazioni di queste pagine e delle traslazioni dell'indirizzo, potrebbe sembrare una fase non necessaria e confusionaria. Tuttavia risulta molto importante implementare la memoria virtuale. Per questo motivo vi consigliamo di tenere in giusta considerazione questo punto.

Prendendo in considerazione la nostra ipotetica applicazione con uno spazio dell'indirizzo virtuale di 15000 byte, considerate che la prima istruzione dell'applicazione acceda i dati conservati nell'indirizzo 12374. Tuttavia, prendete in considerazione anche che il nostro computer possiede solo 12288 byte di RAM fisica. Cosa succede se la CPU cerca di accedere l'indirizzo 12374?

Quello che succede viene chiamato page fault.

4.4.1. Page Fault

Un page fault rappresenta una sequenza di eventi che si presentano quando un programma cerca di accedere i dati (o codice) presenti nel proprio spazio dell'indirizzo, ma che gli stessi non si trovano nella RAM del sistema. Il sistema operativo deve gestire le page fault facendo risiedere la memoria dei dati in questione, permettendo al programma di continuare le sue funzioni come se il page fault non fosse mai accaduto.

Nel caso della nostra ipotetica applicazione, la CPU presenta prima l'indirizzo desiderato (12374) alla MMU. Tuttavia, la MMU non ha alcuna transazione per questo indirizzo. Così interrompe la CPU e causa l'esecuzione del software, conosciuto come gestore della page fault. Tale gestore determina cosa si deve fare per risolvere tale problema. E cioè:

Mentre le prime tre fasi sono relativamente semplici, l'ultima non lo è affatto. Per questo motivo è necessario affrontare argomenti aggiuntivi.

4.4.2. Il working set

Il gruppo di pagine della memoria fisica attualmente dedicato ad un processo specifico è chiamato working set per il processo stesso. Il numero di pagine nel working set può aumentare o diminuire, a seconda della disponibilità delle pagine stesse.

Il working set aumenta come un processo page fault. Al contrario esso diminuisce con la diminuzione delle pagine disponibili. Per evitare la consumazione completa della memoria, le pagine devono essere rimosse dai working set del processo e trasformate in pagine disponibili per un loro eventuale utilizzo. Il sistema operativo diminuisce i working set del processo nei seguenti modi:

Per determinare i working set appropriati per tutti i processi, il sistema operativo deve possedere tutte le informazioni sull'utilizzo per tutte le pagine. In questo modo, il sistema operativo determina le pagine usate in modo attivo (risiedendo sempre nella memoria) e quelle non utilizzate (e quindi da rimuovere dalla memoria.) In molti casi, una sorta di algoritmo non usato di recente, determina le pagine che possono essere rimosse dai working set dei processi.

4.4.3. Swapping

Anche se lo swapping (scrittura delle pagine modificate sullo spazio swap del sistema) rappresenta una operazione normale della funzione di un sistema, è possibile che si verifichi uno swapping accessivo. Il motivo per il quale bisogna fare attenzione ad uno swapping eccessivo, è la possibilità che si possa verificare, in modo costante, la seguente situazione:

Se la sequenza di questi eventi è molto diffusa ecco che si verifica il thrashing, il quale indica una insufficienza di RAM per il carico di lavoro attuale. Il Thrashing è estremamente dannoso per le prestazioni del sistema, in quanto la CPU ed i carichi I/O che possono essere generati, possono avere il sopravvento sul carico imposto dal reale funzionamento del sistema. In casi estremi, il sistema potrebbe non funzionare utilmente, spendendo tutte le sue risorse spostando le pagine da e per la memoria.