Sino a non più di dieci anni fa, i prezzi per un banco di memoria RAM erano molto superiori (sia in termini assoluti sia in termini relativi se paragonati ai prezzi degli altri componenti informatici) rispetto a quelli attuali. Ogni singolo megabyte – ma anche ogni singolo kilobyte – di memoria doveva essere centellinato e utilizzato al meglio per non sprecare risorse: affianco a una rigida gerarchia da applicare ai processi in esecuzione, sono state introdotte tecniche informatiche atte a migliorare il funzionamento della macchina anche se a corto di spazio nella memoria di lavoro (o, al limite, anche nel caso questa fosse completamente occupata).
Una di queste, sicuramente la più famosa e nota anche ai non addetti ai lavori, è la memoria virtuale. La tecnica permette di allocare più informazioni nella memoria di lavoro rispetto allo spazio fisicamente a disposizione sui banchi di memoria. Sfruttando la potenza di calcolo della CPU, una porzione dello spazio di archiviazione presente nel disco rigido e un articolato sistema di traduzione di indirizzi di memoria fisici/virtuali, questa tecnica permette di estendere anche di parecchio lo spazio di memoria a disposizione del sistema.
Come funziona la memoria virtuale
La memoria di lavoro effettivamente installata nel sistema è solitamente divisa in piccoli blocchi – chiamati pagine – utilizzati per allocare le informazioni da processare. La pagina, grande solitamente 4 kilobyte, rappresenta la quantità minima di informazione allocata sulla RAM e processabile dalla CPU. Questo sistema, gestito grazie a una particolare unità di calcolo presente all'interno del processore del computer, la MMU (Memory Management Unit), permette di alternare i processi in esecuzione e di gestire carichi di lavori superiori a quelli teoricamente supportabili dalla sola memoria RAM installata.
Quando la memoria di lavoro è vicina all'esaurimento, le pagine di memoria relative a processi non in immediata esecuzione sono “parcheggiate” su una porzione del disco rigido (chiamata “memoria di swap”) allo scopo di fare spazio alle pagine contenenti dati in procinto di essere processati. Nel caso in cui le pagine allocate sulla memoria di swap dovessero rendersi necessarie per l'esecuzione di programmi, sarà compito del processore, tramite la sua unità MMU, andare a reperirle e caricarle nuovamente sulla memoria di lavoro.
Questo continuo interscambio di pagine tra la memoria RAM e la memoria di swap (con la CPU chiamata a fare il “vigile urbano”, deviando pagine da un indirizzo di memoria all'altro) permette di incrementare notevolmente la capacità di lavoro di una macchina andando però a scapito della velocità di elaborazione. Nel caso in cui lo scambio tra la memoria RAM e quella di swap diventi troppo intenso, ad esempio quando un numero troppo elevato di applicativi sta girando sul sistema, la macchina potrebbe andare incontro a sensibili rallentamenti che possono portare anche al blocco totale del sistema: è il cosiddetto fenomeno di thrashing.
Hardware e software
Affinché il sistema della memoria virtuale funzioni a dovere, è necessario uno stretto controllo dei processi coinvolti e una attenta gestione del flusso delle pagine da parte della CPU.
La partizione di disco rigido allocata a memoria di scambio, infatti, è vista dai vari programmi come un insieme di indirizzi virtuali ai quali poter fare riferimento in caso di “allocamento temporaneo” delle pagine. Il processore, grazie all'unità di gestione della memoria (la MMU), gestisce tutti gli indirizzi virtuali e segna sulle cosiddette “tabelle delle pagine” (page tables in inglese) la corrispondenza tra gli indirizzi e le pagine di memoria allocata. In questo modo, nel caso in cui delle pagine dovessero essere richiamate in memoria di lavoro, i programmi avranno vita facile a reperirle sulla memoria di swap.
La gestione delle tabelle è garantita da una cooperazione tra software e hardware della macchina: da un lato avremo il sistema operativo che manterrà e aggiornerà le tabelle ogni volta che un programma inoltrerà al sistema una richiesta di accesso alla memoria, dall'altro la CPU avrà il compito di smistare le varie pagine nei blocchi di memoria assegnati dal SO. Quando un programma effettua una richiesta, il sistema operativo si occuperà di allocare un numero sufficiente di pagine di memoria e aggiornerà la tabella delle pagine, inserendo i relativi indirizzi dei blocchi di memoria.
Nel caso in cui le richieste dei programmi eccedano lo spazio fisicamente a disposizione nella RAM, il sistema operativo dovrà fare in modo di liberare porzioni sufficienti della memoria per rispondere alla esigenze dei nuovi processi. Ad esempio, nel caso in cui un programma faccia richiesta per accedere a 250 megabyte di RAM a fronte di uno spazio disponibile di 150 megabyte, il sistema operativo dovrà attivare la memoria di swap, dove allocare parte dei dati presenti nella RAM e appartenenti a programmi attualmente non in esecuzione. Se, ad esempio, l'utente volesse lanciare il programma Word ma non ci fisse spazio a sufficienza nella RAM, il sistema operativo eliminerebbe dalle tabelle delle pagine gli indirizzi di Photoshop, programma caricato in memoria ma non in esecuzione. Queste pagine sarebbero spostate dalla CPU (per tramite dell'unità di gestione della memoria, la MMU) nella memoria di swap e richiamate nella RAM solo nel caso in cui l'utente decidesse effettivamente di avviare Photoshop.