ジョブ オブジェクト
ジョブ オブジェクトを使用すると、プロセスのグループを 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 関数を使用します。 ジョブに対して設定できる制限の一覧については、次のトピックを参照してください。
- JOBOBJECT_BASIC_LIMIT_INFORMATION
- JOBOBJECT_BASIC_UI_RESTRICTIONS
- JOBOBJECT_CPU_RATE_CONTROL_INFORMATION
- JOBOBJECT_EXTENDED_LIMIT_INFORMATION
- JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION
セキュリティ制限は、ジョブ オブジェクトに関連付けられているプロセスごとに個別に設定する必要があります。 詳細については、「 プロセスのセキュリティとアクセス権」を参照してください。
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 を呼び出して自身または別の子プロセスをジョブに関連付けようとすると、呼び出しは失敗します。 プロセスが特定のジョブに関連付けられているよう設計されている場合、このエラーによってプロセスが正常に動作しなくなる可能性があります。