Almacenamiento en caché de archivos

De forma predeterminada, Windows almacena en caché los datos de archivo que se leen de discos y se escriben en discos. Esto implica que las operaciones de lectura leen datos de archivo de un área en la memoria del sistema conocida como caché de archivos del sistema, en lugar de desde el disco físico. En consecuencia, las operaciones de escritura escriben datos de archivo en la memoria caché de archivos, en lugar de en el disco. Este tipo de caché se conoce como caché de reescritura. El almacenamiento en caché se administra por objeto de archivo.

El almacenamiento en caché se produce bajo la dirección del administrador de caché, que funciona continuamente mientras Se ejecuta Windows. Los datos de archivo de la caché de archivos del sistema se escriben en el disco a intervalos determinados por el sistema operativo y la memoria usada anteriormente por esos datos de archivo se libera, lo que se conoce como vaciado de la memoria caché. La directiva de retrasar la escritura de los datos en el archivo y mantenerla en la memoria caché hasta que se vacía la memoria caché se denomina escritura diferida y la desencadena el administrador de caché en un intervalo de tiempo determinado. La hora a la que se vacía un bloque de datos de archivo se basa, parcialmente, en la cantidad de tiempo que ha estado almacenado en la memoria caché y la cantidad de tiempo desde la última vez que se accedió a los datos en una operación de lectura. Esto garantiza que los datos de archivo que se suelen leer con frecuencia seguirán accesibles en la caché de archivos del sistema durante la cantidad máxima de tiempo.

Este proceso de almacenamiento en caché de datos de archivos se muestra en la ilustración siguiente.

proceso de almacenamiento en caché de datos de archivos

Como se muestra en las flechas sólidas de la ilustración anterior, se lee una región de datos de 256 KB en una memoria caché de 256 KB en el espacio de direcciones del sistema cuando el administrador de caché lo solicita por primera vez durante una operación de lectura de archivos. A continuación, un proceso en modo de usuario copia los datos de esta ranura en su propio espacio de direcciones. Cuando el proceso ha finalizado su acceso a los datos, escribe los datos modificados en la misma ranura de la memoria caché del sistema, como se muestra mediante la flecha de puntos entre el espacio de direcciones del proceso y la memoria caché del sistema. Cuando el administrador de caché ha determinado que los datos ya no serán necesarios durante un período de tiempo determinado, escribe los datos modificados en el archivo del disco, como se muestra en la flecha punteada entre la memoria caché del sistema y el disco.

La cantidad de mejora del rendimiento de E/S que ofrece el almacenamiento en caché de datos de archivos depende del tamaño del bloque de datos de archivo que se va a leer o escribir. Cuando se leen y escriben grandes bloques de datos de archivo, es más probable que las lecturas y escrituras de disco sean necesarias para finalizar la operación de E/S. El rendimiento de E/S se verá cada vez más afectado, ya que se produce más de este tipo de operación de E/S.

En estas situaciones, se puede desactivar el almacenamiento en caché. Esto se hace en el momento en que se abre el archivo pasando FILE_FLAG_NO_BUFFERING como un valor para el parámetro dwFlagsAndAttributes de CreateFile. Cuando el almacenamiento en caché está deshabilitado, todas las operaciones de lectura y escritura acceden directamente al disco físico. Sin embargo, es posible que los metadatos del archivo todavía se almacenen en caché. Para vaciar los metadatos en el disco, use la función FlushFileBuffers .

La frecuencia con la que se produce el vaciado es una consideración importante que equilibra el rendimiento del sistema con la confiabilidad del sistema. Si el sistema vacía la memoria caché con demasiada frecuencia, el número de operaciones de escritura grandes incurre en una disminución significativa del rendimiento del sistema. Si el sistema no se vacía con frecuencia suficiente, la probabilidad es mayor de que la memoria del sistema se agote por la memoria caché o que se produzca un error repentino del sistema (por ejemplo, una pérdida de energía en el equipo) antes del vaciado. En la última instancia, se perderán los datos almacenados en caché.

Para asegurarse de que se produce la cantidad correcta de vaciado, el administrador de caché genera un proceso cada segundo denominado escritor diferido. El proceso de escritura diferida pone en cola un octavo de las páginas que no se han vaciado recientemente para escribirse en el disco. Vuelve a evaluar constantemente la cantidad de datos que se vacían para obtener un rendimiento óptimo del sistema y, si es necesario escribir más datos, pone en cola más datos. Los escritores diferidos no vacían los archivos temporales, ya que la aplicación o el sistema los eliminarán.

Algunas aplicaciones, como el software de comprobación de virus, requieren que sus operaciones de escritura se vacíen en el disco inmediatamente; Windows proporciona esta capacidad a través del almacenamiento en caché de escritura. Un proceso habilita el almacenamiento en caché de escritura para una operación de E/S específica pasando la marca FILE_FLAG_WRITE_THROUGH a su llamada a CreateFile. Con el almacenamiento en caché de escritura habilitado, los datos se siguen escribiendo en la memoria caché, pero el administrador de caché escribe los datos inmediatamente en el disco en lugar de incurrir en un retraso mediante el escritor diferido. Un proceso también puede forzar el vaciado de un archivo que ha abierto llamando a la función FlushFileBuffers .

Los metadatos del sistema de archivos siempre se almacenan en caché. Por lo tanto, para almacenar los cambios de metadatos en el disco, el archivo debe vaciarse o abrirse con FILE_FLAG_WRITE_THROUGH.