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 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 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 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 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".
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 de oplock
O identificador de fluxo pode ser associado a uma chave oplock, que é um valor GUID que identifica vários identificadores pertencentes à 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 um dos identificadores duplicados refere-se à mesma estrutura FILE_OBJECT subjacente.
A chave oplock pode ser fornecida explicitamente (para IoCreateFileEx) quando o identificador de fluxo é criado. Se uma chave oplock não for especificada explicitamente na criação do identificador, o sistema tratará o identificador como tendo uma chave oplock exclusiva associada a ele. Essa chave exclusiva difere de qualquer outra chave em qualquer outro identificador.
Um oplock é corrompido quando:
- Uma operação de arquivo é recebida em um identificador diferente daquele no qual o oplock foi concedido, E
- A chave oplock associada ao identificador do oplock difere daquela associada ao identificador da operação, E
- A operação não é compatível com o oplock concedido no momento.
O oplock é interrompido mesmo se for o mesmo processo ou thread que executa a operação incompatível. Por exemplo, um oplock exclusivo é interrompido imediatamente quando:
- Um processo abre um fluxo para o qual um oplock exclusivo é concedido.
- Esse mesmo processo abre o mesmo fluxo novamente usando uma chave oplock diferente (ou nenhuma).
Para obter mais informações, confira Corromper oplocks.
Lembre-se de que as chaves oplock existem nos identificadores e são "colocadas" no identificador quando ele é criado. Você pode associar um identificador a uma chave oplock mesmo que nenhum oplock seja concedido.