巢狀作業
應用程式可以使用巢狀作業來管理進程的子集。 巢狀作業也可讓應用程式使用作業來裝載其他也使用作業的應用程式。
Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista 和 Windows Server 2003: 進程只能與單一作業相關聯。 巢狀作業是在 Windows 8 和 Windows Server 2012 中引進。
本主題提供巢狀作業的作業巢狀和行為概觀:
如需作業和工作物件的一般資訊,請參閱 工作物件。
巢狀作業階層
巢狀作業具有父子系關聯性,其中每個子作業在其父作業中包含進程的子集。 如果已在作業中的進程新增至另一個作業,則系統可以形成有效的作業階層,而且兩個工作都不會設定 UI 限制, (SetInformationJobObject 搭配 JobObjectBasicUIRestrictions) 。
圖 1 顯示作業階層,其中包含標示為 P0 到 P7 的進程樹狀結構。 作業 1 是作業 2 和作業 4 的 父工作 ,它是作業 3 的 上階 。 作業 2 是作業 3 的 直接父代 ;作業 3 是作業 2 的 立即子系 。 作業 1、2 和 3 形成 作業鏈結 ,其中作業 1 和 2 是作業 3 的 父作業鏈結 。 作業鏈結中的結束作業是該作業中進程的 立即作業 。 在圖 1 中,作業 3 是處理常式 P2、P3 和 P4 的立即作業。
巢狀作業也可以用來管理對等進程群組。 在圖 2 所示的作業階層中,作業 1 是作業 2 的父工作。 請注意,作業階層可能只包含進程樹狀結構的一部分。 在圖 2 中,P0 不在階層中,但其子進程 P1 到 P5 為 。
建立巢狀作業階層
作業階層中的進程會使用 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存取權限,與獨立作業相同。