Oplocks 和網路重新導向器
網路重新導向器會使用機會鎖定 (oplocks) 將檔案存取效能優化,並減少用戶端伺服器環境中的網路流量。
本檔適用於網路重新導向器開發人員,不過有些資訊適用於用戶端應用程式開發人員。 如需與用戶端應用程式相關的更多 oplock 檔,請參閱 Windows SDK 的機會 鎖定 文章。
Oplock 概觀
作業鎖定(機會鎖定)是客戶端在位於伺服器上的檔案上所放置的鎖定。 在大部分情況下,用戶端會要求oplock,讓它可以在 本機快取數據。 Oplock 是由具有遠端伺服器之用戶端上的網路重新導向器,以及本機伺服器上的用戶端應用程式使用。 如需各種目前和舊版 oplock 的描述,請參閱 oplock 的類型。
Oplocks 允許檔案伺服器用戶端(例如使用 SMB 和 SMB2 通訊協定的用戶端)以一致的方式動態改變指定檔案或 數據流 的緩衝策略。 使用 oplock 可提升效能並減少網路使用量。 若要提高遠端檔案作業的網路效能,用戶端可以在本機緩衝處理檔案數據,這樣可減少或排除傳送和接收網路封包的需求。 例如:
- 如果用戶端知道沒有其他進程正在存取數據,用戶端可能不必將資訊寫入遠端伺服器上的檔案。
- 如果用戶端知道沒有其他進程將數據寫入遠端檔案,則用戶端可以緩衝處理遠端檔案的預先讀取數據。
應用程式和驅動程式也可以使用 oplocks 以透明方式存取檔案,而不會影響可能需要使用這些檔案的其他應用程式。
NTFS 等檔系統支援每個檔案的多個數據流。 系統會在數據流句柄上授與 oplock,這表示會為指定的檔案數據流開啟授與 oplock,而且作業會套用至該數據流。 除了少數例外狀況,一個數據流上的作業不會影響不同數據流上的 oplock。 如需詳細資訊,請參閱 要求和授與 oplocks。
對於不支援替代數據流的文件系統,例如 FAT,當 oplock 討論參考「數據流」時,請考慮「檔案」。
oplock 套件的核心 oplock 功能是在核心中實作,主要是透過 FsRtl Xxx 例程,例如 FsRtlInitializeOplock。 文件系統會呼叫此套件,以在其文件系統中實作 oplock 功能。 本節中的 oplock 文章說明 NTFS 文件系統如何與核心 oplock 套件互通。 其他文件系統會以類似的方式運作,但可能會有輕微的差異。
Oplock 金鑰
數據流句柄可以與 oplock 索引鍵相關聯,這是 GUID 值,可識別屬於相同用戶端快取檢視的多個句柄。 更準確地說 oplock 索引鍵與數據流句柄所參考的FILE_OBJECT結構相關聯。 當句柄重複時,這項區別很重要,例如使用 DuplicateHandle。 每個重複的句柄都會參考相同的基礎 FILE_OBJECT 結構。
建立數據流句柄時,可以明確提供 oplock 機碼(至 IoCreateFileEx)。 如果在建立句柄時未明確指定 oplock 索引鍵,系統會將句柄視為具有與其相關聯的唯一 Oplock 索引鍵。 這個唯一索引鍵與任何其他句柄上的任何其他索引鍵不同。
當下列情況下,oplock 會中斷:
- 除了授與 oplock 的句柄以外,還會收到檔案作業, AND
- 與 oplock 句柄相關聯的 oplock 索引鍵與作業句柄相關聯的索引鍵不同, AND
- 作業與目前授與的oplock不相容。
即使作業是執行不相容作業的相同進程或線程,oplock 也會中斷。 例如,獨佔 oplock 會在下列情況下立即中斷:
- 進程會開啟授與獨佔 oplock 的數據流。
- 相同的程式接著會使用不同的 (或否) oplock 金鑰再次開啟相同的數據流。
如需詳細資訊,請參閱 中斷 oplocks。
請記住,控點上存在 oplock 索引鍵,而且會在建立句柄時「開啟」句柄。 即使未授與任何 oplock,您也可以將句柄與 oplock 密鑰產生關聯。