ジョブ オブジェクト

ジョブ オブジェクトを使用すると、プロセスのグループを 1 つの単位として管理できます。 ジョブ オブジェクトは、それらに関連付けられているプロセスの属性を制御する、ナマブル、セキュリティ保護可能、共有可能なオブジェクトです。 ジョブ オブジェクトに対して実行される操作は、そのジョブ オブジェクトに関連付けられているすべてのプロセスに影響します。 たとえば、ワーキング セットのサイズやプロセスの優先順位などの制限の適用や、ジョブに関連付けられているすべてのプロセスの終了などがあります。

ジョブの作成

ジョブ オブジェクトを作成するには、 CreateJobObject 関数を使用します。 ジョブが作成されると、プロセスはジョブに関連付けされません。

プロセスをジョブに関連付けるには、 AssignProcessToJobObject 関数を使用します。 プロセスがジョブに関連付けられた後、関連付けを切断することはできません。 プロセスは、入れ子になったジョブの階層内の複数のジョブに関連付けることができます。 詳細については、「 入れ子になったジョブ」を参照してください。

Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista、Windows Server 2003: プロセスを関連付けることができるジョブは 1 つだけです。 ジョブを入れ子にすることはできません。 ジョブを入れ子にする機能は、Windows 8とWindows Server 2012に追加されました。

CreateJobObject 関数を呼び出すときに、ジョブ オブジェクトのセキュリティ記述子を指定できます。 詳細については、「 ジョブ オブジェクトのセキュリティとアクセス権」を参照してください。

ジョブでのプロセスの管理

プロセスがジョブに関連付けられた後、既定では、 CreateProcess を使用して作成されるすべての子プロセスもジョブに関連付けられます。 (Win32_Processを使用して作成された子プロセス 。Create はジョブに関連付けられません)。この既定の動作は、ジョブの拡張制限JOB_OBJECT_LIMIT_BREAKAWAY_OKまたはJOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OKを設定することで変更できます。

  • ジョブに拡張制限JOB_OBJECT_LIMIT_BREAKAWAY_OKがあり、親プロセスが CREATE_BREAKAWAY_FROM_JOB フラグを使用して作成された場合、親プロセスの子プロセスはジョブに関連付けられません。
  • ジョブに拡張制限JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OKがある場合、ジョブに関連付けられている親プロセスの子プロセスはジョブに関連付けられません。 CREATE_BREAKAWAY_FROM_JOB フラグを使用して親プロセスを作成する必要はありません。

ジョブが入れ子になっている場合、階層内の親ジョブの中断設定は、階層内の別のジョブに子プロセスが関連付けられているかどうかに影響します。 詳細については、「 入れ子になったジョブ」を参照してください。

ジョブでプロセスが実行されているかどうかを確認するには、 IsProcessInJob 関数を使用します。

ジョブ オブジェクトに現在関連付けられているすべてのプロセスを終了するには、 TerminateJobObject 関数を使用します。

ジョブの制限と通知

ジョブは、ジョブに関連付けられている各プロセスに対して、ワーキング セットサイズ、プロセス優先度、ジョブ終了時間制限などの制限を適用できます。 ジョブに関連付けられたプロセスが、ジョブによって確立された制限からワーキング セットのサイズまたはプロセスの優先順位を増やそうとすると、関数は成功しますが、サイレントモードで無視されます。 ジョブは、超過した場合に通知をトリガーする制限を設定することもできますが、ジョブの実行を続行できます。

ジョブの制限を設定するには、 SetInformationJobObject 関数を使用します。 ジョブに設定できる制限の一覧については、次のトピックを参照してください。

セキュリティ制限は、ジョブ オブジェクトに関連付けられているプロセスごとに個別に設定する必要があります。 詳細については、「 プロセス のセキュリティとアクセス権」を参照してください。

SP3 および Windows Server 2003 の Windows XP:SetInformationJobObject 関数を使用すると、ジョブ オブジェクトに関連付けられているすべてのプロセスのセキュリティ制限を設定できます。 Windows Vista 以降では、ジョブ オブジェクトに関連付けられているプロセスごとにセキュリティ制限を個別に設定する必要があります。

ジョブが入れ子になっている場合、階層内の親ジョブは、ジョブに適用される制限に影響します。 詳細については、「 入れ子になったジョブ」を参照してください。

ジョブに関連付けられた I/O 完了ポートがある場合は、特定のジョブ制限を超えたときに通知を受け取ることができます。 制限を超えた場合、または他のイベントが発生した場合、システムはメッセージを完了ポートに送信します。 完了ポートをジョブに関連付けるには、 SetInformationJobObject 関数を、ジョブ オブジェクト情報クラス JobObjectAssociateCompletionPortInformation、JOBOBJECT_ASSOCIATE_COMPLETION_PORT 構造体へのポインターと共に使用します。 ジョブが非アクティブな場合は、完了ポートの関連付け中に状態が変化するプロセスに対して通知が表示されない可能性を減らすのが最善です。

すべてのメッセージは、ジョブが PostQueuedCompletionStatus 関数を呼び出したかのように、ジョブから直接送信されます。 スレッドは 、GetQueuedCompletionStatus 関数を使用して完了ポートを監視してメッセージを取得する必要があります。 JobObjectNotificationLimitInformation 情報クラスで設定された制限を除き、完了ポートへのメッセージの配信は保証されないことに注意してください。メッセージの到着の失敗は、必ずしもイベントが発生しなかったことを意味するとは限りません。 JobObjectNotificationLimitInformation で設定された制限の通知は、完了ポートに到達することが保証されます。 可能なメッセージの一覧については、「 JOBOBJECT_ASSOCIATE_COMPLETION_PORT」を参照してください。

ジョブのリソースアカウンティング

ジョブ オブジェクトは、終了したプロセスを含め、関連付けられているすべてのプロセスの基本的なアカウンティング情報を記録します。 このアカウンティング情報を取得するには、 QueryInformationJobObject 関数を使用します。 ジョブに対して管理されるアカウンティング情報の一覧については、次のトピックを参照してください。

ジョブ オブジェクトが入れ子になっている場合は、各子ジョブのアカウンティング情報がその親ジョブに集計されます。 詳細については、「 入れ子になったジョブ」を参照してください。

ジョブ オブジェクトの管理

ジョブ オブジェクトの状態は、指定されたジョブの終了時間制限を超えたために、すべてのプロセスが終了したときにシグナルに設定されます。 WaitForSingleObject または WaitForSingleObjectEx を使用して、このイベントのジョブ オブジェクトを監視します。

既存のジョブ オブジェクトのハンドルを取得するには、 OpenJobObject 関数を使用し、作成時にオブジェクトに指定された名前を指定します。 名前付きジョブ オブジェクトのみを開くことができます。

ジョブ オブジェクト ハンドルを閉じるには、 CloseHandle 関数を使用します。 ジョブは、最後のハンドルが閉じられ、関連付けられているすべてのプロセスが終了すると破棄されます。 ただし、ジョブに JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE フラグが指定されている場合、最後のジョブ オブジェクト ハンドルを閉じると、関連付けられているすべてのプロセスが終了し、ジョブ オブジェクト自体が破棄されます。 入れ子になったジョブに JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE フラグが指定されている場合、最後のジョブ オブジェクト ハンドルを閉じると、階層内のジョブとその子ジョブに関連付けられているすべてのプロセスが終了します。

ジョブ オブジェクトを使用するプロセス ツリーの管理

Windows 8およびWindows Server 2012以降、アプリケーションは入れ子になったジョブを使用して、複数のジョブ オブジェクトを使用するプロセス ツリーを管理できます。 ただし、入れ子になったジョブをサポートしていない Windows 7、Windows Server 2008 R2、またはそれ以前のバージョンの Windows で実行する必要があるアプリケーションは、他の方法でプロセス ツリーを管理する必要があります。

ジョブ オブジェクトを使用するプロセス ツリーをツールで管理する必要があり、入れ子になったジョブを使用できない場合は、ツールとプロセス ツリーのメンバーの両方が連携する必要があります。 次のいずれかのオプションを使用します。

  • JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK制限を使用します。 ツールでこの制限が使用されている場合、プロセス ツリー全体を監視することはできません。 このツールは、ジョブに追加するプロセスのみを監視できます。 これらのプロセスが子プロセスを作成する場合、ジョブには関連付けられません。 このオプションでは、子プロセスを他のジョブ オブジェクトに関連付けることができます。

  • JOB_OBJECT_LIMIT_BREAKAWAY_OK制限を使用します。 この制限を使用する場合、ツリーのメンバーがツリーから明示的に中断するプロセスを除き、プロセス ツリー全体を監視できます。 ツリーのメンバーは、CREATE_BREAKAWAY_FROM_JOB フラグを指定して CreateProcess 関数を呼び出し、 AssignProcessToJobObject 関数を呼び出すことによって、新しいジョブ オブジェクトに子プロセスを作成できます。 それ以外の場合、メンバーは AssignProcessToJobObject が失敗したケースを処理する必要があります。

    ツリーがツールによって監視されていない場合、CREATE_BREAKAWAY_FROM_JOB フラグは無効です。 したがって、これは推奨されるオプションですが、監視対象のプロセスに関する事前の知識が必要です。

  • JOB_OBJECT_LIMIT_BREAKAWAY_OKとJOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OKの両方の制限を設定して、あらゆる種類の中断を防ぎます。 このオプションでは、ツールでプロセス ツリー全体を監視できます。 ただし、子プロセスが AssignProcessToJobObject を呼び出して自身または別の子プロセスをジョブに関連付けようとすると、呼び出しは失敗します。 プロセスが特定のジョブに関連付けられているよう設計されている場合、このエラーによってプロセスが正常に動作しなくなる可能性があります。