Compartilhar via


Oplocks e redirecionadores de rede

Os redirecionadores de rede usam bloqueios oportunistas (oplocks) para otimizar o desempenho do 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 ele possa armazenar dados em cache localmente. 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 herdados.

Os oplocks permitem que os clientes do 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 poderá 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 poderá 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 talvez precisem 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 abertura específica de um fluxo de arquivo, e as operações se aplicam a esse fluxo. Com poucas exceções, as operações em um fluxo não afetam oplocks em um fluxo diferente. Para obter mais informações, consulte Solicitar e conceder oplocks.

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

O kernel implementa a funcionalidade de oplock principal do pacote oplock, principalmente por meio de rotinas FsRtlXxx , como FsRtlInitializeOplock. Os sistemas de arquivos chamam esse pacote para implementar a funcionalidade oplock em seu sistema de arquivos. 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.

Chaves de oplock

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

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 do identificador, o sistema tratará o identificador como tendo uma chave oplock exclusiva associada a ela. Essa chave exclusiva difere de qualquer outra chave em qualquer outro identificador.

Um oplock é interrompido quando todas as seguintes condições são verdadeiras:

  • Uma operação de arquivo é recebida em um identificador diferente daquele em que o oplock foi concedido.
  • 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 no momento.

O oplock é interrompido mesmo que o mesmo processo ou thread execute a operação incompatível. Por exemplo, um oplock exclusivo é interrompido imediatamente quando:

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

Para obter mais informações, confira Corromper oplocks.

Lembre-se de que as chaves oplock existem nas alças e você as "coloca" no identificador ao criá-la. Você pode associar um identificador a uma chave oplock mesmo que nenhum oplock seja concedido.