次の方法で共有


入れ子になったジョブ

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

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

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

  • 入れ子になったジョブ階層 する
  • 入れ子になったジョブ階層の作成
  • 入れ子になったジョブ のジョブ制限と通知の
  • 入れ子になったジョブ リソース アカウンティング
  • 入れ子になったジョブ 終了

ジョブおよびジョブ・オブジェクトに関する一般的な情報については、ジョブ・オブジェクト を参照してください。

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

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

図 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アクセス権が必要です。