La cache di buffer

Leggere da un disco[1] è molto più lento che accedere a della memoria (reale). Oltre a ciò, è comune leggere la stessa parte del disco diverse volte in brevi periodi di tempo. Ad esempio, si può prima leggere un messaggio di posta elettronica, poi caricare lo stesso messaggio in un editor per rispondere, poi farlo leggere al programma di posta per copiarlo in una cartella. Oppure, considerate quanto spesso si può usare il comando ls su un sistema con molti utenti. Leggendo le informazioni dal disco e trattenendole in memoria finché non servono più si possono velocizzare le letture successive alla prima. Questo processo si chiama bufferizzazione del disco, e la memoria usata allo scopo è la cache di buffer.

Dato che la memoria è, sfortunatamente, una risorsa finita, anzi, scarsa, la cache di buffer di solito non può essere abbastanza grande (non può contenere tutti i dati che si vogliono usare). Quando la cache si riempie, i dati che non sono stati usati per il tempo più lungo vengono scartati e la memoria liberata viene usata per quelli nuovi.

La bufferizzazione del disco vale anche in scrittura; da una parte i dati scritti vengono spessi letti di nuovo (come per un codice sorgente che viene salvato in un file, e poi letto dal compilatore), quindi mettere in cache i dati che vengono scritti è una buona idea; dall'altra, solo mettendo i dati nella cache e non scrivendoli nel disco, il programma che li scrive gira più veloce. La scrittura si può fare in background, senza rallentare gli altri programmi.

La maggior parte dei sistemi operativi usano le cache di buffer (anche se si possono chiamare in altri modi), ma non tutte funzionano con i principi descritti sopra. Alcune sono write-through: i dati vengono scritti tutti insieme nel disco (vengono mantenuti anche nella cache, naturalmente), mentre la cache si chiama write-back se la scrittura viene fatta in un secondo tempo. Il write-back è più efficiente del write-through, ma anche più soggetto ad errori: se la macchina ha un crash, viene tolta la corrente al momento sbagliato o il floppy viene rimosso dal drive prima che i dati nella cache vengano scritti, i cambiamenti nella cache vengono persi; ciò può anche comportare che il filesystem (se ce n'è uno) non sia pienamente funzionante, perché forse i dati non scritti contenevano cambiamenti importanti alle informazioni di archiviazione.

Per questo non dovreste mai spegnere il computer senza usare una corretta procedura di shutdown (vedere il Capitolo 6), rimuovere un floppy dal drive senza smontarlo (se era stato montato) o dopo che qualsiasi programma che lo stia usando abbia segnalato di aver finito e che il led del floppy non si sia spento. Il comando sync fa il flush del buffer, cioè forza la scrittura di tutti i dati nel disco, e può essere usato quando si vuole essere certi che tutto venga scritto al sicuro. Nei sistemi UNIX tradizionali c'è un programma chiamato update in background che fa un sync ogni 30 secondi, in modo che non è in genere necessario usare sync. Linux ha un daemon aggiuntivo, bdflush, che fa un sync più imperfetto con frequenza maggiore per evitare il blocco improvviso dovuto al pesante input/output del disco causato a volte da sync.

Sotto Linux bdflush viene avviato da update. Di solito non c'è ragione per preoccuparsene, ma se per qualche ragione bdflush muore il kernel vi avviserà e dovrete riavviarlo a mano (/sbin/update).

La cache in genere non fa il buffer dei file ma di blocchi, che sono le unità più piccole dell'input/output dei dischi (sotto Linux di solito sono di 1 kB). In questo modo vengono messe in cache anche le directory, i superblocchi, altri dati di archiviazione dei filesystem e dischi che contengono un filesystem.

L'efficacia di una cache è principalmente decisa dalla sua dimensione: una cache piccola è praticamente inutile, dato che conterrà talmente pochi dati che tutti i dati in cache vengono tolti prima di venir riutilizzati. La dimensione critica dipende da quanti dati vengono letti e scritti e da quanto spesso vengono riutilizzati gli stessi. L'unico modo di saperlo è sperimentare.

Se la cache è di dimensione fissa non è neanche bene che sia troppo grande, perché potrebbe rimpicciolire troppo la memoria libera e rendere necessario fare swap (che è ugualmente lento). Per usare in modo più efficiente possibile la memoria reale Linux usa automaticamente tutta la RAM libera per la cache di buffer, ma rimpicciolisce la cache automaticamente quando i programmi hanno bisogno di più memoria.

Sotto Linux non dovete fare niente per utilizzare la cache, che funziona completamente in automatico; dovete solo seguire le procedure corrette per fare shutdown e per rimuovere i floppy.

Note

[1]

Eccetto un disco di RAM, per ovvie ragioni.