Tipos de bloqueos oportunistas
Las operaciones de bloqueo oportunistas funcionan con cuatro tipos de bloqueos oportunistas: nivel 1, nivel 2, lote y filtro. Los bloqueos oportunistas exclusivos son los bloqueos de nivel 1, lote y filtro. Si un subproceso tiene algún tipo de bloqueo exclusivo en un archivo, tampoco puede tener un bloqueo de nivel 2 en el mismo archivo.
Bloqueos oportunistas de nivel 1
Un bloqueo oportunista de nivel 1 en un archivo permite a un cliente leer por adelantado en el archivo y almacenar en caché tanto datos de lectura anticipada como de escritura desde el archivo localmente. Siempre que el cliente tenga acceso exclusivo a un archivo, no existe peligro para la coherencia de datos al proporcionar un bloqueo oportunista de nivel 1.
El cliente puede solicitar un bloqueo oportunista de nivel 1 después de abrir un archivo. Si ningún otro cliente (o ningún otro subproceso del mismo cliente) tiene abierto el archivo, el servidor puede conceder el bloqueo oportunista. Después, el cliente puede almacenar en caché los datos de lectura y escritura del archivo localmente. Si otro cliente ha abierto el archivo, el servidor rechaza el bloqueo oportunista y el cliente no almacena en caché local. (El servidor puede rechazar el bloqueo oportunista por otras razones, como no admitir bloqueos oportunistas).
Cuando el servidor abre un archivo que ya tiene un bloqueo oportunista de nivel 1, el servidor examina el estado de uso compartido del archivo antes de interrumpir el bloqueo oportunista de nivel 1. Si el servidor interrumpe el bloqueo después de este examen, el tiempo que el cliente con el bloqueo anterior dedica a vaciar su caché de escritura es el tiempo que el cliente que solicita el archivo debe esperar. Este gasto de tiempo significa que los bloqueos oportunistas de nivel 1 deben evitarse en los archivos que muchos clientes abren.
Sin embargo, dado que el servidor comprueba el estado de uso compartido antes de interrumpir el bloqueo, en caso de que el servidor deniegue una solicitud abierta debido a un conflicto de uso compartido, el servidor no interrumpe el bloqueo. Por ejemplo, si ha abierto un archivo, denegado el uso compartido para las operaciones de escritura y ha obtenido un bloqueo de nivel 1, el servidor deniega a otro cliente la solicitud de abrir el archivo para escribir antes de que examine el bloqueo en el archivo. En este caso, el bloqueo oportunista no está roto.
Para obtener un ejemplo de cómo funciona un bloqueo oportunista de nivel 1, vea Ejemplo de bloqueo oportunista de nivel 1. Para obtener más información sobre cómo romper bloqueos oportunistas, vea Bloqueos oportunistas importantes.
Bloqueos oportunistas de nivel 2
Un bloqueo oportunista de nivel 2 informa a un cliente de que hay varios clientes simultáneos de un archivo y que ninguno todavía lo ha modificado. Este bloqueo permite al cliente realizar operaciones de lectura y obtener atributos de archivo mediante información local almacenada en caché o de lectura anticipada, pero el cliente debe enviar todas las demás solicitudes (por ejemplo, para las operaciones de escritura) al servidor. La aplicación debe usar el bloqueo oportunista de nivel 2 cuando se espera que otras aplicaciones escriban en el archivo de forma aleatoria o lean el archivo de forma aleatoria o secuencial.
Un bloqueo oportunista de nivel 2 es muy similar a un bloqueo oportunista de filtro. En la mayoría de los casos, la aplicación debe usar el bloqueo oportunista de nivel 2. Use solo el bloqueo de filtro si no desea que las operaciones abiertas para leer provoquen infracciones del modo de uso compartido en el intervalo de tiempo entre la apertura del archivo de la aplicación y la recepción del bloqueo. Para obtener más información, vea Filtrar bloqueos oportunistas y respuesta del servidor para abrir solicitudes en archivos bloqueados.
Para obtener más información sobre cómo romper bloqueos oportunistas, vea Bloqueos oportunistas importantes.
Bloqueos oportunistas por lotes
Un bloqueo oportunista por lotes manipula aperturas y cierres de archivos. Por ejemplo, en la ejecución de un archivo por lotes, el archivo por lotes se puede abrir y cerrar una vez para cada línea del archivo. Un bloqueo oportunista por lotes abre el archivo por lotes en el servidor y lo mantiene abierto. A medida que el procesador de comandos "abre" y "cierra" el archivo por lotes, el redirector de red intercepta los comandos abiertos y cerrados. Todos los que recibe el servidor son los comandos seek y read. Si el cliente también está leyendo, el servidor recibe una solicitud de lectura determinada como máximo una vez.
Al abrir un archivo que ya tiene un bloqueo oportunista por lotes, el servidor comprueba el estado de uso compartido del archivo después de interrumpir el bloqueo. Esta comprobación proporciona al titular del bloqueo la posibilidad de completar el vaciado de la memoria caché y cerrar el identificador de archivo. Una operación abierta que se intentó durante la comprobación de uso compartido no hace que se produzca un error en la comprobación de uso compartido si el titular del bloqueo libera el bloqueo.
Para obtener un ejemplo de cómo funciona un bloqueo oportunista por lotes, consulte Ejemplo de bloqueo oportunista por lotes. Para obtener más información sobre cómo romper bloqueos oportunistas, vea Bloqueos oportunistas importantes.
Filtrar bloqueos oportunistas
Un bloqueo oportunista de filtro bloquea un archivo para que no se pueda abrir para el acceso de escritura o eliminación. Todos los clientes deben poder compartir el archivo. Los bloqueos de filtro permiten a las aplicaciones realizar operaciones de filtrado nointrusivas en datos de archivo (por ejemplo, un compilador que abre código fuente o un programa de catalogación).
Un bloqueo oportunista de filtro difiere de un bloqueo oportunista de nivel 2 en que permite que las operaciones abiertas para la lectura se produzcan sin infracciones del modo de uso compartido en el intervalo de tiempo entre la apertura del archivo y la recepción del bloqueo. El bloqueo oportunista de filtro es el mejor bloqueo que se debe usar cuando es importante permitir que otros clientes lean acceso. En otros casos, la aplicación debe usar un bloqueo oportunista de nivel 2. Un bloqueo oportunista de filtro difiere de un bloqueo oportunista por lotes en que no permite que el redirector de red controle varias aperturas y cierres de la forma en que lo hace un bloqueo oportunista por lotes.
La aplicación debe solicitar un bloqueo oportunista de filtro en un archivo en tres pasos:
- Use la función CreateFile para abrir un identificador en el archivo con el parámetro DesiredAccess establecido en cero, lo que indica que no hay acceso y el parámetro dwShareMode establecido en la marca FILE_SHARE_READ para permitir el uso compartido para la lectura. El identificador obtenido en este punto se denomina controlador de bloqueo.
- Solicite un bloqueo en este identificador con el código de control FSCTL_REQUEST_FILTER_OPLOCK .
- Cuando se concede el bloqueo, use CreateFile para abrir el archivo de nuevo con DesiredAccess establecido en la marca GENERIC_READ . Establezca dwShareMode en la marca FILE_SHARE_READ para permitir que otros usuarios lean el archivo mientras lo tiene abierto, la marca FILE_SHARE_DELETE para permitir que otros usuarios marquen el archivo para su eliminación mientras lo tiene abierto, o ambos. El identificador obtenido en este punto se denomina identificador de lectura.
Use el identificador de lectura para leer o escribir en el contenido del archivo.
Al abrir un archivo que ya tiene un bloqueo oportunista de filtro, el servidor interrumpe el bloqueo y, a continuación, comprueba el estado de uso compartido del archivo. Esta comprobación proporciona al cliente que tenía el bloqueo oportunista anterior una oportunidad para abandonar los datos almacenados en caché y confirmar la interrupción. Una operación abierta que se intentó durante esta comprobación de uso compartido no hace que se produzca un error en la comprobación de uso compartido si el antiguo titular del bloqueo libera el bloqueo. El sistema de archivos mantiene la operación abierta hasta que el propietario del bloqueo cierra el identificador de lectura y, a continuación, el identificador de bloqueo. Una vez hecho esto, la solicitud abierta del otro cliente puede continuar.
Para obtener más información sobre cómo romper bloqueos oportunistas, vea Bloqueos oportunistas importantes.