Share via


Blocchi opportunistici (oplock)

Gli articoli sugli oplock disponibili in questa sezione riguardano principalmente i reindirizzamenti di rete, anche se alcune informazioni sono fornite per le applicazioni client. Altre informazioni su oplock per le applicazioni client sono disponibili negli articoli Blocchi opportunistici di Windows SDK.

Panoramica di Oplock

Un blocco oplock (blocco opportunistico) è un blocco inserito 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 nella cache i dati 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 file server (ad esempio 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 aumentare le prestazioni di rete per le operazioni remote sui file, 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 ogni file. Il sistema concede oplock sugli handle di flusso, il che significa che l'oplock viene concesso per una determinata 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

A partire da Windows 7, l'handle di flusso può essere associato a una chiave oplock, ovvero un valore GUID usato per identificare più handle che appartengono alla stessa visualizzazione cache client. È più accurato dire che la chiave di 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. Il sistema considera l'handle come una chiave di oplock univoca associata se una chiave oplock non viene specificata in modo esplicito quando viene creato l'handle, in cui la chiave differisce da qualsiasi altra chiave in qualsiasi altro handle.

Un oplock viene interrotto quando:

  • Viene ricevuta un'operazione di file su un handle diverso da quello in cui è stato concesso l'oplock, AND
  • La chiave oplock associata all'handle di 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 blocco operativo 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 una chiave oplock diversa (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.