Condividi tramite


Memorizzazione nella cache dei file

Per impostazione predefinita, Windows memorizza nella cache i dati dei file letti dai dischi e scritti su dischi. Ciò implica che le operazioni di lettura leggono i dati dei file da un'area nella memoria di sistema nota come cache dei file di sistema, anziché dal disco fisico. In modo corrispondente, le operazioni di scrittura scrivono i dati dei file nella cache dei file di sistema anziché nel disco e questo tipo di cache viene definito cache writeback. La memorizzazione nella cache viene gestita per ogni oggetto file.

La memorizzazione nella cache viene eseguita sotto la direzione della gestione cache , che funziona continuamente mentre Windows è in esecuzione. I dati dei file nella cache dei file di sistema vengono scritti sul disco a intervalli determinati dal sistema operativo, e la memoria utilizzata in precedenza da questi dati viene liberata. Questa operazione viene definita svuotamento della cache. Il criterio di ritardare la scrittura dei dati nel file e di tenerli nella cache fino a quando la cache non viene scaricata viene chiamata scrittura differita e viene attivata dal gestore della cache a un determinato intervallo di tempo. L'ora in cui un blocco di dati di file viene scaricata è determinata parzialmente in base alla quantità di tempo in cui è stata archiviata nella cache e alla quantità di tempo trascorsa dall'ultimo accesso ai dati in un'operazione di lettura. In questo modo, i dati dei file letti di frequente rimarranno accessibili nella cache dei file di sistema per la quantità massima di tempo.

Questo processo di memorizzazione nella cache dei dati dei file è illustrato nella figura seguente.

processo di memorizzazione nella cache dei file dati

Come illustrato dalle frecce solide nella figura precedente, un'area di dati di 256 KB viene letta in una cache di 256 KB nello spazio indirizzi di sistema quando viene richiesta per la prima volta dalla gestione cache durante un'operazione di lettura file. Un processo in modalità utente copia quindi i dati in questo slot nel proprio spazio indirizzi. Quando il processo ha completato l'accesso ai dati, scrive nuovamente i dati modificati nello stesso slot nella cache di sistema, come illustrato dalla freccia tratteggiata tra lo spazio degli indirizzi del processo e la cache di sistema. Quando il gestore della cache ha determinato che i dati non saranno più necessari per un certo periodo, scrive i dati alterati nel file sul disco, come illustrato dalla freccia tratteggiata tra la cache di sistema e il disco.

La quantità di miglioramento delle prestazioni di I/O offerta dalla memorizzazione nella cache dei dati dei file dipende dalle dimensioni del blocco di dati di file da leggere o scrivere. Quando vengono letti e scritti blocchi di file di grandi dimensioni, è più probabile che le operazioni di lettura e scrittura su disco siano necessarie per completare l'operazione di I/O. Le prestazioni di I/O saranno sempre più ridotte man mano che si verifica un maggior numero di operazioni di I/O.

In queste situazioni, la memorizzazione nella cache può essere disattivata. Questa operazione viene eseguita al momento dell'apertura del file passando FILE_FLAG_NO_BUFFERING come valore per il parametro dwFlagsAndAttributes di CreateFile. Quando la memorizzazione nella cache è disabilitata, tutte le operazioni di lettura e scrittura accedono direttamente al disco fisico. Tuttavia, i metadati del file possono comunque essere memorizzati nella cache. Per scaricare i metadati su disco, usare la funzioneFlushFileBuffers.

La frequenza con cui si verifica lo scaricamento è una considerazione importante che bilancia le prestazioni del sistema con l'affidabilità del sistema. Se il sistema scarica troppo spesso la cache, il numero di operazioni di scrittura di grandi dimensioni causa un calo significativo delle prestazioni del sistema. Se il sistema non viene scaricato abbastanza spesso, la probabilità è maggiore che la memoria di sistema venga esaurita dalla cache o un errore improvviso del sistema (ad esempio una perdita di alimentazione nel computer) si verificherà prima dello scaricamento. In quest'ultima istanza, i dati memorizzati nella cache andranno persi.

Per garantire che si verifichi la giusta quantità di scaricamento, il gestore della cache genera un processo ogni secondo denominato writer lazy. Il processo lazy writer accoda un ottavo delle pagine che non sono state scolate di recente per essere scritte su disco. Rivaluta costantemente la quantità di dati scaricati per ottenere prestazioni ottimali del sistema e, se è necessario scrivere più dati, accoda più dati. Gli scrittori pigri non eliminano i file temporanei, perché si assume che vengano cancellati dall'applicazione o dal sistema.

Alcune applicazioni, ad esempio il software di controllo dei virus, richiedono che le operazioni di scrittura vengano scaricate immediatamente sul disco; Windows offre questa possibilità tramite la memorizzazione nella cache write-through. Un processo abilita la cache di scrittura diretta per un'operazione di I/O specifica passando il flag FILE_FLAG_WRITE_THROUGH nella chiamata a CreateFile. Con la memorizzazione nella cache write-through abilitata, i dati vengono comunque scritti nella cache, ma il gestore della cache scrive i dati immediatamente su disco anziché incorrere in un ritardo usando il lazy writer. Un processo può anche forzare il flush di un file che ha aperto chiamando la funzione FlushFileBuffers.

I metadati del file system vengono sempre memorizzati nella cache. Pertanto, per archiviare eventuali modifiche ai metadati sul disco, il file deve essere svuotato o aperto con FILE_FLAG_WRITE_THROUGH.