ジョブ オブジェクト
ジョブ オブジェクト を使用すると、プロセスのグループを 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を呼び出して自身または別の子プロセスをジョブ関連付けようとすると、呼び出しは失敗します。 プロセスが特定のジョブに関連付けられているよう設計されている場合、このエラーによってプロセスが正常に動作しなくなる可能性があります。