サイエンスパーク株式会社

サイト内検索
お問い合わせ
デバドラ講座

レポート11 スケジューリングと割り込み要求レベル

デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。

【 デバドラ講座11 : スケジューリングと割り込み要求レベル 】

1.スケジューリングと割り込み要求レベル(IRQL)

Windowsで実行の優先順位は割り込みとスケジューリングの二つに分けられます。割り込み要求レベル(IRQL:Interrupt ReQuest Level)を表1に示します。カーネル内ではIRQLは番号で表されており、この数値が高ければ高いほど実行の優先順位も高くなります。例えば、PROFILE_LEVELの処理が行われている際、CLOCK1_LEVELの処理要求があったとすると、CLOCK1_LEVELの処理は割り込んで実行されます。スケジューリングはPASSIVE_LEVEL内で行われるため、割り込みより優先順位が低くなります。

表1:割り込み要求レベル
表1:割り込み要求レベル

割り込みとスケジューリングは別物という事を覚えておく必要があります。また、ハードウェアの割り込みの優先順位はソフトウェアの割り込みより高いです。デバイスドライバはDIRQL以下の割り込みレベルを使用します。デバイスドライバはDIRQLより上の割り込み要求レベルには関与できないので、デバイスドライバ開発に関係のあるDIRQL 以下の割り込み要求レベルについて説明します。

2.PASSIVE_LEVEL

PASSIVE_LEVELはIRQLの最も低いレベルで、このレベルでスレッドが実行されます。ユーザーモードのプロセスは全てここで実行され、カーネルモードのほとんどのプロセスもここで実行されます。Windowsでは、スレッドの実行は一番低いIRQLで行い、高いIRQLの処理が優先的に実行されるように設計されています。このため、システムのパフォーマンスを高めることができます。

スレッドはスケジューラによって制御されています。スケジューラの優先度は、標準優先度クラスとリアルタイム優先度クラスに分けられます(図1)。リアルタイムクラスは標準クラスより優先順位が高く、これらのクラスには、二つの違いがあります。

図1:優先度クラス
図1:優先度クラス

同じ優先度で実行可能なスレッドが存在する場合、標準優先度クラスにおいてスケジューラはスレッドがクォンタムを使い切るたびにスレッドを切り替えます(図2)。クォンタムとは時間間隔の単位です。一方、リアルタイムクラスでは、同じ優先度で実行可能なスレッドが存在したとしても、実行しているスレッドが完了してから、他のスレッドを実行します(図3)。また、標準優先度クラスでは基本となる優先度のプラスマイナス2の範囲で、優先度を変更することができます。

図2.標準優先度クラス
図2.標準優先度クラス
図3.リアルタイムクラス
図3.リアルタイムクラス

同じクラス(標準優先度クラス、リアルタイムクラス)内では、優先度の高いスレッドから処理が行われます。優先度の高いスレッドの処理が行われている際に、優先度の低いスレッドの処理の要求が来たとします(図4)。すると、高い優先度スレッドの処理はそのまま実行され、優先度の低いスレッドはキューに貯められます。キューは、先に入力したデータが先に出力する、First In First Out(FIFO)という入出力方式を持ったデータ構造です。優先度の高いスレッドの処理が完了すると、キューに貯まったスレッドを要求があった順に処理を行います。図4では、要求1、要求2の順番で処理されます。

図4:要求処理の例
図4:要求処理の例

3.APC_LEVEL

APC_LEVELはユーザーモードで非同期処理時に使用される実行レベルです。ドライバ開発に関わりはありますが、深く関係していないので、ここでは説明を省略します。

4.DISPATCH_LEVEL

DISPATCH_LEVELはソフトウェア割り込みの最高レベルで、カーネルモードでのみ実行されます。DPC(遅延プロシージャコール)の処理、ディスパッチャの実行を行います。ディスパッチャとはWindows NTのスケジューラです。ドライバのディスパッチルーチンはPASSIVE_LEVELで行われます。ディスパッチルーチンとディスパッチレベルを混乱しないようにしなければなりません。デバイスドライバの非同期に関わる処理がこのレベルで実行されています。

5.DIRQL

DIRQLはデバイスIRQLとも呼ばれています。このレベルでは、デバイスからのハードウェア割り込み処理の際に使用されます。ドライバの中での割り込みルーチンはこのレベルで実行されています。あるドライバがDIRQLに多くの時間を費やすと、システム全体のパフォーマンスが落ちるので、最小限の処理のみ行い、残りの処理はDISPATCH_LEVELで行います。

参考資料

「NTドライバプログラミング」
Peter G. Viscarola、W. Anthony Mason著 久保雅俊、三浦秀朗訳 サイエンスパーク株式会社 監修
「Windows NTデバイスドライバプログラミング」
アート・ベーカー著 WinProgDDK ML和訳プロジェクト訳
「WDMデバイスドライバプログラミング完全ガイド」上、下
Edword N. Dekker, Jpseph M. Newcomer著 株式会社クイック訳
「WDMデバイスドライバ」
Chris Cant著 エクストランス株式会社訳 サイエンスパーク株式会社 監修