La memoria virtuale è una tecnica del sistema informatico che fornisce un file applicazione l'impressione che abbia una memoria di lavoro (o spazio di indirizzi) contigua anche se può essere frammentata e persino estendersi nello spazio di archiviazione su un disco. In sostanza, consente di utilizzare in modo efficace una quantità di memoria maggiore di quella che potrebbe essere fisicamente disponibile sul sistema.
Come funziona la memoria virtuale?
La memoria virtuale comprende diverse funzionalità che arricchiscono lo spazio di archiviazione. Ecco come funziona:
- File di paging o spazio di scambio. La memoria virtuale utilizza una parte del disco rigido del computer (o SSD) per estenderlo RAM. Questo spazio sul disco viene spesso definito file di paging in Windows o spazio di scambio UNIX/sistemi Linux.
- Cercapersone e scambio. Il Marketplace per le sistema operativo sposta i dati tra il disco e la RAM in unità chiamate "pagine". Quando un programma deve accedere a dati che non sono attualmente nella RAM, il sistema sposterà i dati che non sono stati utilizzati di recente sul disco (scambio o paging out) e caricherà i dati necessari nella RAM (paging in).
- Unità di gestione della memoria (MMU). La MMU è un componente hardware responsabile della gestione della memoria virtuale. Traduce gli indirizzi virtuali in indirizzi fisici. Ogni programma ha il proprio spazio di indirizzi virtuali, che vengono mappati sugli indirizzi fisici dalla MMU.
Vantaggi e svantaggi dell'utilizzo della memoria virtuale
La memoria virtuale è una pietra angolare dell'informatica moderna, poiché espande la capacità apparente della memoria fisica e facilita il multitasking senza interruzioni tra diverse applicazioni. Mentre offre flexbilità, stabilità del sistema e maggiore sicurezza, può portare a colli di bottiglia nelle prestazioni, in particolare quando l'hardware del sistema non è ottimizzato per attività di paging pesanti.
Di seguito è riportato uno schema dei vantaggi e degli svantaggi derivanti dall’utilizzo di questa tecnologia.
Vantaggi
I vantaggi della memoria virtuale includono:
- Efficienza nell'utilizzo della memoria. La memoria virtuale consente un utilizzo più efficiente della memoria fisica. Consente ai sistemi di eseguire applicazioni che richiedono più memoria di quella fisicamente disponibile utilizzando lo spazio su disco come estensione più lenta e funzionale della RAM.
- Gestione della memoria semplificata. Per i programmatori, la memoria virtuale semplifica la gestione della memoria perché non devono gestire direttamente l'allocazione della memoria. Il sistema operativo gestisce la complessità della mappatura degli indirizzi virtuali in indirizzi fisici, consentendo agli sviluppatori di concentrarsi su altri aspetti delle loro applicazioni.
- Sicurezza migliorata. Isolando lo spazio di memoria di ciascuna applicazione, la memoria virtuale aggiunge anche un livello di sicurezza. Impedisce a un'applicazione di accedere ai dati di un'altra, proteggendo così da determinati tipi di bug del software o exploit dannosi.
- Impegno eccessivo della memoria. I sistemi di memoria virtuale consentono l'allocazione di più memoria alle applicazioni di quella fisicamente presente utilizzando meccanismi come overcommitment e sovraallocazione della memoria. Questi approcci sono utili in ambienti in cui le applicazioni potrebbero riservare più memoria di quella effettivamente utilizzata.
- Caricamento su richiesta/caricamento lento. La memoria virtuale carica solo le parti necessarie di un programma nella memoria fisica, riducendo i tempi di avvio e la quantità di memoria fisica utilizzata. Ciò è particolarmente utile per le applicazioni con grandi quantità di codice o dati che non sono necessari contemporaneamente.
- Creazione semplice del processo. L'uso della memoria virtuale rende più semplice per il sistema operativo allocare memoria ai processi appena creati. Può anche semplificare la gestione della memoria allocata dinamicamente all'interno di tali processi, migliorando la reattività del sistema e scalabilità.
- File mappati in memoria. La memoria virtuale consente di mappare i file direttamente nello spazio degli indirizzi di un processo, semplificando l'accesso ai file e migliorando le prestazioni delle operazioni di I/O sui file.
- Memoria virtuale condivisa. Negli ambienti in cui più processi devono accedere agli stessi dati, la memoria virtuale facilita la condivisione di questi dati mappandoli nello spazio degli indirizzi di ciascun processo. Questa funzionalità è utile nei sistemi multiutente o multiprocesso in cui i processi devono comunicare o condividere informazioni.
Svantaggi
Come ogni tecnologia, la memoria virtuale presenta una serie di svantaggi, tra cui:
- Sovraccarico delle prestazioni. La memoria virtuale introduce un livello di conversione degli indirizzi tra la visione della memoria dell'applicazione e la memoria fisica effettiva, che può portare a un sovraccarico delle prestazioni. Il processo di scambio dei dati tra RAM e memoria su disco (paging) può rallentare il sistema, soprattutto se si accede frequentemente al disco a causa della RAM limitata.
- Distruzione del disco. Ciò si verifica quando il sistema ha poca memoria fisica e impiega molto tempo a scambiare pagine di memoria tra disco e RAM. Può ridurre gravemente le prestazioni del sistema, poiché il tempo impiegato per leggere e scrivere sul disco è molto più lento rispetto all'accesso alla RAM.
- Maggiore fabbisogno di spazio di archiviazione. La memoria virtuale richiede che una parte del disco venga allocata come spazio di swap (su Linux/Unix) o come file di paging (su Windows). Questa allocazione riduce lo spazio di archiviazione disponibile per altri usi e può essere significativa, soprattutto su sistemi con molta RAM.
- Latenza nell'accesso alla memoria. I tempi di accesso per i dati archiviati nella memoria virtuale (ovvero sul disco) sono significativamente più elevati rispetto ai dati nella RAM fisica. Ciò può portare a problemi di latenza per le applicazioni che richiedono accesso alla memoria ad alta velocità, incidendo sulle prestazioni delle attività urgenti.
- Gestione complessa della memoria. La memoria virtuale richiede il mantenimento della tabella delle pagine, la gestione degli errori di pagina e la decisione di quali pagine scambiare dentro e fuori. Tutto ciò aggiunge complessità alle attività di gestione della memoria del sistema operativo e consuma risorse di sistema.
- Frammentazione. Nel corso del tempo, il file di scambio o lo spazio di scambio può diventare frammentato, proprio come qualsiasi altro file system, che può ridurre le prestazioni poiché il sistema deve cercare diverse parti del disco per leggere o scrivere una singola pagina di memoria.
- Problemi di sicurezza. La memoria virtuale configurata in modo errato porta potenzialmente a vulnerabilità della sicurezza, come la perdita di informazioni riservate tra applicazioni o su disco. Garantire che la memoria scambiata sia gestita e ripulita correttamente è fondamentale.
Algoritmi utilizzati per la gestione della memoria virtuale
Alcuni Algoritmi sono impiegati per gestire la memoria virtuale, ciascuno con la sua strategia unica per ottimizzare l'uso delle risorse di memoria fisica. Tra questi, First-In, First-Out (FIFO) e Least Recently Used (LRU) si distinguono per i loro approcci distinti alla sostituzione delle pagine, che è un aspetto critico della gestione della memoria virtuale.
FIFO
First-In, First-Out (FIFO) è un algoritmo fondamentale di sostituzione delle pagine in cui le pagine vengono scambiate dentro e fuori dalla memoria fisica in base al loro tempo di arrivo. In FIFO, la pagina più vecchia, ovvero quella caricata per prima in memoria, è la prima ad essere eliminata quando è necessario spazio per nuove pagine. Questo metodo funziona in modo molto simile a una coda, dando priorità alle pagine nell'ordine in cui sono state introdotte.
Sebbene la semplicità e il sovraccarico minimo di FIFO lo rendano attraente, non tiene conto della frequenza o dell'attualità degli accessi alle pagine, il che può portare a un utilizzo della memoria non ottimale. Ciò è evidente in situazioni come l'Anomalia di Belady, dove l'aggiunta di più frame di pagina potrebbe paradossalmente aumentare il numero di page fault, evidenziando un'inefficienza fondamentale nella strategia FIFO.
LRU
Least Recently Used (LRU), assegna la priorità alle pagine in base alla cronologia degli accessi, mirando specificamente alla pagina utilizzata meno di recente per la sostituzione. Questo metodo si basa sul presupposto che le pagine visitate di recente potrebbero essere nuovamente necessarie presto.
L'implementazione di LRU implica il monitoraggio dell'ora dell'ultimo accesso di ciascuna pagina o il mantenimento di un record delle pagine in ordine di accesso. Questa complessità aggiuntiva può essere giustificata dall'approssimazione più efficace di LRU della sostituzione ottimale della pagina, che mira a ridurre al minimo gli errori di pagina e migliorare le prestazioni mantenendo in memoria le pagine utilizzate di frequente. Nonostante il suo sovraccarico maggiore rispetto a FIFO, LRU è ampiamente considerata per la sua gestione più dinamica ed efficiente della memoria virtuale.
OPT
Sebbene non sia praticamente implementabile, la sostituzione ottimale della pagina (OPT) funge da punto di riferimento teorico per valutare l'efficienza degli algoritmi di sostituzione della pagina. OPT funziona secondo il principio di sfrattare la pagina che non sarà più necessaria in futuro. Poiché richiede previsione delle richieste future, OPT viene utilizzato in contesti accademici e teorici per valutare il limite superiore delle prestazioni dell’algoritmo di sostituzione della pagina. La sua utilità sta nel confronto, poiché aiuta gli sviluppatori a comprendere i potenziali miglioramenti in termini di efficienza degli algoritmi del mondo reale rispetto a questo standard idealizzato.