|
Contact me sending an e-mail (antispam defense activated) |
Title: La memoria Ram sotto Linux
Author: Sandro Tosi
Last modified: 2004-10-30 (2004-10-29) (2004-10-28)
La gestione della memoria da parte di Linux segue una regola molto
semplice: memoria non usata = memoria sprecata.
Tra i compiti di un kernel c'e` anche quello di gestione della
memoria. In essa vengono solitamente mantenute le pagine dei processi
in esecuzione sulla macchina. Oltre a questo, il kernel Linux la
utilizza anche per contenere delle strutture temporanee.
Si prenda l'esempio di un file aperto in lettura: e` abbastanza
probabile che quel file venga letto interamente, ed allora perche`
leggere solo il primo blocco quando lo spazio di memoria ci consente
di caricarlo interamente in Ram? In questo modo, gli accessi
successivi saranno molto piu` rapidi. Ed anche quando il file viene
chiuso, rimane comunque memorizzato in memoria, cosicche` ad una
successiva riapertura il suo contenuto sara` gia` disponibile.
Questa e` la ``cache'', chiamata anche ``page cache'' che tecnicamente
e` una cache dei file mappati in memoria (tramite mmap() ed
implicitamente con fork()/exec() ).
Prendiamo ancora ad esempio un file, ma questa volta aperto in
scrittura: se e` un file modificato di frequente, oppure che subisce
continue modifiche ad una sua porzione, allora converrebbe non
scrivere tutte le modifiche sul device, ma tenere un ``buffer'' che
viene svuotato poco per volta.
Questo e` quello che succede solitamente per device lenti, come i
floppy: quando scriviamo un file su un floppy questo non viene
realmente scritto interamente al termine del comando, ma viene messo
in un buffer in memoria, e scritto poco per volta.
Cio` consente di dare l'impressione che la scrittura sia stata gia`
effettuata e che quindi si puo` continuare a lavorare, mentre e` il
kernel che completa l'operazione senza che l'utente debba aspettare il
suo termine.
Praticamente, il buffer o ``page buffer'' e` una sorta di cache dei
blocchi del disco, a basso livello.
L'utilizzo di cache e buffer, ovviamente, utilizza molta memoria e
questo le prime volte puo` sembrare strano, pensando a come sia
possibile che quasi tutta la memoria Ram sia piena con solo un paio di
applicazioni attive.
La memoria e` effettivamente utilizzata, ma puo` anche essere
facilmente liberata: la cache puo` essere tranquillamente eliminata,
ed i buffer scritti (operazione che comunque e` piu` lenta
dell'eliminazione della cache) e dunque liberare la memoria appena
essa viene richiesta.
Il modo migliore per spiegare la situazione della memoria e` tramite
il comando ``free'': per esempio, eseguito sulla mia macchina ora
restituisce
# free
total used free shared buffers cached
Mem: 353084 139232 213852 0 7328 76512
-/+ buffers/cache: 55392 297692
Swap: 113392 0 113392
La prima riga indica la memoria utilizzata, ma la seconda mostra
l'utilizzo escludendo i buffer e la cache: i valori vengono
ridimensionati di molto.
Infatti e` piu` comodo e veloce liberare delle pagine di memoria
quando serve che fare accessi ai device, quindi buffer e cache sono un
modo per massimizzare le prestazioni.
Vediamo allora alcuni comandi utili per ottenere informazioni sulla
memoria:
o free
Gia` visto in precedenza, restituisce le informazioni sull'utilizzo
della memoria fisica, swap e la dimensione di buffer e cache
o top (ordinato per memoria, premendo 'M')
Consente di mostrare un elenco dei processi ordinati per utilizzo
di memoria, in ordine decrescente
o vmstat
Riporta informazioni sulla memoria virtuale
o cat /proc/meminfo
Entry del filesystem virtuale procfs che restituisce informazioni
molto dettagliate sulla memoria (alcune di esse sono quelle
riportate da ``free''). Per maggior informazioni sul significato di
tutte queste voci, non c'e` altro modo che leggersi i sorgenti:
/usr/src/linux/fs/proc/proc_misc.c )
|