INFO : FILE_FLAG_WRITE_THROUGH et FILE_FLAG_NO_BUFFERING

Résumé

L’indicateur FILE_FLAG_WRITE_THROUGH CreateFile() entraîne tous les enregistrements effectués à ce handle à écrire directement dans le fichier sans mis en mémoire tampon. Les données sont mises en cache (stockée dans le cache de disque) ; Toutefois, il est toujours écrit directement dans le fichier. Cette méthode permet à une opération de lecture sur ces données pour répondre à la demande de lecture à partir de données mises en cache (si elle existe toujours), plutôt que de devoir faire un fichier lire pour obtenir les données. L’appel d’écriture ne retourne pas jusqu'à ce que les données sont écrites dans le fichier. Cela s’applique à l’écriture à distance--les passes de redirecteur réseau le FILE_FLAG_WRITE_THROUGH indicateur au serveur afin que le serveur sache ne pas à satisfaire la demande d’écriture jusqu'à ce que les données sont écrites dans le fichier.


Le FILE_FLAG_NO_BUFFERING prend cette un étape concept plus et élimine les mise en mémoire tampon du fichier de lecture anticipée et la mise en cache disque, tous les afin que toutes les lectures sont garanties à venir à partir du fichier et non à partir de n’importe quel tampon du système ou le cache disque. Lorsque vous utilisez FILE_FLAG_NO_BUFFERING, disque lit et écrit doit être effectuée sur des limites de secteur et adresses de mémoire tampon doivent être alignées sur des limites de secteurs de disque dans la mémoire.


Ces restrictions sont nécessaires car la mémoire tampon que vous passez à la lecture ou l’écrivez d’API est utilisée directement pour les e/s au niveau du périphérique ; à ce niveau, vos adresses de mémoire tampon et les tailles de secteur doivent satisfaire à des restrictions d’alignement de processeur et le support du matériel en cours d’exécution sur.

Plus d'informations

Le CDFS de 95 (système de fichiers CD-ROM) Windows ne gère pas l’indicateur FILE_FLAG_NO_BUFFERING pour CreateFile(). Pendant un FSD 95 Windows, par exemple VFAT, peut mettre en œuvre, FILE_FLAG_NO_BUFFERING n’est pas un indicateur requise pour les pilotes de système de fichiers et il n’est pas pris en charge par CDFS.


Ce fragment de code montre comment aligner les données dans une mémoire tampon à un secteur et la passer à CreateFile() :

  char buf[2 * SECTOR_SIZE - 1], *p;
p = (char *) ((DWORD) (buf + SECTOR_SIZE - 1) & ~(SECTOR_SIZE - 1));
h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
WriteFile(h, p, SECTOR_SIZE, &dwWritten, NULL);


Le pointeur p est aligné sur le secteur et pointe dans la mémoire tampon.


Si vous avez une situation où vous souhaitez vider tous les fichiers ouverts sur le lecteur logique en cours, ceci est possible en :

   hFile = CreateFile("\\\\.\\c:", ....);   FlushFileBuffers(hFile);

Cette méthode sélectionne toutes les données mises en mémoire tampon d’écriture pour tous les fichiers ouverts sur la partition C: à être vidées et écrites sur le disque. Notez que toute mise en mémoire tampon effectuée par autre chose que le système n’est pas affecté par ce vidage ; n’importe quel fichier mémoire tampon que le runtime C fait sur les fichiers ouverts avec des routines runtime C n’est pas affecté.


Lors de l’ouverture d’un fichier distant sur le réseau, le serveur met en mémoire cache toujours et n’ignore la mise en mémoire tampon aucun indicateur spécifié par le client. Cela est voulu par la conception. Le redirecteur et le serveur ne peut pas implémenter correctement la sémantique complète de FILE_FLAG_NO_BUFFERING sur le réseau. En particulier, les e/s de taille de secteur, aligné sur le secteur ne peut pas être respectées. Par conséquent, lorsqu’une application Win32-demande FILE_FLAG_NO_BUFFERING, le redirecteur et serveur considérer ceci comme une demande pour FILE_FLAG_WRITE_THROUGH. Le fichier n’est pas mis en cache sur le client, écritures vont directement sur le serveur et sur le disque sur le serveur et les tailles en lecture/écriture sur le réseau sont exactement ce que demande l’application. Toutefois, le fichier est mis en cache sur le serveur.


Ne pas de mise en cache du client, un effet différent, en fonction du type d’e/s peut avoir. Éliminer les correspondances dans le cache ou de la lecture anticipée, mais vous pouvez également réduire la taille de transmet et reçoit. En général, pour les e/s séquentielles, il est conseillé de cache sur le client. Pour petit accès aléatoire d’e/s, il est souvent préférable de pas dans le cache.
Propriétés

ID d'article : 99794 - Dernière mise à jour : 12 janv. 2017 - Révision : 1

Commentaires