INFO: FILE_FLAG_WRITE_THROUGH e FILE_FLAG_NO_BUFFERING

Sumário

O sinalizador FILE_FLAG_WRITE_THROUGH para CreateFile () faz com que as gravações efectuadas a esse identificador para ser escritas directamente o ficheiro sem a ser colocados em memória intermédia. Os dados são colocadas em cache (armazenados na cache de disco); No entanto, ainda é escrito directamente para o ficheiro. Este método permite que uma operação de leitura em que os dados para satisfazer o pedido de leitura de dados em cache (se ainda está), em vez de ter para executar um ficheiro de leitura para obter os dados. A chamada de escrita não regressa até que os dados são escritos no ficheiro. Isto aplica-se para remotos escritas bem – as fases de redireccionador de rede a FILE_FLAG_WRITE_THROUGH sinalizador para o servidor para que o servidor que sabe não para satisfazer o pedido de escrita até que os dados são escritos no ficheiro.


O FILE_FLAG_NO_BUFFERING demora mais este um passo conceito e elimina todos os memória intermédia de leitura antecipada ficheiro e a cache de disco, assim, para que são garantidas que todas as leituras a partir do ficheiro e não a partir de qualquer memória intermédia de sistema ou a cache de disco. Quando utilizar FILE_FLAG_NO_BUFFERING, leituras de disco e escritas tem de ser efectuadas sobre os limites do sector e endereços de memória intermédia devem ser alinhada com os limites do sector de disco na memória.


Estas restrições são necessárias porque a memória intermédia que passar para a leitura ou escrita API é utilizada directamente para e/s ao nível do dispositivo; a esse nível, os endereços de memória intermédia e tamanhos de sector devem satisfazer as restrições de alinhamento de processador e conteúdo multimédia do hardware que está a executar no.

Mais informações

O Windows 95 CDFS (sistema de ficheiros do CD-ROM) não suporta o sinalizador FILE_FLAG_NO_BUFFERING para CreateFile (). Enquanto um Windows 95 FSD, tais como VFAT, poderá executá-la, FILE_FLAG_NO_BUFFERING não é um sinalizador necessária para controladores de sistema de ficheiros e não é suportada por CDFS.


Este fragmento de código demonstra como alinhar dados numa memória intermédia de sector e a transmitem 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);


O ponteiro p é alinhado no sector e pontos situados dentro da memória intermédia.


Se tiver uma situação em que pretende limpar todos os ficheiros abertos na actual unidade lógica, isto pode ser feito:

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

Este método faz com que todos os dados na memória intermédia de escrita para todos os ficheiros abertos na partição c: seja esvaziada e escritos no disco. Tenha em atenção que qualquer memória intermédia efectuada por qualquer outro que não o sistema não é afectada por este encaixe; qualquer ficheiro possíveis memória intermédia que o tempo de execução C está a efectuar ficheiros abertos com rotinas de tempo de execução C não é afectado.


Quando abrir um ficheiro remoto através da rede, o servidor sempre coloca em cache e ignora sem sinalizador na memória intermédia especificado pelo cliente. Isto é propositado. O redireccionador e o servidor não é possível implementar correctamente a semântica completa FILE_FLAG_NO_BUFFERING através da rede. Em especial, não é possível satisfazer o requisito de tamanho de sector, alinhado no sector e/s. Por conseguinte, quando uma aplicação Win32 baseadas pede FILE_FLAG_NO_BUFFERING, o redireccionador e servidor tratam como um pedido para FILE_FLAG_WRITE_THROUGH. O ficheiro não está em cache no cliente, escritas ir directamente para o servidor e para o disco no servidor e os tamanhos de leitura/escrita na rede são exactamente o que a aplicação pede. No entanto, o ficheiro é colocado em cache no servidor.


Não colocar em cache o cliente pode ter um efeito diferente, dependendo do tipo de e/s. Eliminar os acertos na cache ou leitura antecipada, mas também pode reduzir o tamanho de transmitir e receber. Em geral, para sequenciais e/s, é uma boa ideia cache no cliente. Para o acesso aleatório, small e/s, muitas vezes é preferível não à cache.
Propriedades

ID do Artigo: 99794 - Última Revisão: 12/01/2017 - Revisão: 1

Comentários