Partilhar via


Oplocks e redirecionadores de rede

Os redirecionadores de rede usam bloqueios oportunistas (oplocks) para otimizar o desempenho de acesso a arquivos e reduzir o tráfego de rede em ambientes cliente-servidor.

Esta documentação destina-se a desenvolvedores de redirecionadores de rede, embora algumas informações se apliquem a desenvolvedores de aplicativos cliente. Para obter mais documentação de oplock relacionada a aplicativos cliente, consulte os artigos Bloqueios oportunistas do SDK do Windows.

Visão geral do Oplock

Um oplock (bloqueio oportunista) é um bloqueio que um cliente coloca em um arquivo que reside em um servidor. Na maioria dos casos, um cliente solicita um oplock para que possa armazenar dados em cache localmente. Os redirecionadores de rede em clientes com servidores remotos usam oplocks, assim como aplicativos cliente em servidores locais. Consulte Tipos de oplocks para obter uma descrição dos vários oplocks atuais e legados.

Os Oplocks permitem que clientes de servidor de arquivos (como clientes que usam os protocolos SMB e SMB2) alterem dinamicamente a estratégia de buffer para um determinado arquivo ou fluxo de maneira consistente. O uso de oplocks aumenta o desempenho e reduz o uso da rede. Para aumentar o desempenho da rede para operações de arquivos remotos, um cliente pode armazenar dados de arquivos em buffer localmente, o que reduz ou elimina a necessidade de enviar e receber pacotes de rede. Por exemplo:

  • Um cliente pode não ter que gravar informações em um arquivo em um servidor remoto se o cliente souber que nenhum outro processo está acessando os dados.
  • Um cliente pode armazenar em buffer dados de leitura antecipada do arquivo remoto se o cliente souber que nenhum outro processo está gravando dados no arquivo remoto.

Aplicativos e drivers também podem usar oplocks para acessar arquivos de forma transparente sem afetar outros aplicativos que possam precisar usar esses arquivos.

Sistemas de arquivos como NTFS suportam vários fluxos de dados por arquivo. O sistema concede oplocks em identificadores de fluxo, o que significa que o sistema concede o oplock para uma determinada abertura de um fluxo de arquivos e as operações se aplicam a esse fluxo. Com poucas exceções, as operações em um fluxo não afetam os oplocks em um fluxo diferente. Para obter mais informações, consulte Solicitando e concedendo oplocks.

Para sistemas de arquivos que não suportam fluxos de dados alternativos, como o FAT, considere "arquivo" quando as discussões sobre oplock se referirem a "fluxo".

O kernel implementa a funcionalidade oplock principal do pacote oplock, principalmente através de rotinas FsRtlXxx como FsRtlInitializeOplock. Os sistemas de ficheiros chamam este pacote para implementar a funcionalidade oplock no seu próprio sistema de ficheiros. Os artigos oplock nesta seção descrevem como o sistema de arquivos NTFS interopera com o pacote oplock do kernel. Outros sistemas de arquivos funcionam de maneira semelhante, embora possa haver pequenas diferenças.

Teclas Oplock

Você pode associar o identificador de fluxo a uma chave oplock, que é um valor GUID que identifica vários identificadores pertencentes à mesma vista de cache do cliente. É mais preciso dizer que a tecla oplock está associada à estrutura FILE_OBJECT à qual o identificador de fluxo se refere. Essa distinção é importante quando duplicas o identificador, tal como DuplicateHandle. Cada um dos descritores duplicados refere-se à mesma estrutura subjacente de FILE_OBJECT.

Você pode fornecer explicitamente a chave oplock (para IoCreateFileEx) ao criar o identificador de fluxo. Se você não especificar explicitamente uma chave oplock na criação da alça, o sistema tratará a alça como tendo uma chave oplock exclusiva associada a ela. Esta chave exclusiva difere de qualquer outra chave em qualquer outra alça.

Um oplock quebra quando todas as seguintes condições forem verdadeiras:

  • Uma operação de arquivo é recebida em um identificador diferente daquele em que foi concedido o oplock.
  • A chave oplock associada ao identificador do oplock difere da chave associada ao identificador da operação.
  • A operação não é compatível com o oplock concedido atualmente.

O oplock quebra mesmo se o mesmo processo ou thread executar a operação incompatível. Por exemplo, um oplock exclusivo quebra imediatamente quando:

  1. Um processo abre um fluxo para o qual é concedido um oplock exclusivo.
  2. Esse mesmo processo abre o mesmo fluxo novamente usando uma tecla oplock diferente (ou não).

Para obter mais informações, consulte Quebrando bloqueios.

Lembre-se de que as teclas oplock existem nas alças, e você as "coloca" na alça quando a cria. Você pode associar um identificador a uma chave oplock mesmo que nenhum oplocks seja concedido.