Condividi tramite


Oplock e reindirizzamenti di rete

I reindirizzamenti di rete usano blocchi opportunistici (oplock) per ottimizzare le prestazioni di accesso ai file e ridurre il traffico di rete negli ambienti client-server.

Questa documentazione è destinata agli sviluppatori di reindirizzamento di rete, anche se alcune informazioni si applicano agli sviluppatori di applicazioni client. Per altre documentazione di oplock relative alle applicazioni client, vedere gli articoli Opportunistic Locks di Windows SDK.

Panoramica di Oplock

Un blocco oplock (blocco opportunistico) è un blocco posizionato da un client in un file che risiede in un server. Nella maggior parte dei casi, un client richiede un oplock in modo che possa memorizzare i dati nella cache in locale. Gli oplock vengono usati dai reindirizzamenti di rete nei client con server remoti e dalle applicazioni client nei server locali. Per una descrizione dei vari oplock correnti e legacy, vedere Tipi di oplock .

Gli oplock consentono ai client di file server (ad esempio i client che usano i protocolli SMB e SMB2) di modificare dinamicamente la strategia di buffering per un determinato file o flusso in modo coerente. L'uso di oplock aumenta le prestazioni e riduce l'uso della rete. Per migliorare le prestazioni di rete per le operazioni sui file remoti, un client può memorizzare nel buffer i dati dei file in locale, riducendo o eliminando la necessità di inviare e ricevere pacchetti di rete. Ad esempio:

  • Un client potrebbe non dover scrivere informazioni in un file in un server remoto se il client sa che nessun altro processo accede ai dati.
  • Un client può memorizzare nel buffer i dati read-ahead dal file remoto se il client sa che nessun altro processo sta scrivendo dati nel file remoto.

Le applicazioni e i driver possono anche usare oplock per accedere in modo trasparente ai file senza influire sulle altre applicazioni che potrebbero dover usare questi file.

I file system come NTFS supportano più flussi di dati per file. Il sistema concede oplock sugli handle di flusso, il che significa che l'oplock viene concesso per un determinato apertura di un flusso di file e le operazioni si applicano a tale flusso. Con poche eccezioni, le operazioni su un flusso non influiscono sugli oplock in un flusso diverso. Per altre informazioni, vedere Richiesta e concessione di oplock.

Per i file system che non supportano flussi di dati alternativi, ad esempio FAT, si pensi a "file" quando le discussioni di oplock fanno riferimento a "flusso".

La funzionalità di oplock principale del pacchetto oplock viene implementata nel kernel, principalmente tramite routine FsRtlXxx, ad esempio FsRtlInitializeOplock. I file system chiamano questo pacchetto per implementare la funzionalità oplock nel file system. Gli articoli di oplock in questa sezione descrivono come il file system NTFS interagisce con il pacchetto oplock del kernel. Altri file system funzionano in modo simile, anche se potrebbero esserci piccole differenze.

Chiavi oplock

L'handle di flusso può essere associato a una chiave oplock, ovvero un valore GUID che identifica più handle appartenenti alla stessa visualizzazione cache client. È più accurato dire che la chiave oplock è associata alla struttura FILE_OBJECT a cui fa riferimento l'handle di flusso. Questa distinzione è importante quando l'handle viene duplicato, ad esempio con DuplicateHandle. Ogni handle duplicato fa riferimento alla stessa struttura di FILE_OBJECT sottostante.

La chiave oplock può essere specificata in modo esplicito (a IoCreateFileEx) quando viene creato l'handle di flusso. Se una chiave oplock non viene specificata in modo esplicito durante la creazione dell'handle, il sistema considera l'handle come associato a una chiave oplock univoca. Questa chiave univoca è diversa da qualsiasi altra chiave su qualsiasi altro handle.

Un oplock viene interrotto quando:

  • Un'operazione di file viene ricevuta su un handle diverso da quello in cui è stato concesso l'oplock, AND
  • La chiave oplock associata all'handle dell'oplock è diversa dalla chiave associata all'handle dell'operazione, AND
  • L'operazione non è compatibile con l'oplock attualmente concesso.

L'oplock si interrompe anche se si tratta dello stesso processo o thread che esegue l'operazione incompatibile. Ad esempio, un oplock esclusivo viene interrotto immediatamente quando:

  1. Un processo apre un flusso per il quale viene concesso un oplock esclusivo.
  2. Lo stesso processo apre quindi di nuovo lo stesso flusso usando un tasto oplock diverso (o no).

Per altre informazioni, vedere Interruzione di oplock.

Tenere presente che le chiavi oplock esistono negli handle e vengono "attivate" l'handle quando viene creato l'handle. È possibile associare un handle a una chiave oplock anche se non viene concesso alcun oplock.