嵌套作业

应用程序可以使用嵌套作业来管理进程的子集。 嵌套作业还允许使用作业的应用程序托管其他也使用作业的应用程序。

Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista 和 Windows Server 2003: 一个进程只能与单个作业相关联。 嵌套作业在 Windows 8 和 Windows Server 2012 中引入。

本主题概述了作业嵌套和嵌套作业的行为:

有关作业和作业对象的常规信息,请参阅 作业对象

嵌套作业层次结构

嵌套作业具有父子关系,其中每个子作业在其父作业中包含进程的子集。 如果作业中已有的进程添加到另一个作业,则默认情况下,如果系统可以形成有效的作业层次结构,并且两个作业集 UI 限制均不 (SetInformationJobObjectJobObjectBasicUIRestrictions) 。

图 1 显示了一个作业层次结构,其中包含标记为 P0 到 P7 的进程树。 作业 1 是作业 2 和作业 4 的 作业,是作业 3 的 上级 作业。 作业 2 是作业 3 的 直系父级 ;作业 3 是作业 2 的 直接子级 。 作业 1、2 和 3 构成 一个作业链, 其中作业 1 和作业 2 是作业 3 的 父作业链 。 作业链中的结束作业是该作业中进程的 直接 作业。 在图 1 中,作业 3 是进程 P2、P3 和 P4 的直接作业。

图 1.包含进程树的嵌套作业层次结构

嵌套作业还可用于管理对等进程组。 在图 2 所示的作业层次结构中,作业 1 是作业 2 的父作业。 请注意,作业层次结构可能仅包含进程树的一部分。 在图 2 中,P0 不在层次结构中,但其子进程 P1 到 P5 位于层次结构中。

图 2.包含对等进程的嵌套作业层次结构

创建嵌套作业层次结构

作业层次结构中的进程要么使用 AssignProcessToJobObject 函数显式关联作业对象,要么在创建进程期间隐式关联,与独立作业相同。 创建作业和分配进程的顺序决定了是否可以创建层次结构。

若要使用显式关联生成作业层次结构,必须使用 CreateJobObject 创建所有作业对象,然后必须为每个进程多次调用 AssignProcessToJobObject ,以便将进程与其应属于的每个作业相关联。 若要确保作业层次结构有效,请先将所有进程分配给层次结构根目录中的作业,然后将一部分进程分配给直接的子作业对象,依此依此。 如果按此顺序将进程分配给作业,则在创建层次结构时,子作业在其父作业中始终具有进程的子集,这是嵌套所必需的。 如果进程按随机顺序分配给作业,则子作业在某些时候将具有不在其父作业中的进程。 嵌套不允许这样做,这将导致 AssignProcessToJobObject 失败。

当进程在创建进程期间与作业隐式关联时,子进程将与其父进程的作业链中的每个作业相关联。 如果直接作业对象允许分离,则子进程从直接作业对象和父作业链中的每个作业中断开,向上移动层次结构,直到到达不允许分离的作业。 如果直接作业对象不允许分离,则即使其父作业链中的作业允许它,子进程也不会中断。

嵌套作业的作业限制和通知

对于某些资源限制,为父作业链中的作业设置的限制决定了对子作业强制实施 的有效限制 。 子作业的有效限制可能比其父作业的限制更严格,但限制性不能降低。 例如,如果子作业的优先级类ABOVE_NORMAL_PRIORITY_CLASS其父作业的优先级类NORMAL_PRIORITY_CLASS,则子作业中进程的有效限制NORMAL_PRIORITY_CLASS。 但是,如果子作业的优先级类BELOW_NORMAL_PRIORITY_CLASS,则子作业中的进程的有效限制BELOW_NORMAL_PRIORITY_CLASS。 对优先级类、相关性、提交费用、每进程执行时间限制、计划类限制以及工作集最小值和最大值强制实施有效限制。 有关特定资源限制的详细信息,请参阅 SetInformationJobObject。

当发生某些事件(例如新进程创建或资源限制冲突)时,会将消息发送到与作业关联的 I/O 完成端口。 作业还可以注册以在超出某些限制时接收通知。 对于非嵌套作业,消息将发送到与作业关联的 I/O 完成端口。 对于嵌套作业,消息将发送到与触发消息的作业的父作业链中的任何作业关联的每个 I/O 完成端口。 子作业不需要具有关联的 I/O 完成端口,它触发的消息将被发送到作业链中较高位置的父作业的 I/O 完成端口。 有关特定消息的详细信息,请参阅 JOBOBJECT_ASSOCIATE_COMPLETION_PORT

嵌套作业的资源核算

嵌套作业的资源记帐信息描述了与该作业关联的每个进程的使用情况,包括子作业中的进程。 因此,作业链中的每个作业都表示其自己的进程使用的聚合资源,以及作业链中其下每个子作业的进程。

嵌套作业的终止

终止作业层次结构中的作业时,系统会从层次结构底部的子作业开始终止该作业及其所有子作业中的进程。 每个已终止进程使用的未完成资源将按父作业收费。

作业句柄必须具有JOB_OBJECT_TERMINATE访问权限,与独立作业相同。