[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 163.   Memoria virtuale

La memoria virtuale è la memoria centrale della macchina virtuale che il sistema operativo realizza. In pratica, questa memoria virtuale si avvale della memoria centrale fisica e, possibilmente, di spazio all'interno di unità a disco. Il meccanismo che consente l'estensione della memoria reale si basa sullo scambio di porzioni di memoria centrale nella memoria di massa. Il termine inglese swap deriva da questa continua operazione di scambio.

Utilizzando un sistema GNU/Linux comune, se non si dispone di una quantità di memoria centrale molto grande (anche molto superiore a 128 Mibyte) è necessario attivare il meccanismo di scambio della memoria virtuale. La tabella 163.1 elenca i programmi e i file a cui si accenna in questo capitolo.

Tabella 163.1. Riepilogo dei programmi e dei file per la gestione della memoria virtuale.

Nome Descrizione
mkswap Inizializza un'area di scambio della memoria.
swapon Attiva un'area di scambio della memoria.
swapoff Disattiva un'area di scambio della memoria.
/etc/fstab Elenco di file system e di aree di scambio gestiti automaticamente.

163.1   Creazione di una partizione o di un file di scambio

Con GNU/Linux è possibile attivare la gestione della memoria virtuale utilizzando due tipi di aree nel disco fisso: una partizione dedicata oppure un file. Dal momento che possono essere gestite diverse aree di scambio, conviene attivarne almeno una, utilizzando una partizione dedicata. In pratica, la partizione di scambio dovrebbe consentire almeno la gestione normale del sistema, mentre i file di scambio potrebbero servire come un mezzo eccezionale per estenderne la dimensione.

Da un punto di vista tecnico, la partizione di scambio è preferibile al file di scambio; sia per un motivo legato alle prestazioni, sia per il fatto che si evitano complicazioni nel momento dell'arresto del sistema.

La scelta della dimensione della partizione di scambio è importante perché una volta deciso, questa normalmente non può più essere cambiata facilmente. La dimensione massima di un'area di scambio è di 128 Mibyte se si utilizzano kernel 2.0.* o precedenti (mentre nella serie 2.2.* questo limite è stato superato) e possono esserne definite un massimo di 16. In generale, per la partizione di scambio è conveniente utilizzare una dimensione pari ad almeno la stessa quantità della memoria RAM effettiva, con un minimo di circa 1 Gibyte (ovviamente disponendo di un kernel abbastanza recente).

Riservare uno spazio più grande del necessario per la memoria virtuale, non può essere dannoso; al massimo si traduce in uno spreco di spazio nel disco fisso.

Prima di poter attivare la gestione della memoria virtuale è necessario creare lo spazio in cui devono risiedere le aree di scambio relative. Ciò vale anche nel caso in cui per questo si vogliano utilizzare dei file.

163.1.1   Partizione di scambio

La creazione di una partizione di scambio per la memoria, procede nello stesso modo con cui si crea una qualunque altra partizione. In questo caso non c'è la necessità di eseguire un avvio del sistema operativo su tale partizione, di conseguenza si possono usare anche partizioni logiche contenute in partizioni estese senza problemi di alcun tipo.

La creazione della partizione richiede l'utilizzo di fdisk, oppure di un programma equivalente, ricordando però di assegnare alla partizione il tipo corretto di identificatore: 8216 (Linux-swap).

163.1.2   File di scambio

La caratteristica necessaria di un file destinato a fungere da area di scambio è quella di essere continuo; non può quindi essere frammentato. Il modo corretto per creare un file con queste caratteristiche è quello di utilizzare il programma dd nel modo seguente:

dd if=/dev/zero of=file_da_creare bs=4096c count=dimensione

In questo caso, la dimensione fa riferimento a blocchi di 4 Kibyte, pari a quanto stabilito con l'opzione bs=4096c. In effetti, la dimensione ottimale di un file del genere è un multiplo di 4 Kibyte perché le pagine di memoria, utilizzate durante lo scambio della stessa, sono di questa dimensione.

Per esempio, volendo creare il file di scambio /swap1 di 256 Mibyte si può procedere come segue:

dd if=/dev/zero of=/swap1 bs=4096c count=65536[Invio]

Se tutto si conclude come desiderato, si ottiene una risposta del tipo seguente:

65536+0 records in
65536+0 records out

163.2   Inizializzazione

Un'area di scambio deve essere inizializzata prima di poterla attivare per il suo scopo. Il programma in grado di farlo è mkswap.

Prima di usare mkswap occorre fare attenzione: l'inizializzazione che viene fatta cancella i dati della partizione o del file.

Il rischio è quello di inizializzare una partizione sbagliata o un file sbagliato.

Un'altra cosa da considerare è che non si può inizializzare un'area di scambio mentre questa è in uso. Ciò dovrebbe essere intuitivo, ma alle volte si dimentica di fare attenzione a questo particolare.

163.2.1   Utilizzo di «mkswap»

Il programma mkswap (1) permette di predisporre una partizione o un file per lo scambio, ovvero la gestione della memoria virtuale. In generale è preferibile utilizzare una partizione dedicata che può essere creata con l'aiuto di fdisk, definendola come Linux-swap.

mkswap [-c] dispositivo [dimensione_in_blocchi]

È preferibile utilizzare tutti gli argomenti, in modo da richiedere un controllo dell'unità (attraverso l'opzione -c) e specificando anche la dimensione in blocchi (i blocchi sono di 1 024 byte in questo caso). Segue la descrizione di alcuni esempi.

163.3   Attivazione e disattivazione della memoria virtuale

Per fare in modo che un'area di scambio venga utilizzata per il suo scopo, occorre attivarne la gestione. L'operazione è compiuta dal programma swapon.

Il meccanismo è simile a quello dell'attivazione di un file system che si ottiene con l'innesto dei dischi o delle partizioni. Per questo motivo, l'attivazione delle aree di scambio può essere gestita automaticamente attraverso la configurazione del file /etc/fstab.

163.3.1   Utilizzo di «swapon» e «swapoff»

Il programma swapon (2) attiva l'utilizzo di un dispositivo, o di un file, per la gestione della memoria virtuale. Di solito si tratta di una partizione o un di file di scambio creati e inizializzati appositamente. Normalmente, swapon viene chiamato da uno degli script della procedura di inizializzazione del sistema e questo allo scopo di attivare le aree di scambio previste all'interno del file /etc/fstab.

swapon [opzioni] [dispositivo|file]

Il programma swapoff (3) è l'opposto di swapon e si occupa di disattivare la memoria virtuale su un particolare dispositivo o file per lo scambio, oppure su tutti quelli indicati nel file /etc/fstab. Utilizza la stessa sintassi e le stesse opzioni di swapon. In effetti si tratta normalmente solo di un collegamento al programma swapon che si comporta così quando viene avviato con questo nome: swapoff.

swapoff [opzioni] [dispositivo|file]

Le partizioni o i file di scambio attivati manualmente (che quindi non sono annotate nel file /etc/fstab) devono essere disattivati manualmente prima della conclusione dell'attività di GNU/Linux.

In generale è importante l'opzione -a, con la quale viene attivata, o disattivata, la memoria virtuale riferita a tutti i dispositivi indicati come file system swap all'interno del file /etc/fstab. Di conseguenza, se si usa questa opzione non deve essere indicato alcun dispositivo negli argomenti.

Segue la descrizione di alcuni esempi.

163.3.2   Gestione automatica attraverso il file «/etc/fstab»

Per quanto riguarda la gestione della memoria virtuale, il file /etc/fstab permette di definire quali partizioni e file debbano essere utilizzati automaticamente per questo scopo. La configurazione di /etc/fstab per la gestione della memoria virtuale è praticamente obbligatoria, a meno di provvedere ogni volta alla sua attivazione e disattivazione attraverso l'uso diretto di swapon e swapoff.

L'esempio seguente mostra due record ipotetici di /etc/fstab per l'attivazione della partizione /dev/hda3 e del file /swap1:

# nome         collegamento  Tipo    Opzioni
/dev/hda3      none          swap    sw
/swap1         none          swap    sw

163.3.3   Procedura di inizializzazione del sistema

Durante l'esecuzione della procedura di inizializzazione del sistema, si distinguono due fasi per l'attivazione delle aree di scambio della memoria: prima dell'attivazione dei file system vengono attivate le partizioni di scambio; dopo, anche i file di scambio.

Nel file /etc/fstab non si riesce a distinguere quali siano le partizioni e quali i file, per cui è necessario un trucco molto semplice. Nella prima fase viene eseguito swapon con l'opzione -a: si possono così attivate solo le partizioni di scambio, perché l'unico file system in funzione dovrebbe essere quello principale che inizialmente è in sola lettura. In pratica, swapon tenta di attivare anche i file, ma senza riuscirci.

Nella seconda fase, quando i file system sono in funzione, viene eseguito nuovamente swapon, ma questa volta le partizioni già attivate non possono essere attivate nuovamente, mentre i file di scambio vengono trovati e attivati.

echo "attivazione delle partizioni di swap"
swapon -a
...
echo "attivazione dei file di swap"
swapon -a 2>&1 | grep -v "busy"

In presenza di file di scambio, l'arresto del sistema deve avvenire nel modo corretto: prima si devono disattivare i file di scambio, quindi si può eseguire il distacco dei file system (riportando quello principale in sola lettura) e infine si possono disattivare le partizioni di scambio.

In pratica, spesso si disattiva subito tutta la gestione della memoria virtuale, ma questo rende problematica la conclusione delle operazioni su sistemi dotati di poca memoria. Anche sotto questo aspetto, è sempre consigliabile di evitare l'utilizzo di file di scambio.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) util-linux: mkswap   GNU GPL

2) util-linux: swapon   GNU GPL

3) util-linux: swapoff   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome memoria_virtuale.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!