2015年1月31日土曜日

Oplockについて

Dokanでは直接Oplockに関与する機会が無いのですが。。。 Windows 8 アプリ対策で必要になりそうな感じですので、少し勉強しました。

SDKとWDKの両方に、別々の情報が有ります。

ーーー
Oplock Semantics - Overview
https://msdn.microsoft.com/ja-jp/library/ff551011(v=vs.85).aspx

ーーー
Types of Opportunistic Locks
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365713(v=vs.85).aspx

4種類のOplockが有ります。
  • Level 1 Oplock -- 先読み許可、遅延書き込み許可。何でも許可。一人だけ取得可能。
  • Level 2 Oplock -- 書き込み者なし。先読み許可。何人でも取得可能。
  • Batch Oplock -- コマンドプロンプトのバッチファイル実行は、一行実行するごとにファイルを閉じる・開くを繰り返しやっている。この様を示して、バッチロック。Close/Openを送らない、省く事で最適化します。
  • Filter Oplock -- 他者による書き込み&削除を拒否。コンパイラがソースコードを読み取り専用でアクセスする様を示して、フィルタロック。

ーーー
Oplockは、共有モード(DenyRead, DenyWrite)とは別の概念です。

Samba3のドキュメントによると、
「Opportunistic lockingは、この機能に対して、実際には妥当ではない名前 である。この機能の真の利点は、クライアントサイドのデータキャッシングであり…」

ーーー
Breaking Opportunistic Locks
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa363786(v=vs.85).aspx

Oplockは一種の権利ですが、剥奪される可能性も有ります。

ーーー
Opportunistic Lock Examples
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365436(v=vs.85).aspx

Oplockの動きについて書かれています。

ーーー
OSによって、使われるIOCTLコードが異なるようです。(詳細は未確認)

Windows 7, 8, 8.1
  • FSCTL_REQUEST_OPLOCK (SDK) (DDK)

Windows Vista, XP, 2000
  • FSCTL_OPBATCH_ACK_CLOSE_PENDING
  • FSCTL_OPLOCK_BREAK_ACK_NO_2
  • FSCTL_OPLOCK_BREAK_ACKNOWLEDGE
  • FSCTL_OPLOCK_BREAK_NOTIFY
  • FSCTL_REQUEST_BATCH_OPLOCK
  • FSCTL_REQUEST_FILTER_OPLOCK
  • FSCTL_REQUEST_OPLOCK_LEVEL_1
  • FSCTL_REQUEST_OPLOCK_LEVEL_2

ーーー
折角Windows 8.1を使っているので、FileTestにてOplockをテストした所、

0x0000012C
ERROR_OPLOCK_NOT_GRANTED
Oplock 要求は拒否されました。

User modeからはダメなのだろうか。

0 件のコメント:

コメントを投稿