Mise en cache des fichiers

Par défaut, Windows met en cache les données de fichier lues à partir de disques et écrites sur des disques. Cela implique que les opérations de lecture lisent les données de fichier à partir d’une zone de la mémoire système appelée cache de fichiers système, plutôt que du disque physique. En conséquence, les opérations d’écriture écrivent les données de fichier dans le cache de fichiers système plutôt que sur le disque, et ce type de cache est appelé cache de réinscription. La mise en cache est gérée par objet de fichier.

La mise en cache se produit sous la direction du gestionnaire de cache, qui fonctionne en continu pendant l’exécution de Windows. Les données de fichier dans le cache de fichiers système sont écrites sur le disque à des intervalles déterminés par le système d’exploitation, et la mémoire utilisée précédemment par ces données de fichier est libérée, c’est ce que l’on appelle le vidage du cache. La stratégie qui consiste à retarder l’écriture des données dans le fichier et à les maintenir dans le cache jusqu’à ce que le cache soit vidé est appelée écriture différée, et elle est déclenchée par le gestionnaire de cache à un intervalle de temps déterminé. Le moment auquel un bloc de données de fichier est vidé dépend en partie de la durée pendant laquelle il a été stocké dans le cache et de la période écoulée depuis le dernier accès aux données lors d’une opération de lecture. Cela garantit que les données de fichier fréquemment lues resteront accessibles dans le cache de fichiers système pendant le temps maximal imparti.

Ce processus de mise en cache des données de fichier est illustré dans la figure suivante.

processus de mise en cache des données de fichier

Comme illustré par les flèches pleines de la figure précédente, une région de données de 256 Ko est lue dans un « emplacement » de cache de 256 Ko dans l’espace d’adressage système lorsqu’elle est demandée pour la première fois par le gestionnaire de cache lors d’une opération de lecture de fichier. Un processus en mode utilisateur copie ensuite les données de cet emplacement dans son propre espace d’adressage. Lorsque le processus a terminé son accès aux données, il enregistre les données modifiées dans le même emplacement dans la mémoire cache du système, comme indiqué par la flèche en pointillé entre l’espace d’adressage du processus et la mémoire cache du système. Lorsque le gestionnaire de cache a déterminé que les données ne seront plus nécessaires pendant un certain laps de temps, il réécrit les données modifiées dans le fichier sur le disque, comme le montre la flèche en pointillés entre le cache système et le disque.

La quantité d’amélioration des performances d’E/S qu’offre la mise en cache des données de fichier dépend de la taille du bloc de données de fichier en cours de lecture ou d’écriture. Lorsque des blocs de données de fichier volumineux sont lus et écrits, il est plus probable que des lectures et des écritures sur disque soient nécessaires pour terminer l’opération d’E/S. Les performances d’E/S seront de plus en plus altérées à mesure que de plus en plus d’opérations d’E/S de ce type se produisent.

Dans ces situations, la mise en cache peut être désactivée. Cette opération s’effectue au moment de l’ouverture du fichier en passant FILE_FLAG_NO_BUFFERING en tant que valeur pour le paramètre dwFlagsAndAttributes de CreateFile. Lorsque la mise en cache est désactivée, toutes les opérations de lecture et d’écriture accèdent directement au disque physique. Toutefois, les métadonnées du fichier peuvent toujours être mises en cache. Pour vider les métadonnées sur le disque, utilisez la fonction FlushFileBuffers .

La fréquence à laquelle le vidage se produit est une considération importante qui équilibre les performances du système avec la fiabilité du système. Si le système vide trop souvent le cache, le nombre d’opérations d’écriture volumineuses entraîne une dégradation significative des performances du système. Si le système n’est pas vidé assez souvent, il est plus probable que la mémoire système soit épuisée par le cache ou qu’une défaillance soudaine du système (telle qu’une perte d’alimentation de l’ordinateur) se produise avant le vidage. Dans ce dernier instance, les données mises en cache sont perdues.

Pour s’assurer que la quantité appropriée de vidage se produit, le gestionnaire de cache génère chaque seconde un processus appelé enregistreur paresseux. Le processus d’écriture différée met en file d’attente un huitième des pages qui n’ont pas été vidées récemment pour être écrites sur le disque. Il réévalue constamment la quantité de données en cours de vidage pour des performances système optimales, et si davantage de données doivent être écrites, il met en file d’attente davantage de données. Les enregistreurs différés ne vident pas les fichiers temporaires, car l’hypothèse est qu’ils seront supprimés par l’application ou le système.

Certaines applications, telles que les logiciels de vérification antivirus, nécessitent que leurs opérations d’écriture soient immédiatement vidées sur le disque ; Windows offre cette fonctionnalité par le biais de la mise en cache en écriture directe. Un processus active la mise en cache en écriture directe pour une opération d’E/S spécifique en passant l’indicateur FILE_FLAG_WRITE_THROUGH dans son appel à CreateFile. Une fois la mise en cache en écriture directe activée, les données sont toujours écrites dans le cache, mais le gestionnaire de cache écrit les données immédiatement sur le disque au lieu d’entraîner un délai à l’aide de l’enregistreur paresseux. Un processus peut également forcer le vidage d’un fichier qu’il a ouvert en appelant la fonction FlushFileBuffers .

Les métadonnées du système de fichiers sont toujours mises en cache. Par conséquent, pour stocker les modifications de métadonnées apportées au disque, le fichier doit être vidé ou ouvert avec FILE_FLAG_WRITE_THROUGH.