winnt.h) (JOBOBJECT_BASIC_LIMIT_INFORMATION 结构

包含作业对象的基本限制信息。

语法

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

若要在未终止进程的情况下注册超过此限制时的通知,请将 SetInformationJobObject 函数与 JobObjectNotificationLimitInformation 信息类一起使用。

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 结构。

若要在允许进程继续提交内存的情况下注册超过此限制时的通知,请将 SetInformationJobObject 函数与 JobObjectNotificationLimitInformation 信息类一起使用。

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
保留之前设置的任何作业时间限制。 只要设置了此标志,就可以建立每个作业的时间限制一次,然后在后续调用中更改其他限制。 此标志不能与 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
导致与作业关联的所有进程使用相同的最小和最大工作集大小。 MinimumWorkingSetSizeMaximumWorkingSetSize 成员包含其他信息。

如果作业是嵌套的,则有效工作集大小是作业链中最小的工作集大小。

MinimumWorkingSetSize

如果 LimitFlags 指定 JOB_OBJECT_LIMIT_WORKINGSET,则此成员是与作业关联的每个进程的最小工作集大小(以字节为单位)。 否则,将忽略此成员。

如果 MaximumWorkingSetSize 为非零值, 则 MinimumWorkingSetSize 不能为零。

MaximumWorkingSetSize

如果 LimitFlags 指定 JOB_OBJECT_LIMIT_WORKINGSET,则此成员是与作业关联的每个进程的最大工作集大小(以字节为单位)。 否则,将忽略此成员。

如果 MinimumWorkingSetSize 为非零值, 则 MaximumWorkingSetSize 不能为零。

ActiveProcessLimit

如果 LimitFlags 指定 JOB_OBJECT_LIMIT_ACTIVE_PROCESS,则此成员是作业的活动进程限制。 否则,将忽略此成员。

如果尝试将进程与作业相关联,这会导致活动进程计数超过此限制,则进程将终止,并且关联失败。

Affinity

如果 LimitFlags 指定 JOB_OBJECT_LIMIT_AFFINITY,则此成员是与作业关联的所有进程的处理器相关性。 否则,将忽略此成员。

相关性必须是通过调用 GetProcessAffinityMask 函数获取的系统关联掩码的子集。 每个线程的相关性设置为此值,但线程可以自由地随后设置其相关性,只要它是指定关联掩码的子集。 进程无法设置自己的关联掩码。

PriorityClass

如果 LimitFlags 指定 JOB_OBJECT_LIMIT_PRIORITY_CLASS,则此成员是与作业关联的所有进程的优先级类。 否则,将忽略此成员。

进程和线程无法修改其优先级类。 调用进程必须启用 SE_INC_BASE_PRIORITY_NAME 特权。

SchedulingClass

如果 LimitFlags 指定 JOB_OBJECT_LIMIT_SCHEDULING_CLASS,则此成员是与作业关联的所有进程的计划类。 否则,将忽略此成员。

有效值为 0 到 9。 对于相对于其他线程最不有利的计划类,使用 0;对于相对于其他线程最有利的计划类,请使用 9。 默认情况下,此值为 5。 若要使用大于 5 的计划类,调用进程必须启用 SE_INC_BASE_PRIORITY_NAME 特权。

注解

即使使用 JOB_OBJECT_LIMIT_WORKINGSET,进程仍可以使用具有 (SIZE_T) -1SetProcessWorkingSetSize 函数清空其工作。 但是,不能使用 SetProcessWorkingSetSize 更改作业对象中进程的最小或最大工作集大小。

尝试将进程与作业关联时,系统会递增活动进程计数。 如果超出限制,则仅当进程终止且进程的所有句柄关闭时,系统才会减少活动进程计数。 因此,如果某个进程的打开句柄已以这种方式终止,则在句柄关闭且活动进程计数低于限制之前,无法关联任何新进程。

要求

   
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
标头 winnt.h (包括 Windows.h)

另请参阅

GetProcessAffinityMask

JOBOBJECT_END_OF_JOB_TIME_INFORMATION

JOBOBJECT_EXTENDED_LIMIT_INFORMATION

JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION

QueryInformationJobObject

SetInformationJobObject

SetProcessWorkingSetSize