入れ子になったジョブ

アプリケーションでは、入れ子になったジョブを使用してプロセスのサブセットを管理できます。 入れ子になったジョブを使用すると、ジョブを使用するアプリケーションでも、ジョブを使用する他のアプリケーションをホストできます。

Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista、Windows Server 2003: プロセスは、1 つのジョブにのみ関連付けることができます。 入れ子になったジョブは、Windows 8とWindows Server 2012で導入されました。

このトピックでは、ジョブの入れ子の概要と、入れ子になったジョブの動作について説明します。

ジョブとジョブ オブジェクトの一般的な情報については、「 ジョブ オブジェクト」を参照してください。

入れ子になったジョブ階層

入れ子になったジョブには親子関係があり、各子ジョブには親ジョブ内のプロセスのサブセットが含まれています。 ジョブに既に存在するプロセスが別のジョブに追加されている場合、システムが有効なジョブ階層を形成でき、どちらのジョブも UI 制限を設定できない場合、ジョブは既定で入れ子になります (JobObjectBasicUIRestrictions を使用した SetInformationJobObject)。

図 1 は、P0 から P7 というラベルが付いたプロセスのツリーを含むジョブ階層を示しています。 ジョブ 1 はジョブ 2 とジョブ 4 の 親ジョブ であり、ジョブ 3 の 先祖 です。 ジョブ 2 は、ジョブ 3 の 直接の親 です。ジョブ 3 は、ジョブ 2 の 直接の子です 。 ジョブ 1、2、および 3 は 、ジョブ 1 と 2 がジョブ 3 の 親ジョブ チェーンであるジョブ チェーン を形成します。 ジョブ チェーンの終了ジョブは、そのジョブ内のプロセスの 即時 ジョブです。 図 1 のジョブ 3 は、プロセス P2、P3、および P4 の即時ジョブです。

図 1.プロセス ツリーを含む入れ子になったジョブ階層

入れ子になったジョブを使用して、ピア プロセスのグループを管理することもできます。 図 2 に示すジョブ階層では、ジョブ 1 はジョブ 2 の親ジョブです。 ジョブ階層には、プロセス ツリーの一部のみが含まれる場合があることに注意してください。 図 2 では、P0 は階層内にありませんが、その子プロセス P1 から P5 はです。

図 2.ピア プロセスを含む入れ子になったジョブ階層

入れ子になったジョブ階層の作成

ジョブ階層内のプロセスは、 AssignProcessToJobObject 関数を使用してジョブ オブジェクトに明示的に関連付けられるか、スタンドアロン ジョブの場合と同じように、プロセスの作成時に暗黙的に関連付けられます。 ジョブが作成され、プロセスが割り当てられる順序によって、階層を作成できるかどうかが決まります。

明示的な関連付けを使用してジョブ階層を構築するには、 CreateJobObject を使用してすべてのジョブ オブジェクトを作成する必要があります。その後、各プロセスに対して AssignProcessToJobObject を複数回呼び出して、プロセスを属する必要がある各ジョブに関連付ける必要があります。 ジョブ階層が有効であることを確認するには、まず階層のルートにあるジョブにすべてのプロセスを割り当て、次にプロセスのサブセットを直接の子ジョブ オブジェクトに割り当てます。 プロセスがこの順序でジョブに割り当てられている場合、階層の作成中に子ジョブには常にプロセスのサブセットが含まれます。これは入れ子に必要です。 プロセスがランダムな順序でジョブに割り当てられている場合、ある時点で子ジョブには親ジョブに含まれていないプロセスがあります。 これは入れ子にして許可されず、 AssignProcessToJobObject が失敗します。

プロセスの作成時にプロセスがジョブに暗黙的に関連付けられている場合、子プロセスは親プロセスのジョブ チェーン内のすべてのジョブに関連付けられます。 イミディエイト ジョブ オブジェクトで中断が許可されている場合、子プロセスはイミディエイト ジョブ オブジェクトと親ジョブ チェーン内の各ジョブから切り離され、中断を許可しないジョブに到達するまで階層を上に移動します。 イミディエイト ジョブ オブジェクトが中断を許可しない場合、親ジョブ チェーン内のジョブで許可されていても、子プロセスは中断されません。

入れ子になったジョブのジョブ制限と通知

特定のリソース制限では、親ジョブ チェーン内のジョブに設定された制限によって、子ジョブに適用される 有効な制限 が決まります。 子ジョブの有効な制限は、その親の制限よりも制限が厳しい場合がありますが、制限を小さくすることはできません。 たとえば、子ジョブの優先度クラスがABOVE_NORMAL_PRIORITY_CLASSされ、その親ジョブの優先度クラスがNORMAL_PRIORITY_CLASS場合、子ジョブ内のプロセスの有効な制限はNORMAL_PRIORITY_CLASS。 ただし、子ジョブの優先度クラスがBELOW_NORMAL_PRIORITY_CLASS場合、子ジョブ内のプロセスの有効な制限はBELOW_NORMAL_PRIORITY_CLASS。 優先度クラス、アフィニティ、コミット料金、プロセスごとの実行時間制限、スケジュール クラスの制限、ワーキング セットの最小値と最大値に対して有効な制限が適用されます。 特定のリソース制限の詳細については、「SetInformationJobObject」を参照してください。

新しいプロセスの作成やリソース制限違反などの特定のイベントが発生すると、ジョブに関連付けられている I/O 完了ポートにメッセージが送信されます。 ジョブは、特定の制限を超えたときに通知を受け取るために登録することもできます。 入れ子になっていないジョブの場合、メッセージはジョブに関連付けられている I/O 完了ポートに送信されます。 入れ子になったジョブの場合、メッセージは、メッセージをトリガーしたジョブの親ジョブ チェーン内のジョブに関連付けられているすべての I/O 完了ポートに送信されます。 子ジョブには、トリガーするメッセージの I/O 完了ポートが関連付けられている必要はありません。これは、ジョブ チェーン内の上位の親ジョブの I/O 完了ポートに送信されます。 特定のメッセージの詳細については、「 JOBOBJECT_ASSOCIATE_COMPLETION_PORT」を参照してください。

入れ子になったジョブのリソースアカウンティング

入れ子になったジョブのリソースアカウンティング情報は、子ジョブ内のプロセスを含め、そのジョブに関連付けられているすべてのプロセスの使用状況を記述します。 したがって、ジョブ チェーン内の各ジョブは、独自のプロセスによって使用される集計されたリソースと、ジョブ チェーン内のその下のすべての子ジョブのプロセスを表します。

入れ子になったジョブの終了

ジョブ階層内のジョブが終了すると、階層の下部にある子ジョブから開始して、そのジョブとそのすべての子ジョブのプロセスが終了します。 終了した各プロセスで使用される未処理のリソースは、親ジョブに課金されます。

ジョブ ハンドルには、スタンドアロン ジョブの場合と同じJOB_OBJECT_TERMINATEアクセス権が必要です。