JOBOBJECT_BASIC_LIMIT_INFORMATION
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| PerProcessUserTimeLimit | LONGLONG | 8 | +0 | +0 | LimitFlags に JOB_OBJECT_LIMIT_PROCESS_TIME が指定されている場合、このメンバーはプロセスごとのユーザーモード実行時間の制限(100 ナノ秒単位のティック)です。それ以外の場合、このメンバーは無視されます。 システムは、ジョブに関連付けられた各プロセスが設定された制限を超えるユーザーモード時間を累積していないかを定期的にチェックします。超えている場合、そのプロセスは終了されます。 ジョブが入れ子になっている場合、有効な制限はジョブ チェーン内で最も厳しい制限になります。 | ||||||||||||||||||||||||||||||||
| PerJobUserTimeLimit | LONGLONG | 8 | +8 | +8 | LimitFlags に JOB_OBJECT_LIMIT_JOB_TIME が指定されている場合、このメンバーはジョブごとのユーザーモード実行時間の制限(100 ナノ秒単位のティック)です。それ以外の場合、このメンバーは無視されます。 システムは、ジョブに関連付けられたプロセスの現在の時間をこの制限に加算します。たとえば、この制限を 1 分に設定し、ジョブに 5 分のユーザーモード時間を累積したプロセスがある場合、実際に適用される制限は 6 分になります。 システムは、すべてのプロセスのユーザーモード実行時間の合計がこのジョブ終了時の制限を超えていないかを定期的にチェックします。超えている場合、 JOBOBJECT_END_OF_JOB_TIME_INFORMATION 構造体の EndOfJobTimeAction メンバーで指定されたアクションが実行されます。既定では、すべてのプロセスが終了され、ステータス コードは ERROR_NOT_ENOUGH_QUOTA に設定されます。 プロセスを終了させずにこの制限の超過時に通知を受け取るように登録するには、SetInformationJobObject 関数を JobObjectNotificationLimitInformation 情報クラスと共に使用します。 | ||||||||||||||||||||||||||||||||
| LimitFlags | JOB_OBJECT_LIMIT | 4 | +16 | +16 | 有効になっている制限フラグです。このメンバーは、他の構造体メンバーが使用されるかどうかを決定するビットフィールドです。以下の値の任意の組み合わせを指定できます。
| ||||||||||||||||||||||||||||||||
| MinimumWorkingSetSize | UINT_PTR | 8/4 | +24 | +20 | LimitFlags に JOB_OBJECT_LIMIT_WORKINGSET が指定されている場合、このメンバーはジョブに関連付けられた各プロセスの最小ワーキング セット サイズ(バイト単位)です。それ以外の場合、このメンバーは無視されます。 MaximumWorkingSetSize が 0 以外の場合、MinimumWorkingSetSize を 0 にすることはできません。 | ||||||||||||||||||||||||||||||||
| MaximumWorkingSetSize | UINT_PTR | 8/4 | +32 | +24 | LimitFlags に JOB_OBJECT_LIMIT_WORKINGSET が指定されている場合、このメンバーはジョブに関連付けられた各プロセスの最大ワーキング セット サイズ(バイト単位)です。それ以外の場合、このメンバーは無視されます。 MinimumWorkingSetSize が 0 以外の場合、MaximumWorkingSetSize を 0 にすることはできません。 | ||||||||||||||||||||||||||||||||
| ActiveProcessLimit | DWORD | 4 | +40 | +28 | LimitFlags に JOB_OBJECT_LIMIT_ACTIVE_PROCESS が指定されている場合、このメンバーはジョブのアクティブ プロセス数の制限です。それ以外の場合、このメンバーは無視されます。 プロセスをジョブに関連付けようとした結果、アクティブ プロセス数がこの制限を超える場合、そのプロセスは終了され、関連付けは失敗します。 | ||||||||||||||||||||||||||||||||
| Affinity | UINT_PTR | 8/4 | +48 | +32 | LimitFlags に JOB_OBJECT_LIMIT_AFFINITY が指定されている場合、このメンバーはジョブに関連付けられたすべてのプロセスのプロセッサ アフィニティです。それ以外の場合、このメンバーは無視されます。 アフィニティは、 GetProcessAffinityMask 関数の呼び出しによって取得されるシステム アフィニティ マスクのサブセットでなければなりません。各スレッドのアフィニティはこの値に設定されますが、指定したアフィニティ マスクのサブセットである限り、スレッドはその後自由に自身のアフィニティを設定できます。プロセスは自身のアフィニティ マスクを設定できません。 | ||||||||||||||||||||||||||||||||
| PriorityClass | DWORD | 4 | +56 | +36 | LimitFlags に JOB_OBJECT_LIMIT_PRIORITY_CLASS が指定されている場合、このメンバーはジョブに関連付けられたすべてのプロセスの優先度クラスです。それ以外の場合、このメンバーは無視されます。 プロセスおよびスレッドは自身の優先度クラスを変更できません。呼び出し元プロセスは SE_INC_BASE_PRIORITY_NAME 特権を有効にする必要があります。 | ||||||||||||||||||||||||||||||||
| SchedulingClass | DWORD | 4 | +60 | +40 | LimitFlags に JOB_OBJECT_LIMIT_SCHEDULING_CLASS が指定されている場合、このメンバーはジョブに関連付けられたすべてのプロセスのスケジューリング クラスです。それ以外の場合、このメンバーは無視されます。 有効な値は 0 ~ 9 です。他のスレッドと比べて最も不利なスケジューリング クラスには 0 を、最も有利なスケジューリング クラスには 9 を使用します。既定値は 5 です。5 より大きいスケジューリング クラスを使用するには、呼び出し元プロセスが SE_INC_BASE_PRIORITY_NAME 特権を有効にする必要があります。 |
公式ドキュメント
ジョブ オブジェクトの基本的な制限情報を格納します。
解説(Remarks)
JOB_OBJECT_LIMIT_WORKINGSET が使用されている場合でも、プロセスは SetProcessWorkingSetSize 関数に (SIZE_T)-1 を指定して自身のワーキング セットを空にすることができます。ただし、SetProcessWorkingSetSize を使用して、ジョブ オブジェクト内のプロセスの最小または最大ワーキング セット サイズを変更することはできません。
システムは、プロセスをジョブに関連付けようとしたときにアクティブ プロセス数をインクリメントします。制限を超えた場合、システムは、プロセスが終了し、かつそのプロセスへのすべてのハンドルが閉じられたときにのみ、アクティブ プロセス数をデクリメントします。そのため、このようにして終了したプロセスへのハンドルを開いたままにしていると、そのハンドルが閉じられてアクティブ プロセス数が制限を下回るまで、新しいプロセスを関連付けることはできません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// JOBOBJECT_BASIC_LIMIT_INFORMATION (x64 64 / x86 48 バイト)
typedef struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
LONGLONG PerProcessUserTimeLimit;
LONGLONG PerJobUserTimeLimit;
JOB_OBJECT_LIMIT LimitFlags;
UINT_PTR MinimumWorkingSetSize;
UINT_PTR MaximumWorkingSetSize;
DWORD ActiveProcessLimit;
UINT_PTR Affinity;
DWORD PriorityClass;
DWORD SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct JOBOBJECT_BASIC_LIMIT_INFORMATION
{
public long PerProcessUserTimeLimit;
public long PerJobUserTimeLimit;
public uint LimitFlags;
public UIntPtr MinimumWorkingSetSize;
public UIntPtr MaximumWorkingSetSize;
public uint ActiveProcessLimit;
public UIntPtr Affinity;
public uint PriorityClass;
public uint SchedulingClass;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure JOBOBJECT_BASIC_LIMIT_INFORMATION
Public PerProcessUserTimeLimit As Long
Public PerJobUserTimeLimit As Long
Public LimitFlags As UInteger
Public MinimumWorkingSetSize As UIntPtr
Public MaximumWorkingSetSize As UIntPtr
Public ActiveProcessLimit As UInteger
Public Affinity As UIntPtr
Public PriorityClass As UInteger
Public SchedulingClass As UInteger
End Structureimport ctypes
from ctypes import wintypes
class JOBOBJECT_BASIC_LIMIT_INFORMATION(ctypes.Structure):
_fields_ = [
("PerProcessUserTimeLimit", ctypes.c_longlong),
("PerJobUserTimeLimit", ctypes.c_longlong),
("LimitFlags", wintypes.DWORD),
("MinimumWorkingSetSize", ctypes.c_size_t),
("MaximumWorkingSetSize", ctypes.c_size_t),
("ActiveProcessLimit", wintypes.DWORD),
("Affinity", ctypes.c_size_t),
("PriorityClass", wintypes.DWORD),
("SchedulingClass", wintypes.DWORD),
]#[repr(C)]
pub struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
pub PerProcessUserTimeLimit: i64,
pub PerJobUserTimeLimit: i64,
pub LimitFlags: u32,
pub MinimumWorkingSetSize: usize,
pub MaximumWorkingSetSize: usize,
pub ActiveProcessLimit: u32,
pub Affinity: usize,
pub PriorityClass: u32,
pub SchedulingClass: u32,
}import "golang.org/x/sys/windows"
type JOBOBJECT_BASIC_LIMIT_INFORMATION struct {
PerProcessUserTimeLimit int64
PerJobUserTimeLimit int64
LimitFlags uint32
MinimumWorkingSetSize uintptr
MaximumWorkingSetSize uintptr
ActiveProcessLimit uint32
Affinity uintptr
PriorityClass uint32
SchedulingClass uint32
}type
JOBOBJECT_BASIC_LIMIT_INFORMATION = record
PerProcessUserTimeLimit: Int64;
PerJobUserTimeLimit: Int64;
LimitFlags: DWORD;
MinimumWorkingSetSize: NativeUInt;
MaximumWorkingSetSize: NativeUInt;
ActiveProcessLimit: DWORD;
Affinity: NativeUInt;
PriorityClass: DWORD;
SchedulingClass: DWORD;
end;const JOBOBJECT_BASIC_LIMIT_INFORMATION = extern struct {
PerProcessUserTimeLimit: i64,
PerJobUserTimeLimit: i64,
LimitFlags: u32,
MinimumWorkingSetSize: usize,
MaximumWorkingSetSize: usize,
ActiveProcessLimit: u32,
Affinity: usize,
PriorityClass: u32,
SchedulingClass: u32,
};type
JOBOBJECT_BASIC_LIMIT_INFORMATION {.bycopy.} = object
PerProcessUserTimeLimit: int64
PerJobUserTimeLimit: int64
LimitFlags: uint32
MinimumWorkingSetSize: uint
MaximumWorkingSetSize: uint
ActiveProcessLimit: uint32
Affinity: uint
PriorityClass: uint32
SchedulingClass: uint32struct JOBOBJECT_BASIC_LIMIT_INFORMATION
{
long PerProcessUserTimeLimit;
long PerJobUserTimeLimit;
uint LimitFlags;
size_t MinimumWorkingSetSize;
size_t MaximumWorkingSetSize;
uint ActiveProcessLimit;
size_t Affinity;
uint PriorityClass;
uint SchedulingClass;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; JOBOBJECT_BASIC_LIMIT_INFORMATION サイズ: 48 バイト(x86)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; PerProcessUserTimeLimit : LONGLONG (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; PerJobUserTimeLimit : LONGLONG (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; LimitFlags : JOB_OBJECT_LIMIT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; MinimumWorkingSetSize : UINT_PTR (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; MaximumWorkingSetSize : UINT_PTR (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; ActiveProcessLimit : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; Affinity : UINT_PTR (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; PriorityClass : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; SchedulingClass : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; JOBOBJECT_BASIC_LIMIT_INFORMATION サイズ: 64 バイト(x64)
dim st, 16 ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; PerProcessUserTimeLimit : LONGLONG (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; PerJobUserTimeLimit : LONGLONG (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; LimitFlags : JOB_OBJECT_LIMIT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; MinimumWorkingSetSize : UINT_PTR (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; MaximumWorkingSetSize : UINT_PTR (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; ActiveProcessLimit : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; Affinity : UINT_PTR (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; PriorityClass : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; SchedulingClass : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global JOBOBJECT_BASIC_LIMIT_INFORMATION
#field int64 PerProcessUserTimeLimit
#field int64 PerJobUserTimeLimit
#field int LimitFlags
#field intptr MinimumWorkingSetSize
#field intptr MaximumWorkingSetSize
#field int ActiveProcessLimit
#field intptr Affinity
#field int PriorityClass
#field int SchedulingClass
#endstruct
stdim st, JOBOBJECT_BASIC_LIMIT_INFORMATION ; NSTRUCT 変数を確保
st->PerProcessUserTimeLimit = 100
mes "PerProcessUserTimeLimit=" + st->PerProcessUserTimeLimit