Oplock

本節中找到的 oplock 相關文章主要與網路重新導向器有關,不過有些資訊是提供給用戶端應用程式。 您可以在 Windows SDK 的 Opportunistic Locks 文章中找到用戶端應用程式的更多 oplock 資訊。

Oplock 概觀

oplock (機會鎖定) 是用戶端在位於伺服器上的檔案上放置的鎖定。 在大部分情況下,用戶端會要求 oplock,使其可以在 本機快取資料。 Oplock 是由具有遠端伺服器之用戶端上的網路重新導向器,以及本機伺服器上的用戶端應用程式使用。 如需各種目前和舊版 oplock 的描述,請參閱 Oplock 的類型。

Oplocks 允許檔案伺服器用戶端 (,例如使用 SMB 和 SMB2 通訊協定的用戶端,) 以一致的方式動態改變指定檔案或 資料流程 的緩衝策略。 使用 oplock 會增加效能並減少網路使用量。 為了增加遠端檔案作業的網路效能,用戶端可以在本機緩衝處理檔案資料,以減少或消除傳送和接收網路封包的需求。 例如:

  • 如果用戶端知道沒有其他進程正在存取資料,則用戶端可能不需要將資訊寫入遠端伺服器上的檔案。
  • 如果用戶端知道沒有其他進程將資料寫入遠端檔案,則用戶端可以緩衝遠端檔案的預先讀取資料。

應用程式和驅動程式也可以使用 oplock 來透明存取檔案,而不會影響可能需要使用這些檔案的其他應用程式。

NTFS 之類的檔案系統支援每個檔案的多個資料流程。 系統會在資料流程控制碼上授與 oplock,這表示會授與指定開啟檔案資料流程的 oplock,而作業會套用至該資料流程。 有少數例外狀況,一個資料流程上的作業不會影響不同資料流程上的 oplock。 如需詳細資訊,請參閱要求和授與 oplock。

對於不支援替代資料流程的檔案系統,例如 FAT,當 oplock 討論參考「串流」時,請考慮「檔案」。

oplock 套件的核心 oplock 功能是在核心中實作,主要是透過FsRtlXxx常式,例如 FsRtlInitializeOplock 檔案系統會呼叫此套件,以在其檔案系統中實作 oplock 功能。 本節中的 oplock 文章說明 NTFS 檔案系統如何與核心 oplock 套件互通。 其他檔案系統會以類似的方式運作,但可能有微差異。

Oplock 金鑰

從 Windows 7 開始,串流控制碼可以與 oplock 機碼相關聯,這是用來識別屬於相同用戶端快取檢視之多個控制碼的 GUID 值。 更精確地說,oplock 索引鍵與資料流程控制碼所參考 的FILE_OBJECT 結構相關聯。 當控制碼重複時,這個區別很重要,例如使用 DuplicateHandle。 每個重複控制碼都參考相同的基礎 FILE_OBJECT 結構。

建立資料流程控制碼時,可以將 oplock 金鑰明確 (提供給 IoCreateFileEx) 。 如果建立控制碼時未明確指定 oplock 機碼,則系統會將控制碼視為具有與其相關聯的唯一 Oplock 金鑰,其中其索引鍵與任何其他控制碼上的任何其他索引鍵不同。

當下列情況下,作業鎖定會中斷:

  • 除了授與 oplock 的控制碼以外,還會收到檔案作業, AND
  • 與 oplock 控制碼相關聯的 oplock 索引鍵與與作業控制碼相關聯的索引鍵不同, AND
  • 作業與目前授與的 oplock 不相容。

即使作業是執行不相容作業的相同進程或執行緒,作業鎖定也會中斷。 例如,獨佔 oplock 會在下列情況下立即中斷:

  1. 進程會開啟授與獨佔 oplock 的資料流程。
  2. 然後,同一個進程會使用不同的 (或沒有) oplock 金鑰再次開啟相同的資料流程。

如需詳細資訊,請參閱中斷作業。

請記住,控制碼上有 oplock 索引鍵存在,而且會在建立控制碼時「放在」控制碼上。 即使未授與 oplock,您也可以將控制碼與 oplock 金鑰產生關聯。