Oplocks

本节中有关 oplock 的文章主要涉及网络重定向程序,尽管为客户端应用程序提供了一些信息。 可以在 Windows SDK 的机会 文章中找到客户端应用程序的更多 oplock 信息。

Oplock 概述

oplock (机会锁) 是由客户端放置在驻留在服务器上的文件的锁。 在大多数情况下,客户端请求 oplock,以便它可以 在本地缓存数据。 使用远程服务器的客户端上的网络重定向程序以及本地服务器上的客户端应用程序使用 Oplock。 有关各种当前和旧 版 oplock 的说明,请参阅 oplock 的类型。

Oplock 允许文件服务器客户端 (,例如使用 SMB 和 SMB2 协议的客户端,) 以一致的方式动态更改给定文件或 流的 缓冲策略。 使用 oplock 可提高性能并减少网络使用。 若要提高远程文件操作的网络性能,客户端可以在本地缓冲文件数据,从而减少或消除发送和接收网络数据包的需要。 例如:

  • 如果客户端知道没有其他进程正在访问数据,则客户端可能不必将信息写入远程服务器上的文件。
  • 如果客户端知道没有其他进程正在向远程文件写入数据,则客户端可以缓冲远程文件中的预读数据。

应用程序和驱动程序还可以使用 oplock 以透明方式访问文件,而不会影响可能需要使用这些文件的其他应用程序。

NTFS 等文件系统支持每个文件多个数据流。 系统在流句柄上授予 oplock,这意味着为文件流的给定打开授予 oplock,并且操作应用于该流。 少数例外,一个流上的操作不会影响另一个流上的 oplock。 有关详细信息,请参阅 请求和授予 oplock

对于不支持备用数据流的文件系统(如 FAT),当 oplock 讨论引用“stream”时,请考虑“文件”。

oplock 包的核心 oplock 功能主要通过 FsRtlInitializeOplock 等 FsRtlXxx 例程在内核中实现。 文件系统调用此包,以在其文件系统中实现 oplock 功能。 本部分中的 oplock 文章介绍了 NTFS 文件系统如何与内核 oplock 包互操作。 其他文件系统的运行方式类似,但可能存在细微差异。

操作锁键

从 Windows 7 开始,流句柄可以与 oplock 键相关联,oplock 键是一个 GUID 值,用于标识属于同一客户端缓存视图的多个句柄。 更准确地说,oplock 键与流句柄引用的 FILE_OBJECT 结构相关联。 当句柄重复时(例如使用 DuplicateHandle 时),这种区别非常重要。 每个重复句柄都引用相同的基础 FILE_OBJECT 结构。

创建流句柄时,可以将 oplock 密钥 (显式提供给 IoCreateFileEx) 。 如果在创建句柄时未显式指定 oplock 键,其键不同于任何其他句柄上的任何其他键,则系统会将句柄视为具有与之关联的唯一 oplock 键。

当出现错误时,oplock 将中断:

  • 在授予 oplock 的句柄以外的句柄上收到文件操作,AND
  • 与 oplock 的句柄关联的 oplock 键不同于与操作句柄(AND)关联的键
  • 操作与当前授予的 oplock 不兼容。

即使 oplock 是执行不兼容操作的同一进程或线程,也会中断。 例如,当出现时,独占 oplock 会立即中断:

  1. 进程将打开授予独占 oplock 的流。
  2. 然后,同一进程再次使用不同的 (或不使用 oplock 键) 打开同一流。

有关详细信息,请参阅 中断 oplock

请记住,操作锁键存在于句柄上,创建句柄时,它们将“放在”句柄上。 即使未授予 oplock,也可以将句柄与 oplock 键相关联。