In informatica, la memoria virtuale è una architettura di sistema capace di simulare uno spazio di memoria centrale maggiore di quello fisicamente presente; questo risultato si raggiunge utilizzando spazio di memoria secondaria su altri dispositivi, di solito le unità a disco. La memoria centrale fisicamente presente diventa quindi la parte effettivamente utilizzata di quella virtuale, più grande: questo stratagemma è utile in virtù del principio di località dell'esecuzione dei programmi. La memoria secondaria utilizzata a questo scopo è comunemente chiamata, in ambiente Posix, swap o spazio di swap (verbo inglese che significa "scambiare"), mentre, in ambiente Windows, è chiamata file di paging. Le operazioni di spostamento delle pagine dallo spazio di swap alla memoria fisica sono chiamate swapping.
In un sistema dotato di memoria virtuale, il processore e i programmi si riferiscono alla memoria centrale con indirizzi logici, virtuali, che vengono tradotti in indirizzi fisici reali da una unità apposita, la MMU o memory management unit che in genere è incorporata nei processori.
La MMU svolge i seguenti compiti:
Questo meccanismo ha un prezzo in termini di prestazioni: la MMU impiega del tempo per tradurre l'indirizzo logico in indirizzo fisico, e ce ne vuole molto di più per caricare una zona di memoria dallo spazio di swap: in ultima analisi quindi, implementare una memoria virtuale significa sacrificare potenza di calcolo per poter eseguire un maggior numero di processi contemporanei.
Detto Ta il normale tempo di accesso alla memoria fisica, Tt il tempo di traduzione di indirizzi della MMU e Tload il tempo necessario a caricare una zona di memoria dallo swap, il tempo (medio) di accesso in caso di memoria virtuale è:
Tav = Tt + Ta + Tload * Pfault
dove Pfault è la probabilità di page fault, cioè di incappare in una pagina che non è presente in memoria centrale e di doverla quindi caricare dallo swap.
Un possibile rimedio è quello di aumentare la dimensione della pagine di memoria, al prezzo di un maggior spreco di memoria stessa (frammentazione interna: più grandi sono le pagine, più aumenta il numero di pagine parzialmente vuote e più spazio viene sprecato).
Più dettagliatamente il meccanismo di gestione della memoria virtuale con paginazione è il seguente. L'immagine di un processo è suddivisa in pagine di dimensione fissa. La memoria principale è suddivisa anch'essa in "pezzi", della stessa dimensione delle pagine, detti frame. Ad ogni processo è associata una tabella, mantenuta in memoria principale o secondaria a seconda delle dimensioni, detta tabella delle pagine. Ogni entrata (riga) della tabella delle pagine contiene:
Il numero di pagina per quella riga, Il bit present , Il bit modified, Il numero di frame corrispondente
Gli indirizzi logici sono rappresentati dalla coppia (nr. di pagina, offset). La traduzione avviene in questo modo: si trova la riga corrispondente al numero di pagina dell'indirizzo logico, se il bit Present è 0, la pagina non è presente in memoria principale, si genera quindi un Page Fault e si attende che la pagina sia caricata in memoria, infine si genera l'indirizzo fisico (nr. frame, offset)
Il bit Modified indica invece se la pagina è stata modificata o meno. Infatti se una pagina non è stata modificata, al momento di effettuare lo swap nella memoria secondaria, non ha senso riscrivere la pagine su disco. Risparmiando così tempo, e migliorando in parte le prestazioni.
Un ultimo dettaglio tecnico. Supponiamo di avere indirizzi logici e fisici di lunghezza k bit. Di questi n saranno destinati al nr. di pagina e m all'offset. Si ha quindi k = n + m. Da questo di deduce che ogni pagina,ed ogni frame, ha dimensione 2^m bit. Supponiamo ora che volendo tradurre un indirizzo logico (nr. pagina, offset), si trovi che il frame corrispondete alla data pagina sia l'i-esimo. Questo però non corrisponde ancora al vero indirizzo fisico, ma solamente all'indice del frame. Per ottenere l'indirizzo fisico si deve ora moltiplicare i * 2^m. Il vantaggio di questa tecnica consiste nel fatto che, nel sistema binario, questa operazione può essere eseguita concatenando m zeri alla rappresentazione binaria di i. Un'operazione quindi molto veloce, che può essere eseguita direttamente in hardware.
Ad esempio supponiamo che in un dato momento la memoria fisica sia satura e contenga esattamente la località del sistema e che in questa situazione viene avviato un nuovo programma. Il processo che viene creato ha bisogno di allocare della memoria. Dato però che la memoria principale è piena il sistema operativo provvede a liberare parte dello spazio memorizzando parte delle informazioni nella memoria secondaria. Successivamente, quando il controllo torna al processo i cui dati sono stati appena spostati, viene nuovamente richiesta un'operazione di swapping per ricaricare in memoria principale gli stessi. Dato che tutte le informazioni contenute nella memoria principale sono indispensabili questo fenomeno avviene molto spesso. Essendo la memoria secondaria molto più lenta (centinaia o migliaia di volte) rispetto alla memoria principale, questo causa un considerevole rallentamento del sistema, che è impegnato quasi esclusivamente in operazioni di I/O, e diventa presto inutilizzabile e poco, o per nulla, responsivo ai comandi dell'utente. Tale fenomeno è chiamato thrashing.
Questo algoritmo è molto semplice e di rapida esecuzione ma ha lo svantaggio di spostare in memoria secondaria le pagine più vecchie anche se sono utilizzate di frequente.
Nel caso peggiore tutte le pagine hanno il bit impostato ad 1, in questo caso l'algoritmo azzera tutti i bit fino a tornare alla prima pagina presa in esame. Trovandola ora con bit a 0 provvede alla sua sostituzione. In questo caso la sostituzione a seconda scelta si riduce ad una sostituzione di tipo FIFO.
Esiste una versione modificata del seguente algoritmo che prevede due bit che tengono traccia dell'uso e della modifica. Si hanno infatti le seguenti combinazioni:
Quando è necessario effettuare una sostituzione di pagina l'algoritmo prima cerca la pagina migliore da sostituire considerando non solo il fatto che essa non sia stata usata recentemente ma anche che non sia stata modificata. Infatti quando la pagina è stata modificata è necessario salvarne nuovamente il contenuto all'interno della memoria secondaria. Se invece non è stata modificata, ed è già presente una copia nella memoria secondaria, non è necessario effettuare alcuna operazione di I/O.
Per gestire efficientemente quest'algoritmo occorre supporto hardware. È possibile implementare questa tecnica in due modi: si può aggiornare ad ogni accesso della memoria una tabella oppure si mantiene uno stack con le pagine utilizzate più recentemente poste in cima. Entrambi i metodi hanno un impatto non indifferente sulle prestazioni del sistema e per questo motivo normalmente sono realizzati in hardware.
Memòria virtual | Virtuální paměť | Virtuel hukommelse | Virtuelle Speicherverwaltung | Virtual memory | Memoria virtual | Näennäismuisti | Mémoire virtuelle | Memoria virtual | זיכרון וירטואלי | Virtuális memória | 仮想記憶 | 가상 메모리 | Virtualioji atmintis | Virtueel geheugen | Pamięć wirtualna | Memória virtual | Swap | Virtuálna pamäť | Navidezni pomnilnik | Virtuellt minne | 虚拟内存
This article is licensed under the GNU Free Documentation License.
It uses material from the
"Memoria virtuale".
Home Page • arts • business • computers • games • health • hospitals • home • kids & teens • news • physicians • recreation• reference • regional • science • shopping • society • sports • world