常に割り込み可能で常に中断可能
オペレーティング システムのプリエンプト可能・割り込み可能な設計の目的は、システムのパフォーマンスを最大化することです。 どのスレッドも優先度の高いスレッドによって割り込むことが可能で、ドライバーの割り込みサービス ルーチン (ISR) は、より高い割り込み要求レベル (IRQL) で実行されるルーチンによる割り込みが可能です。
カーネル コンポーネントは、次のいずれかの優先順位付け基準に従って、コード シーケンスが実行されるタイミングを決定します。
スレッドのカーネル定義のランタイム優先順位スキーム。
システム内のすべてのスレッドには、優先順位属性が関連付けられています。 一般に、ほとんどのスレッドには 可変 優先度属性があります。これらは常に優先され、現在同じ優先度レベルにある他のすべてのスレッドでラウンド ロビンを実行するようにスケジュールされています。 一部のスレッドには リアルタイム 優先度属性があります。これらのタイム クリティカルなスレッドは、より高いリアルタイム優先度属性を持つスレッドによって割り込まれる場合を除き、完了まで実行されます。 Microsoft Windows アーキテクチャでは、本質的にリアルタイム システムは提供されません。
優先順位属性が何であれ、ハードウェア割り込みや特定の種類のソフトウェア割り込みが発生すると、システム内のあらゆるスレッドが割り込まれる可能性があります。
特定の割り込みベクトルが特定のプラットフォームで割り当てられるカーネル定義 割り込み要求レベル (IRQL)。
カーネルはハードウェアとソフトウェアの割り込みに優先順位を付け、ほとんどのドライバーを含む一部のカーネル モード コードが高い IRQL で実行されるため、システム内の他のスレッドよりもスケジュールの優先順位が高くなります。 カーネルモード ドライバーコードの一部が実行される特定の IRQL は、その基になるデバイスの ハードウェアの優先順位 によって決定します。
カーネルモード コードは常に中断可能です。IRQL 値が高い割り込みはいつでも発生する可能性があり、これによってシステム割り当て IRQL が高い別のカーネル モード コードがそのプロセッサで直ちに実行されます。 ただし、特定の IRQL でコードの一部が実行されると、カーネルはプロセッサ上の IRQL 値が小さいか等しいすべての割り込みベクトルを隠します。
最も低い IRQL レベルは、PASSIVE_LEVELと言います。 このレベルでは、割り込みベクトルは隠されません。 スレッドは通常、IRQL=PASSIVE_LEVEL で実行されます。 次に高い IRQL レベルは、ソフトウェア割り込み用です。 これらのレベルには、APC_LEVEL、DISPATCH_LEVEL、またはカーネル デバッグ用のWAKE_LEVELが含まれます。 デバイス割り込みの IRQL 値は引き続き高くなります。 カーネルは、システム クロックやバス エラーからの割り込みなど、システム クリティカルな割り込みに対して最も高い IRQL 値を予約します。
これは、ページング可能なコードとして実装されているか、ページング可能なデータにアクセスするためか、一部のカーネル モード コンポーネントによって独自のスレッドが設定されているため、一部のシステム サポート ルーチンはIRQL=PASSIVE_LEVEL で実行されます。
同様に、通常一部の 標準ドライバールーチン はIRQL=PASSIVE_LEVEL で実行されます。 ただし、いくつかの標準ドライバー ルーチンは、IRQL=DISPATCH_LEVEL またはデバイス IRQL ( DIRQLとも呼ばれます) で最下位レベルのドライバーで実行されます。 IRQL の詳細については、「ハードウェア優先度の管理」を参照してください。
ドライバー内のすべてのルーチンは中断可能です。 これには、PASSIVE_LEVELよりも高い IRQL で実行されているルーチンが含まれます。 特定の IRQL で実行されているルーチンは、そのルーチンの実行中に高い IRQL の割り込みが発生しない場合にのみ、プロセッサの制御を保持します。
一部の古いパーソナル コンピューター オペレーティング システムのドライバーとは異なり、Microsoft Windows ドライバーの ISR は、ドライバーの I/O 処理のほとんどを行う大規模で複雑なルーチンではありません。 これは、より高い IRQL で実行される別のルーチン (例えば別の ドライバーの ISR) によって、ドライバーの 割り込みサービス ルーチン (ISR) が中断される可能性があるためです。 したがって、ドライバーの ISR は、実行パスの最初から最後まで、CPU の制御を必ずしも中断せずに保持するとは限りません。
Windows ドライバーではISR は通常、ハードウェア状態情報を保存し、 遅延プロシージャ コール を(DPC)をキューに入れた後にすぐに終了します。 その後、ドライバーが下位 IRQL (DISPATCH_LEVEL) で I/O 操作を完了できるように、ドライバーの DPC キューが解除されます。 システム全体のパフォーマンスを向上させるには、高い IRQL で実行されるすべてのルーチンで、CPU の制御を迅速に放棄する必要があります。
Windows では、すべてのスレッドにスレッド コンテキストがあります。 このコンテキストは、スレッドを所有するプロセスを識別する情報と、スレッドのアクセス権などの他の特性で構成されます。
ドライバーの現在の I/O 操作を要求しているスレッドのコンテキストでは一般的に、最上位レベルのドライバーのみが呼び出されます。 中間レベルまたは最下位レベルのドライバーは、現在の I/O 操作を要求したスレッドのコンテキストで実行されていると想定することはできません。
したがって、ドライバー ルーチンは通常、 任意のスレッド コンテキスト (標準ドライバー ルーチンが呼び出されたときに現在のスレッドのコンテキスト) で実行されます。 パフォーマンス上の理由から (コンテキストの切り替えを回避するために)、独自のスレッドを設定するドライバーはほとんどありません。