INFO: FILE_FLAG_WRITE_THROUGH y FILE_FLAG_NO_BUFFERING

Resumen

El indicador FILE_FLAG_WRITE_THROUGH para CreateFile() hace que cualquier escritura realizada a ese identificador se escriban directamente en el archivo sin está en el búfer. Se almacena en caché los datos (almacenados en la caché de disco); Sin embargo, todavía se escribe directamente en el archivo. Este método permite una operación de lectura en esos datos para satisfacer la solicitud de lectura de datos almacenados en caché (si aún está allí), en lugar de tener que hacer un archivo lee para obtener los datos. La llamada de escritura no vuelve hasta que los datos se escriben en el archivo. Esto aplica a la escritura remota--las pasadas de redirector de red el FILE_FLAG_WRITE_THROUGH marcar al servidor para que el servidor no sepa para satisfacer la solicitud de escritura hasta que los datos se escriben en el archivo.


El FILE_FLAG_NO_BUFFERING lleva esto un paso de concepto más y elimina todo el búfer de lectura anticipada archivo y así, la caché de disco de modo que se garantizan que todas las lecturas vienen desde el archivo y no desde cualquier búfer de sistema o de la caché de disco. Lecturas de disco cuando utilice FILE_FLAG_NO_BUFFERING, escrituras deben realizarse en los límites del sector y direcciones de búfer deben estar alineadas en los sectores del disco en la memoria.


Estas restricciones son necesarias porque el búfer que pasar a la lectura o escritura de API se utiliza directamente para i/OS a nivel de dispositivo; en ese nivel, sus direcciones de búfer y tamaños de sector deben cumplir las restricciones de alineación de procesador y media del hardware en que se ejecuta.

Más información

El Windows 95 CDFS (sistema de archivos de CD-ROM) no admite el marcador FILE_FLAG_NO_BUFFERING para CreateFile(). Mientras un FSD de Windows 95, como VFAT, puede implementarlo, FILE_FLAG_NO_BUFFERING no es un marcador de controladores del sistema de archivos y que no es compatible con CDFS.


Este fragmento de código muestra cómo alinear los datos en un búfer de sector y pasarla a 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);


El puntero p es sectores alineados y señala en el búfer.


Si tienes una situación donde desee vaciar todos los archivos abiertos en la unidad lógica actual, esto puede hacerse:

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

Este método hace que todos los datos almacenados en el búfer de escritura para todos los archivos abiertos en la partición C: se vacían y se escriben en el disco. Tenga en cuenta que cualquier almacenamiento en búfer realizado por algo más que el sistema no está afectado por esta nivelado; cualquier archivo posible el almacenamiento en búfer hace que el tiempo de ejecución de C en archivos abiertos con las rutinas de tiempo de ejecución de C no se ve afectado.


Al abrir un archivo remoto en la red, el servidor almacena en caché siempre y no omite el ningún indicador de búfer especificado por el cliente. Esto es por diseño. El redirector y el servidor no pueden implementar correctamente la semántica completa de FILE_FLAG_NO_BUFFERING en la red. En particular, no es posible cumplir el requisito de i/OS tamaño de sector, sectores alineados. Por lo tanto, cuando una aplicación basada en Win32-solicita FILE_FLAG_NO_BUFFERING, el redirector y el servidor tratan este elemento como una solicitud para FILE_FLAG_WRITE_THROUGH. El archivo no se almacena en caché en el cliente, escrituras ir directamente al servidor y al disco en el servidor y los tamaños de lectura y escritura en la red son exactamente lo que pide la aplicación. Sin embargo, el archivo se almacena en caché en el servidor.


No almacenar en caché al cliente puede tener un efecto diferente, dependiendo del tipo de i/OS. Eliminar los aciertos de caché o lectura anticipada, pero también puede reducir el tamaño de transmite y recibe. En general, la e/s secuencial, es una buena idea en caché en el cliente. Acceso pequeñas y aleatorias i/OS, a menudo es mejor no en caché.
Propiedades

Id. de artículo: 99794 - Última revisión: 12 ene. 2017 - Revisión: 1

Comentarios