Cache de arquivo

Por padrão, o Windows armazena em cache os dados de arquivo que são lidos em discos e gravados em discos. Isso implica que as operações de leitura leem dados de arquivo de uma área na memória do sistema conhecida como cache de arquivos do sistema, em vez do disco físico. Do mesmo modo, as operações de gravação gravam dados de arquivo no cache de arquivo do sistema em vez de no disco, e esse tipo de cache é conhecido como um cache de write-back. O armazenamento em cache é gerenciado por um objeto de arquivo.

Caching ocorre sob a direção do gerenciador de cache, que opera continuamente enquanto Windows está em execução. Os dados de arquivo no cache de arquivos do sistema são gravados no disco em intervalos determinados pelo sistema operacional e a memória usada anteriormente por esses dados de arquivo é liberada. Isso é chamado de liberação do cache. A política de atrasar a gravação dos dados no arquivo e mantê-los no cache até que o cache seja liberado é chamada de gravação lenta e é disparada pelo gerenciador de cache em um intervalo de tempo determinado. A hora na qual um bloco de dados de arquivo é liberado tem base em parte na quantidade de tempo que ele ficou armazenado no cache e na quantidade de tempo desde que os dados foram acessados pela última vez em uma operação de leitura. Isso garante que os dados de arquivos lidos com frequência permaneçam acessíveis no cache de arquivo do sistema pelo máximo de tempo.

Esse processo de cache de dados de arquivo é ilustrado na figura a seguir.

file data caching process

Conforme ilustrado pelas setas sólidas na figura anterior, uma região de dados de 256 KB é lida em um cache de 256 KB "slot" no espaço de endereço do sistema quando ele é solicitado pela primeira vez pelo gerenciador de cache durante uma operação de leitura de arquivo. Em seguida, um processo do modo de usuário copia os dados deste slot em seu próprio espaço de endereço. Após a conclusão do acesso a dados pelo processo, ele grava os dados alterados de volta ao mesmo slot no cache do sistema, como mostrado a seta pontilhada entre o espaço de endereço do processo e o cache do sistema. Quando o gerenciador de cache determinou que os dados não serão mais necessários por um determinado período de tempo, ele grava os dados alterados de volta no arquivo no disco, conforme mostrado pela seta pontilhada entre o cache do sistema e o disco.

A quantidade de melhoria de desempenho de E/S que o cache de dados de arquivo oferece depende do tamanho do bloco de dados do arquivo que está sendo lido ou gravado. Quando grandes blocos de dados de arquivo são lidos e gravados, é mais provável que leituras e gravações de disco sejam necessárias para concluir a operação de E/S. O desempenho de E/S será cada vez mais prejudicado à medida que mais desse tipo de operação de E/S ocorrer.

Nessas situações, o cache pode ser desativado. Isso é feito no momento em que o arquivo é aberto passando FILE_FLAG_NO_BUFFERING como um valor para o parâmetro dwFlagsAndAttributes de CreateFile. Quando o cache é desabilitado, todas as operações de leitura e gravação acessam diretamente o disco físico. No entanto, os metadados do arquivo ainda podem ser armazenados em cache. Para liberar os metadados para o disco, use a função FlushFileBuffers .

A frequência na qual ocorre a liberação é uma consideração importante que equilibra o desempenho do sistema com a confiabilidade do sistema. Se o sistema liberar o cache com muita frequência, o número de grandes operações de gravação que geram incursões prejudicará significativamente o desempenho do sistema. Se o sistema não for liberado com frequência suficiente, a probabilidade é maior de que a memória do sistema seja esgotada pelo cache ou uma falha repentina do sistema (como uma perda de energia para o computador) ocorrerá antes da liberação. Na última instância, os dados armazenados em cache serão perdidos.

Para garantir que a quantidade certa de liberação ocorra, o gerenciador de cache gera um processo a cada segundo chamado de gravador lento. O processo de gravador lento enfileira um oitavo das páginas que não foram liberadas recentemente para serem gravadas em disco. Ele reavalia constantemente a quantidade de dados que estão sendo liberados para o desempenho ideal do sistema e, se mais dados precisarem ser gravados, ele enfileira mais dados. Os gravadores lentos não liberam arquivos temporários, pois a suposição é que eles serão excluídos pelo aplicativo ou pelo sistema.

Alguns aplicativos, como o software de verificação de vírus, exigem que suas operações de gravação sejam liberadas imediatamente para o disco; Windows fornece essa capacidade por meio do cache de gravação. Um processo permite o cache de gravação para uma operação de E/S específica passando o sinalizador FILE_FLAG_WRITE_THROUGH em sua chamada para CreateFile. Com o cache de gravação habilitado, os dados ainda são gravados no cache, mas o gerenciador de cache grava os dados imediatamente no disco em vez de incorrer em um atraso usando o gravador lento. Um processo também pode forçar uma liberação de um arquivo que ele abriu chamando a função FlushFileBuffers .

Os metadados do sistema de arquivos sempre são armazenados em cache. Portanto, para armazenar quaisquer alterações de metadados no disco, o arquivo deve ser liberado ou aberto com FILE_FLAG_WRITE_THROUGH.