Condividi tramite


Tipi di blocchi opportunistici

Le operazioni di blocco opportunistiche funzionano con quattro tipi di blocchi opportunistici: livello 1, livello 2, batch e filtro. I blocchi opportunistici esclusivi sono blocchi di livello 1, batch e filtro. Se un thread ha un tipo di blocco esclusivo in un file, non può avere anche un blocco di livello 2 sullo stesso file.

Blocchi opportunistici di livello 1

Un blocco opportunistico di livello 1 su un file consente a un client di leggere in anticipo nel file e memorizzare nella cache sia i dati di lettura e scrittura dal file in locale. Purché il client abbia accesso esclusivo a un file, non vi è alcun pericolo per la coerenza dei dati nel fornire un blocco opportunistico di livello 1.

Il client può richiedere un blocco opportunistico di livello 1 dopo l'apertura di un file. Se nessun altro client (o nessun altro thread nello stesso client) ha il file aperto, il server può concedere il blocco opportunistico. Il client può quindi memorizzare nella cache i dati di lettura e scrittura dal file in locale. Se un altro client ha aperto il file, il server rifiuta il blocco opportunistico e il client non esegue la memorizzazione nella cache locale. Il server può rifiutare anche il blocco opportunistico per altri motivi, ad esempio non supportando blocchi opportunistici.

Quando il server apre un file che dispone già di un blocco opportunistico di livello 1, il server esamina lo stato di condivisione del file prima di interrompere il blocco opportunistico di livello 1. Se il server interrompe il blocco dopo questo esame, il tempo durante il quale il client con il blocco precedente impiega lo scaricamento della cache di scrittura è il momento in cui il client che richiede il file deve attendere. Questa spesa per il tempo significa che i blocchi opportunistici di livello 1 devono essere evitati nei file aperti da molti client.

Tuttavia, poiché il server controlla lo stato di condivisione prima che interrompa il blocco, nel caso in cui il server negherebbe una richiesta aperta a causa di un conflitto di condivisione, il server non interrompe il blocco. Ad esempio, se è stato aperto un file, è stata negata la condivisione per le operazioni di scrittura e si è ottenuto un blocco di livello 1, il server nega la richiesta di un altro client di aprire il file per la scrittura prima di esaminare anche il blocco sul file. In questo caso, il blocco opportunistico non viene interrotto.

Per un esempio del funzionamento di un blocco opportunistico di livello 1, vedere Esempio di blocco opportunistico di livello 1. Per altre informazioni sull'interruzione dei blocchi opportunistici, vedere Breaking Opportunistic Locks.For more information on breaking opportunistic locks, see Breaking Opportunistic Locks.

Blocchi opportunistici di livello 2

Un blocco opportunistico di livello 2 informa un client che sono presenti più client simultanei di un file e che nessuno lo ha ancora modificato. Questo blocco consente al client di eseguire operazioni di lettura e ottenere attributi di file usando informazioni locali memorizzate nella cache o read-ahead, ma il client deve inviare tutte le altre richieste (ad esempio per le operazioni di scrittura) al server. L'applicazione deve usare il blocco opportunistico di livello 2 quando si prevede che altre applicazioni scrivono nel file in modo casuale o leggono il file in modo casuale o sequenziale.

Un blocco opportunistico di livello 2 è molto simile a un blocco opportunistico del filtro. Nella maggior parte dei casi, l'applicazione deve usare il blocco opportunistico di livello 2. Usare il blocco filtro solo se non si desidera che le operazioni aperte per la lettura causi violazioni della modalità di condivisione nell'intervallo di tempo tra l'apertura del file dell'applicazione e la ricezione del blocco. Per altre informazioni, vedere Filtrare i blocchi opportunistici e la risposta del server alle richieste aperte nei file bloccati.

Per altre informazioni sull'interruzione dei blocchi opportunistici, vedere Breaking Opportunistic Locks.For more information on breaking opportunistic locks, see Breaking Opportunistic Locks.

Blocchi opportunistici batch

Un blocco opportunistico batch modifica le aperture e le chiusura dei file. Ad esempio, nell'esecuzione di un file batch, il file batch può essere aperto e chiuso una volta per ogni riga del file. Un blocco opportunistico batch apre il file batch nel server e lo mantiene aperto. Quando il processore dei comandi "apre" e "chiude" il file batch, il redirector di rete intercetta i comandi di apertura e chiusura. Tutti i server ricevono i comandi seek e read. Se il client sta anche leggendo in anticipo, il server riceve una particolare richiesta di lettura al massimo una volta.

Quando si apre un file che dispone già di un blocco opportunistico batch, il server controlla lo stato di condivisione del file dopo l'interruzione del blocco. Questo controllo consente al titolare del blocco di completare lo svuotamento della cache e di chiudere l'handle del file. Un'operazione aperta tentata durante il controllo di condivisione non causa l'esito negativo del controllo di condivisione se il titolare del blocco rilascia il blocco.

Per un esempio del funzionamento di un blocco opportunistico batch, vedere Esempio di blocco opportunistico di Batch. Per altre informazioni sull'interruzione dei blocchi opportunistici, vedere Breaking Opportunistic Locks.For more information on breaking opportunistic locks, see Breaking Opportunistic Locks.

Filtrare i blocchi opportunistici

Un blocco opportunistico del filtro blocca un file in modo che non possa essere aperto per l'accesso in scrittura o eliminazione. Tutti i client devono essere in grado di condividere il file. I blocchi di filtro consentono alle applicazioni di eseguire operazioni di filtro non invasive sui dati dei file, ad esempio un compilatore che apre il codice sorgente o un programma di catalogazione.

Un blocco opportunistico del filtro differisce da un blocco opportunistico di livello 2 in quanto consente l'esecuzione di operazioni aperte per la lettura senza violazioni della modalità di condivisione nell'intervallo di tempo tra l'apertura del file dell'applicazione e la ricezione del blocco. Il blocco opportunistico del filtro è il blocco migliore da usare quando è importante consentire ad altri client di leggere l'accesso. In altri casi, l'applicazione deve usare un blocco opportunistico di livello 2. Un blocco opportunistico del filtro differisce da un blocco opportunistico batch in quanto non consente la gestione di più aperture e chiusura da parte del reindirizzamento di rete nel modo in cui viene eseguito un blocco opportunistico batch.

L'applicazione deve richiedere un blocco opportunistico del filtro in un file in tre passaggi:

  1. Utilizzare la funzione CreateFile per aprire un handle al file con il parametro DesiredAccess impostato su zero, che indica che non è possibile accedere e il parametro dwShareMode impostato sul flag FILE_SHARE_READ per consentire la condivisione per la lettura. L'handle ottenuto a questo punto viene chiamato handle di blocco.
  2. Richiedere un blocco su questo handle con il codice di controllo FSCTL_REQUEST_FILTER_OPLOCK .
  3. Quando viene concesso il blocco, usare CreateFile per aprire di nuovo il file con DesiredAccess impostato sul flag GENERIC_READ . Impostare dwShareMode sul flag FILE_SHARE_READ per consentire ad altri utenti di leggere il file mentre è aperto, il flag FILE_SHARE_DELETE per consentire ad altri utenti di contrassegnare il file per l'eliminazione mentre è aperto o entrambi. L'handle ottenuto a questo punto viene chiamato handle di lettura.

Usare l'handle di lettura per leggere o scrivere nel contenuto del file.

Quando si apre un file che dispone già di un blocco opportunistico del filtro, il server interrompe il blocco e quindi controlla lo stato di condivisione del file. Questo controllo consente al client che ha mantenuto il blocco opportunistico precedente di abbandonare i dati memorizzati nella cache e di confermare l'interruzione. Un'operazione aperta tentata durante questo controllo di condivisione non causa l'esito negativo del controllo di condivisione se il precedente titolare del blocco rilascia il blocco. Il file system mantiene abeyance l'operazione di apertura fino a quando il proprietario del blocco chiude sia l'handle di lettura che l'handle di blocco. Al termine, la richiesta aperta dell'altro client può continuare.

Per altre informazioni sull'interruzione dei blocchi opportunistici, vedere Breaking Opportunistic Locks.For more information on breaking opportunistic locks, see Breaking Opportunistic Locks.