Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico aborda as várias considerações para o controle de aplicação do armazenamento em buffer de arquivos, também conhecido como entrada/saída (E/S) de arquivo não armazenado em buffer. O buffer de arquivos geralmente é tratado pelo sistema, nos bastidores, e é considerado parte do cache de arquivos dentro do sistema operativo Windows, a menos que especificado de outra forma. Embora os termos cache e buffering às vezes sejam usados de forma intercambiável, este tópico usa o termo buffering especificamente no contexto de explicar como interagir com dados que não estão sendo armazenados em cache (buffer) pelo sistema, onde, de outra forma, está em grande parte fora do controle direto de aplicativos de modo de usuário.
Visão geral
Ao abrir ou criar um arquivo com a função CreateFile , o sinalizador FILE_FLAG_NO_BUFFERING pode ser especificado para desabilitar o cache do sistema de dados que estão sendo lidos ou gravados no arquivo. Embora isso dê controle completo e direto sobre o buffer de E/S de dados, no caso de arquivos e dispositivos semelhantes, há requisitos de alinhamento de dados que devem ser considerados.
Observação
Essas informações de alinhamento se aplicam à E/S em dispositivos como arquivos que suportam a procura e o conceito de ponteiros de posição de arquivo (ou offsets). Para dispositivos que não procuram, como pipes nomeados ou dispositivos de comunicação, desligar o buffer pode não exigir nenhum alinhamento específico. Quaisquer limitações ou ganhos de eficiência que possam ser obtidos pelo alinhamento, nesse caso, dependem da tecnologia subjacente.
Em um exemplo simples, o aplicativo abriria um arquivo para acesso de gravação com o sinalizador FILE_FLAG_NO_BUFFERING e, em seguida, executaria uma chamada para a função WriteFile usando um buffer de dados definido no aplicativo. Esse buffer local é, nessas circunstâncias, efetivamente o único buffer de arquivo que existe para essa operação. Devido ao layout do disco físico, ao layout de armazenamento do sistema de arquivos e ao rastreamento da posição do ponteiro do arquivo no nível do sistema, essa operação de gravação falhará, a menos que os buffers de dados definidos localmente atendam a determinados critérios de alinhamento, discutidos na seção a seguir.
Observação
A discussão sobre cache não considera qualquer cache de hardware no próprio disco físico, que não é garantido estar sob o controle direto do sistema em qualquer caso. Isso não tem efeito sobre os requisitos especificados neste tópico.
Para obter mais informações sobre como FILE_FLAG_NO_BUFFERING interage com outros sinalizadores relacionados ao cache, consulte CreateFile.
Requisitos de alinhamento e acesso a arquivos
Como discutido anteriormente, um aplicativo deve atender a certos requisitos ao trabalhar com arquivos abertos com FILE_FLAG_NO_BUFFERING. Aplicam-se as seguintes especificidades:
- Os tamanhos de acesso a arquivos, incluindo o deslocamento de arquivo opcional na estrutura OVERLAPPED , se especificado, devem ser para um número de bytes que seja um múltiplo inteiro do tamanho do setor de volume. Por exemplo, se o tamanho do setor for 512 bytes, um aplicativo pode solicitar leituras e gravações de 512, 1.024, 1.536 ou 2.048 bytes, mas não de 335, 981 ou 7.171 bytes.
- Os endereços do buffer de acesso a arquivos para operações de leitura e gravação devem estar alinhados ao setor físico, o que significa alinhados em endereços na memória que são múltiplos inteiros do tamanho do setor físico do volume. Dependendo do disco, esse requisito pode não ser imposto.
Os desenvolvedores de aplicativos devem tomar nota dos novos tipos de dispositivos de armazenamento que estão sendo introduzidos no mercado com um tamanho de setor de mídia física de 4.096 bytes. O nome da indústria para estes dispositivos é "Formato Avançado". Como pode haver problemas de compatibilidade com a introdução direta de 4.096 bytes como a unidade de endereçamento para a mídia, uma solução de compatibilidade temporária é introduzir dispositivos que emulam um dispositivo de armazenamento de setor regular de 512 bytes, mas disponibilizam informações sobre o tamanho real do setor por meio de comandos ATA e SCSI padrão.
Como resultado dessa emulação, existem essencialmente dois tamanhos de setor que os desenvolvedores precisarão entender:
- Setor lógico: A unidade que é usada para endereçamento de bloco lógico nos meios de armazenamento. Também podemos pensar nele como a menor unidade de escrita que o armazenamento pode aceitar. Esta é a "emulação".
- Setor físico: A unidade para a qual as operações de leitura e gravação no dispositivo são concluídas em uma única operação. Esta é a unidade de escrita atómica, e a I/O não bufferizado precisará ser alinhada a esta unidade de forma a garantir um desempenho ideal e características de fiabilidade.
A maioria das APIs atuais do Windows, como IOCTL_DISK_GET_DRIVE_GEOMETRY e GetDiskFreeSpace, retornará o tamanho do setor lógico, mas o tamanho do setor físico pode ser recuperado por meio do código de controle IOCTL_STORAGE_QUERY_PROPERTY , com as informações relevantes contidas no membro BytesPerPhysicalSector na estrutura STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR . Para obter um exemplo, consulte o código de exemplo em STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR. A Microsoft recomenda enfaticamente que os desenvolvedores alinhem E/S sem buffer ao tamanho do setor físico, conforme relatado pelo código de controle IOCTL_STORAGE_QUERY_PROPERTY, para ajudar a garantir que seus aplicativos estejam preparados para essa transição de tamanho de setor.
Windows Server 2003 e Windows XP: A estrutura STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR não está disponível. Foi introduzido com o Windows Vista e Windows Server 2008.
Como os endereços de buffer para operações de leitura e gravação devem ser alinhados por setor, o aplicativo deve ter controle direto de como esses buffers são alocados. Uma maneira de alinhar buffers de setor é usar a função VirtualAlloc para alocar os buffers. Considere o seguinte:
- VirtualAlloc aloca memória alinhada em endereços que são múltiplos inteiros do tamanho da página do sistema. O tamanho da página é de 4.096 bytes em x64 e x86 ou 8.192 bytes para sistemas baseados em Itanium. Para obter informações adicionais, consulte a função GetSystemInfo .
- O tamanho do setor é normalmente de 512 a 4.096 bytes para dispositivos de armazenamento de acesso direto (discos rígidos) e 2.048 bytes para CD-ROMs.
- Tanto o tamanho da página como o tamanho do setor são poderes de 2.
Portanto, na maioria das situações, a memória alinhada à página também será alinhada por setor, porque o caso em que o tamanho do setor é maior do que o tamanho da página é raro.
Outra maneira de obter buffers de memória alinhados manualmente é usar a função _aligned_malloc da biblioteca Run-Time C. Para obter um exemplo de como controlar manualmente o alinhamento do buffer, consulte o exemplo de código da linguagem C++ na seção Código de exemplo de WriteFile.