ほとんどのデバイスドライバで、ロック構成を簡潔に保つことをお勧めします。追加のロックを使用すると並行性が向上しますが、オーバーヘッドが増加します。ロックの使用数を減らすと消費時間が減少しますが、並行性は低下します。一般的な目安として、データ構造ごとに 1 つの mutex を、ドライバが待機する必要があるイベントまたは条件ごとに 1 つの条件変数を、ドライバ単位でグローバルな主要データセットごとに 1 つの mutex を使用します。長期間にわたって mutex を保持しないでください。ロック構成を選択するときは次のガイドラインを使用します。
エントリポイントのマルチスレッド動作のうち、十分な利点が得られるものを使用します。
すべてのエントリポイントを再入可能にします。静的変数を自動変数に変更することにより、共有データの量を減らすことができます。
ドライバで複数の mutex を取得する場合は、すべてのコードパスで、同じ順序で mutex を取得および解放します。
同じ関数空間の内部でロックを保持および解放します。
KM_SLEEP を指定した kmem_alloc(9F) のように、ブロックの可能性がある DDI インタフェースを呼び出すときはドライバ mutex を保持しないようにします。
ロックの使用状態を確認するには、lockstat(1M) を使用します。lockstat(1M) はすべてのカーネルロックイベントを監視し、イベントの頻度およびタイミングデータを収集し、データを表示します。
マルチスレッド操作の詳細は、Multithreaded Programming Guide を参照してください。