JOBOBJECT_BASIC_LIMIT_INFORMATION構造体 (winnt.h)

ジョブ オブジェクトの基本的な制限情報が含まれます。

構文

typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
  LARGE_INTEGER PerProcessUserTimeLimit;
  LARGE_INTEGER PerJobUserTimeLimit;
  DWORD         LimitFlags;
  SIZE_T        MinimumWorkingSetSize;
  SIZE_T        MaximumWorkingSetSize;
  DWORD         ActiveProcessLimit;
  ULONG_PTR     Affinity;
  DWORD         PriorityClass;
  DWORD         SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;

メンバー

PerProcessUserTimeLimit

LimitFlags でJOB_OBJECT_LIMIT_PROCESS_TIMEが指定されている場合、このメンバーはプロセスごとのユーザー モード実行時間制限 (100 ナノ秒ティック単位) です。 それ以外の場合、このメンバーは無視されます。

システムは、ジョブに関連付けられている各プロセスが、設定された制限よりも多くのユーザー モード時間を累積しているかどうかを定期的に確認します。 ある場合、プロセスは終了します。

ジョブが入れ子になっている場合、有効な制限はジョブ チェーン内で最も制限の厳しい制限です。

PerJobUserTimeLimit

LimitFlags でJOB_OBJECT_LIMIT_JOB_TIMEが指定されている場合、このメンバーはジョブごとのユーザー モード実行時間制限 (100 ナノ秒ティック単位) です。 それ以外の場合、このメンバーは無視されます。

システムは、ジョブに関連付けられているプロセスの現在の時刻をこの制限に追加します。 たとえば、この制限を 1 分に設定し、ジョブに 5 分のユーザー モード時間が累積されたプロセスがある場合、実際に適用される制限は 6 分です。

システムは、すべてのプロセスのユーザー モード実行時間の合計がこのジョブの終了制限を超えるかどうかを定期的に確認します。 その場合、JOBOBJECT_END_OF_JOB_TIME_INFORMATION構造体の EndOfJobTimeAction メンバーで指定されたアクションが実行されます。既定では、すべてのプロセスが終了し、状態コードが ERROR_NOT_ENOUGH_QUOTA に設定されます。

プロセスを終了せずにこの制限を超えたときに通知を登録するには、JobObjectNotificationLimitInformation 情報クラスで SetInformationJobObject 関数を使用します。

LimitFlags

有効な制限フラグ。 このメンバーは、他の構造体メンバーを使用するかどうかを決定するビットフィールドです。 次の値の任意の組み合わせを指定できます。

説明
JOB_OBJECT_LIMIT_ACTIVE_PROCESS
0x00000008
ジョブに関連付けられている同時にアクティブなプロセスの最大数を確立します。 ActiveProcessLimit メンバーには追加情報が含まれています。
JOB_OBJECT_LIMIT_AFFINITY
0x00000010
ジョブに関連付けられているすべてのプロセスが同じプロセッサ アフィニティを使用するようにします。 Affinity メンバーには追加情報が含まれています。

ジョブが入れ子になっている場合、指定されたプロセッサ アフィニティは、親ジョブの有効なアフィニティのサブセットである必要があります。 指定されたアフィニティが親ジョブのアフィニティのスーパーセットである場合は無視され、親ジョブのアフィニティが使用されます。

JOB_OBJECT_LIMIT_BREAKAWAY_OK
0x00000800
ジョブに関連付けられているプロセスが、この制限が有効な間 に CREATE_BREAKAWAY_FROM_JOB フラグを使用して子プロセスを作成した場合、子プロセスはジョブに関連付けられません。

この制限には、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体を使用する必要があります。 その BasicLimitInformation メンバーは、JOBOBJECT_BASIC_LIMIT_INFORMATION構造体です。

JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION
0x00000400
ジョブに関連付けられている各プロセスのSEM_NOGPFAULTERRORBOX フラグを使用して SetErrorMode 関数を強制的に呼び出します。

例外が発生し、システムが UnhandledExceptionFilter 関数を呼び出すと、デバッガーに動作する機会が与えられます。デバッガーがない場合、関数は EXCEPTION_EXECUTE_HANDLERを返します。 通常、これにより、例外コードが終了状態としてプロセスが終了します。

この制限には、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体を使用する必要があります。 その BasicLimitInformation メンバーは、JOBOBJECT_BASIC_LIMIT_INFORMATION構造体です。

JOB_OBJECT_LIMIT_JOB_MEMORY
0x00000200
ジョブに関連付けられているすべてのプロセスで、コミットされたメモリのジョブ全体の合計を制限します。 プロセスがジョブ全体の制限を超えるメモリをコミットしようとすると、失敗します。 ジョブ オブジェクトが完了ポートに関連付けられている場合は、 JOB_OBJECT_MSG_JOB_MEMORY_LIMIT メッセージが完了ポートに送信されます。

この制限には、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体を使用する必要があります。 その BasicLimitInformation メンバーは、JOBOBJECT_BASIC_LIMIT_INFORMATION構造体です。

プロセスがメモリのコミットを続行できるようにするときに、この制限を超えたときに通知に登録するには、JobObjectNotificationLimitInformation 情報クラスで SetInformationJobObject 関数を使用します。

JOB_OBJECT_LIMIT_JOB_TIME
0x00000004
ジョブのユーザー モード実行時間制限を確立します。 PerJobUserTimeLimit メンバーには追加情報が含まれています。 このフラグは 、JOB_OBJECT_LIMIT_PRESERVE_JOB_TIMEでは使用できません。
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
0x00002000
ジョブへの最後のハンドルが閉じられたときに、ジョブに関連付けられているすべてのプロセスを終了させます。

この制限には、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体を使用する必要があります。 その BasicLimitInformation メンバーは、JOBOBJECT_BASIC_LIMIT_INFORMATION構造体です。

JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME
0x00000040
以前に設定したジョブの時間制限を保持します。 このフラグが設定されている限り、ジョブごとの制限時間を 1 回設定してから、後続の呼び出しで他の制限を変更できます。 このフラグは 、JOB_OBJECT_LIMIT_JOB_TIMEでは使用できません。
JOB_OBJECT_LIMIT_PRIORITY_CLASS
0x00000020
ジョブに関連付けられているすべてのプロセスが同じ優先度クラスを使用するようにします。 詳細については、「 スケジュールの優先順位」を参照してください。 PriorityClass メンバーには追加情報が含まれています。

ジョブが入れ子になっている場合、有効優先度クラスはジョブ チェーン内で最も低い優先度クラスです。

JOB_OBJECT_LIMIT_PROCESS_MEMORY
0x00000100
ジョブに関連付けられているすべてのプロセスで、コミットされたメモリを制限します。 プロセスがプロセスごとの制限を超えるメモリをコミットしようとすると、失敗します。 ジョブ オブジェクトが完了ポートに関連付けられている場合、 JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT メッセージが完了ポートに送信されます。

ジョブが入れ子になっている場合、有効なメモリ制限はジョブ チェーン内で最も制限の厳しいメモリ制限です。

この制限には、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体を使用する必要があります。 その BasicLimitInformation メンバーは、JOBOBJECT_BASIC_LIMIT_INFORMATION構造体です。

JOB_OBJECT_LIMIT_PROCESS_TIME
0x00000002
現在アクティブな各プロセスと、ジョブに関連付けられている将来のすべてのプロセスに対して、ユーザー モードの実行時間制限を確立します。 PerProcessUserTimeLimit メンバーには追加情報が含まれています。
JOB_OBJECT_LIMIT_SCHEDULING_CLASS
0x00000080
ジョブ内のすべてのプロセスが同じスケジュール クラスを使用するようにします。 SchedulingClass メンバーには追加情報が含まれています。

ジョブが入れ子になっている場合、有効なスケジュール クラスはジョブ チェーン内で最も低いスケジュール クラスです。

JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK
0x00001000
ジョブに関連付けられているすべてのプロセスが、ジョブに関連付けられていない子プロセスを作成できるようにします。

ジョブが入れ子になっていて、そのイミディエイト ジョブ オブジェクトで中断が許可されている場合、子プロセスは即時ジョブ オブジェクトと親ジョブ チェーン内の各ジョブから中断され、中断を許可しないジョブに到達するまで階層を上に移動します。 イミディエイト ジョブ オブジェクトが中断を許可しない場合、親ジョブ チェーン内のジョブで許可されていても、子プロセスは中断されません。

この制限には、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体を使用する必要があります。 その BasicLimitInformation メンバーは、JOBOBJECT_BASIC_LIMIT_INFORMATION構造体です。

JOB_OBJECT_LIMIT_SUBSET_AFFINITY
0x00004000
ジョブに関連付けられているすべてのプロセスに対して、プロセスがプロセッサ アフィニティのサブセットを使用できるようにします。 この値は 、JOB_OBJECT_LIMIT_AFFINITYと組み合わせる必要があります。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: このフラグは、Windows 7 および Windows Server 2008 R2 以降でサポートされています。

JOB_OBJECT_LIMIT_WORKINGSET
0x00000001
ジョブに関連付けられているすべてのプロセスで、同じ最小および最大ワーキング セット サイズが使用されます。 MinimumWorkingSetSize メンバーと MaximumWorkingSetSize メンバーには、追加情報が含まれています。

ジョブが入れ子になっている場合、有効なワーキング セット サイズは、ジョブ チェーン内の最小のワーキング セット サイズです。

MinimumWorkingSetSize

LimitFlagsJOB_OBJECT_LIMIT_WORKINGSETが指定されている場合、このメンバーは、ジョブに関連付けられている各プロセスの最小ワーキング セット サイズ (バイト単位) です。 それ以外の場合、このメンバーは無視されます。

MaximumWorkingSetSize が 0 以外の場合、MinimumWorkingSetSize を 0 にすることはできません。

MaximumWorkingSetSize

LimitFlagsJOB_OBJECT_LIMIT_WORKINGSETが指定されている場合、このメンバーは、ジョブに関連付けられている各プロセスの最大ワーキング セット サイズ (バイト単位) です。 それ以外の場合、このメンバーは無視されます。

MinimumWorkingSetSize が 0 以外の場合、MaximumWorkingSetSize を 0 にすることはできません。

ActiveProcessLimit

LimitFlags でJOB_OBJECT_LIMIT_ACTIVE_PROCESSが指定されている場合、このメンバーはジョブのアクティブなプロセス制限です。 それ以外の場合、このメンバーは無視されます。

プロセスをジョブに関連付けようとすると、アクティブなプロセス数がこの制限を超えると、プロセスは終了し、関連付けが失敗します。

Affinity

LimitFlagsJOB_OBJECT_LIMIT_AFFINITYが指定されている場合、このメンバーはジョブに関連付けられているすべてのプロセスのプロセッサ アフィニティです。 それ以外の場合、このメンバーは無視されます。

アフィニティは、 GetProcessAffinityMask 関数を呼び出して取得したシステム アフィニティ マスクのサブセットである必要があります。 各スレッドのアフィニティはこの値に設定されますが、指定されたアフィニティ マスクのサブセットである限り、スレッドは後でアフィニティを自由に設定できます。 プロセスは、独自のアフィニティ マスクを設定できません。

PriorityClass

LimitFlagsJOB_OBJECT_LIMIT_PRIORITY_CLASSが指定されている場合、このメンバーはジョブに関連付けられているすべてのプロセスの優先度クラスです。 それ以外の場合、このメンバーは無視されます。

プロセスとスレッドは、優先順位クラスを変更できません。 呼び出し元プロセスでは 、SE_INC_BASE_PRIORITY_NAME 特権を有効にする必要があります。

SchedulingClass

LimitFlagsJOB_OBJECT_LIMIT_SCHEDULING_CLASSが指定されている場合、このメンバーはジョブに関連付けられているすべてのプロセスのスケジュール クラスです。 それ以外の場合、このメンバーは無視されます。

有効な値は 0 ~ 9 です。 他のスレッドに対して相対的に最も良好なスケジュール クラスには 0 を、他のスレッドに対して最も有利なスケジューリング クラスには 9 を使用します。 既定では、この値は 5 です。 5 より大きいスケジューリング クラスを使用するには、呼び出し元プロセスで SE_INC_BASE_PRIORITY_NAME 特権を有効にする必要があります。

解説

プロセスは、(SIZE_T)-1 で SetProcessWorkingSetSize 関数を使用して、JOB_OBJECT_LIMIT_WORKINGSETが使用されている場合でも、作業セット空にすることができます。 ただし、 SetProcessWorkingSetSize を使用して、ジョブ オブジェクト内のプロセスの最小または最大ワーキング セット サイズを変更することはできません。

システムは、プロセスをジョブに関連付けようとすると、アクティブなプロセス数をインクリメントします。 制限を超えた場合、システムは、プロセスが終了し、プロセスに対するすべてのハンドルが閉じられた場合にのみ、アクティブなプロセス数をデクリメントします。 したがって、このような方法で終了したプロセスに対してオープン ハンドルがある場合、ハンドルが閉じられ、アクティブなプロセス数が制限を下回るまで、新しいプロセスを関連付けることはできません。

要件

   
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
Header winnt.h (Windows.h を含む)

関連項目

GetProcessAffinityMask

JOBOBJECT_END_OF_JOB_TIME_INFORMATION

JOBOBJECT_EXTENDED_LIMIT_INFORMATION

JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION

QueryInformationJobObject

SetInformationJobObject

SetProcessWorkingSetSize