Oplocks

Os artigos sobre oplocks encontrados nesta seção pertencem principalmente aos redirecionadores de rede, embora algumas informações sejam fornecidas para aplicativos cliente. Você pode encontrar mais informações de oplock para aplicativos cliente nos artigos Bloqueios Oportunistas do SDK do Windows.

Visão geral do Oplock

Um oplock (bloqueio oportunista) é um bloqueio colocado por um cliente 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. Os oplocks são usados por redirecionadores de rede em clientes com servidores remotos e por 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 de rede para operações de arquivo remoto, um cliente pode armazenar dados de arquivo em buffer localmente, o que reduz ou elimina a necessidade de enviar e receber pacotes de rede. Por exemplo:

  • Talvez um cliente não precise 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 o NTFS dão suporte a vários fluxos de dados por arquivo. O sistema concede oplocks em identificadores de fluxo, o que significa que o oplock é concedido 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 oplocks em um fluxo diferente. Para obter mais informações, consulte Solicitando e concedendo oplocks.

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

A funcionalidade principal do oplock do pacote oplock é implementada no kernel, 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 oplock

A partir do Windows 7, o identificador de fluxo pode ser associado a uma chave oplock, que é um valor GUID usado para identificar 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 o identificador é duplicado, como com DuplicateHandle. Cada uma das alças duplicadas refere-se à mesma estrutura FILE_OBJECT subjacente.

A chave oplock pode ser fornecida explicitamente (para IoCreateFileEx) quando o identificador de fluxo é criado. O sistema tratará o identificador como tendo uma chave oplock exclusiva associada a ela se uma chave oplock não for especificada explicitamente quando o identificador for criado, em que sua chave difere de qualquer outra chave em qualquer outro identificador.

Um oplock é quebrado quando:

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

O oplock é interrompido mesmo que seja o mesmo processo ou thread executando 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, consulte Quebrando oplocks.

Lembre-se de que as chaves oplock existem em identificadores e elas são "colocadas" no identificador quando o identificador é criado. Você pode associar um identificador a uma chave oplock mesmo que nenhum oplock seja concedido.