Memorizzazione nella cache dei file

Per impostazione predefinita, Windows memorizza nella cache i dati di file che vengono letti dai dischi e scritti sui dischi. Ciò implica che le operazioni di lettura leggeno i dati dei file da un'area nella memoria del sistema nota come cache dei file di sistema, anziché dal disco fisico. Analogamente, le operazioni di scrittura scrivono i dati dei file nella cache dei file di sistema anziché sul disco e questo tipo di cache è noto come cache write-back. La memorizzazione nella cache viene gestita per ogni oggetto file.

Caching si verifica sotto la direzione della gestione cache, che opera continuamente mentre Windows è in esecuzione. I dati dei file nella cache dei file di sistema vengono scritti nel disco a intervalli determinati dal sistema operativo e la memoria usata in precedenza da tali dati file viene liberata. Questo viene definito scaricamento della cache. Il criterio di ritardare la scrittura dei dati nel file e di tenerlo nella cache fino a quando la cache non viene scaricata viene chiamata scrittura lazy e viene attivata dalla gestione cache a un determinato intervallo di tempo. Il momento in cui un blocco di dati del file viene scaricato dipende in parte da quanto tempo è rimasto memorizzato nella cache e da quanto tempo è trascorso dall'ultima volta in cui si è avuto accesso ai dati in un'operazione di lettura. Questo garantisce che i dati del file letti frequentemente restino accessibili nella cache dei file di sistema per il massimo intervallo di tempo previsto.

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

file data caching process

Come illustrato dalle frecce solide nella figura precedente, un'area di dati di 256 KB viene letto in una cache di 256 KB nello spazio degli indirizzi del sistema quando viene prima richiesta dalla gestione cache durante un'operazione di lettura file. Un processo in modalità utente quindi copia i dati di questo slot nel proprio spazio indirizzi. Quando il processo ha completato l'accesso ai dati, riscrive i dati modificati nello stesso slot nella cache di sistema, come indicato dalla freccia tratteggiata tra lo spazio indirizzi del processo e la cache di sistema. Quando la gestione cache ha determinato che i dati non saranno più necessari per un determinato periodo di tempo, scrive i dati modificati 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 del file da leggere o scrivere. Quando vengono letti e scritti blocchi di file di grandi dimensioni, è più probabile che sia necessario leggere e scrivere dischi per completare l'operazione di I/O. Le prestazioni di I/O saranno sempre più compromesse perché 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 dei file possono comunque essere memorizzati nella cache. Per scaricare i metadati sul disco, usare la funzione FlushFileBuffers .

La frequenza in 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 in cui si scaricano le operazioni di scrittura comporta 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 di sistema improvviso (ad esempio una perdita di potenza nel computer) si verificherà prima dello scaricamento. In quest'ultima istanza i dati memorizzati nella cache verranno persi.

Per assicurarsi che si verifichi la giusta quantità di scaricamento, il gestore della cache genera un processo ogni secondo chiamato writer lazy. Il processo di scrittura lazy accoda un ottavo delle pagine che non sono state scaricate di recente per essere scritte su disco. Rivaluta costantemente la quantità di dati scaricati per ottenere prestazioni ottimali del sistema e, se più dati devono essere scritti in coda più dati. I writer lazy non scaricano file temporanei, perché il presupposto è che verranno eliminati dall'applicazione o dal sistema.

Alcune applicazioni, ad esempio software di controllo del virus, richiedono che le operazioni di scrittura vengano scaricate immediatamente sul disco; Windows offre questa possibilità tramite la memorizzazione nella cache di scrittura. Un processo consente la memorizzazione nella cache in scrittura per un'operazione di I/O specifica passando il flag di FILE_FLAG_WRITE_THROUGH nella chiamata a CreateFile. Con la memorizzazione nella cache di scrittura abilitata, i dati vengono ancora scritti nella cache, ma la gestione cache scrive immediatamente i dati su disco anziché incorrere in un ritardo usando il writer lazy. Un processo può anche forzare lo scaricamento di un file 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 scaricato o aperto con FILE_FLAG_WRITE_THROUGH.