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 ) |