工作物件
工作物件可讓進程群組以單位方式管理。 工作物件是可運作、安全性實體、可共用的物件,可控制與其相關聯之進程的屬性。 在作業物件上執行的作業會影響與該作業物件關聯的所有處理序。 範例包括強制執行工作集大小和進程優先順序等限制,或終止與作業相關聯的所有進程。
建立作業
若要建立工作物件,請使用 CreateJobObject 函式。 建立作業時,不會有任何進程與作業相關聯。
若要將進程與作業產生關聯,請使用 AssignProcessToJobObject 函式。 當進程與作業相關聯之後,關聯便無法中斷。 進程可以與巢狀作業階層中的多個作業相關聯。 如需詳細資訊,請參閱 巢狀作業。
Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista 和 Windows Server 2003: 進程只能與一個作業相關聯。 作業不可巢狀。 巢狀作業的功能已新增至 Windows 8 和 Windows Server 2012。
呼叫 CreateJobObject 函式時,您可以指定工作物件的安全性描述元。 如需詳細資訊,請參閱 工作物件安全性和存取權限。
管理作業中的進程
當進程與作業相關聯之後,根據預設,使用 CreateProcess 建立的任何子進程也會與作業相關聯。 (使用 Win32_Process.Create 建立的子進程不會與 job 相關聯。) 您可以藉由設定作業的擴充限制JOB_OBJECT_LIMIT_BREAKAWAY_OK或JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK來變更此預設行為。
- 如果作業具有擴充限制JOB_OBJECT_LIMIT_BREAKAWAY_OK,且父進程是以 CREATE_BREAKAWAY_FROM_JOB 旗標建立,則父進程的子進程不會與作業相關聯。
- 如果作業具有擴充限制JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK,則與作業相關聯的任何父進程的子進程都不會與作業相關聯。 不需要使用 CREATE_BREAKAWAY_FROM_JOB 旗標建立父進程。
如果作業是巢狀的,階層中父作業的中斷設定會影響子進程是否與階層中的另一個作業相關聯。 如需詳細資訊,請參閱 巢狀作業。
若要判斷進程是否在作業中執行,請使用 IsProcessInJob 函式。
若要終止目前與工作物件相關聯的所有進程,請使用 TerminateJobObject 函式。
作業限制和通知
作業可以在與作業相關聯的每個進程上強制執行工作集大小、進程優先順序和作業結束時間限制等限制。 如果與作業相關聯的進程嘗試從作業所建立的限制增加其工作集大小或進程優先順序,則函式會呼叫成功,但會以無訊息方式忽略。 作業也可以設定限制,以在超過通知時觸發通知,但允許作業繼續執行。
若要設定作業的限制,請使用 SetInformationJobObject 函式。 如需可針對作業設定的可能限制清單,請參閱下列主題:
- JOBOBJECT_BASIC_LIMIT_INFORMATION
- JOBOBJECT_BASIC_UI_RESTRICTIONS
- JOBOBJECT_CPU_RATE_CONTROL_INFORMATION
- JOBOBJECT_EXTENDED_LIMIT_INFORMATION
- JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION
安全性限制必須針對與工作物件相關聯的每個進程個別設定。 如需詳細資訊,請參閱 處理安全性和存取權限。
具有 SP3 和 Windows Server 2003 的 Windows XP:SetInformationJobObject函式可用來設定與工作物件相關聯之所有進程的安全性限制。 從 Windows Vista 開始,每個與工作物件相關聯的進程都必須個別設定安全性限制。
如果作業是巢狀的,階層中的父作業會影響針對作業強制執行的限制。 如需詳細資訊,請參閱 巢狀作業。
如果作業具有相關聯的 I/O 完成埠,則可以在超過特定作業限制時收到通知。 當超過限制或發生特定其他事件時,系統會將訊息傳送至完成埠。 若要將完成埠與作業產生關聯,請使用 SetInformationJobObject 函式搭配 job 物件資訊類別 JobObjectAssociateCompletionPortInformation 以及 JOBOBJECT_ASSOCIATE_COMPLETION_PORT 結構的指標。 當作業處於非使用中狀態時,最好這樣做,以減少在完成埠關聯期間變更其狀態之處理常式遺失通知的機會。
所有訊息都會直接從作業傳送,就像作業已呼叫 PostQueuedCompletionStatus 函式 一樣。 執行緒必須使用 GetQueuedCompletionStatus 函式來監視完成埠,才能挑選訊息。 請注意,除了 使用 JobObjectNotificationLimitInformation 資訊類別所設定的限制之外,不保證會將訊息傳遞至完成埠;訊息送達失敗不一定表示事件未發生。 使用 JobObjectNotificationLimitInformation 所設定限制的通知保證會抵達完成埠。 如需可能的訊息清單,請參閱 JOBOBJECT_ASSOCIATE_COMPLETION_PORT。
作業的資源會計
工作物件會記錄其所有相關聯處理常式的基本會計資訊,包括已終止的程式。 若要擷取此會計資訊,請使用 QueryInformationJobObject 函式。 如需針對作業維護的會計資訊清單,請參閱下列主題:
如果工作物件是巢狀的,則會在其父作業中匯總每個子作業的會計資訊。 如需詳細資訊,請參閱 巢狀作業。
管理工作物件
工作物件的狀態會設定為在終止其所有進程時發出訊號,因為已超過指定的作業結束時間限制。 使用 WaitForSingleObject 或 WaitForSingleObjectEx 來監視此事件的工作物件。
若要取得現有工作物件的控制碼,請使用 OpenJobObject 函式,並在建立物件時指定提供給物件的名稱。 只能開啟具名工作物件。
若要關閉工作物件控制碼,請使用 CloseHandle 函式 。 當最後一個控制碼已關閉,且所有相關聯的進程都已終止時,就會終結作業。 不過,如果作業已指定JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE旗標,則關閉最後一個工作物件控制碼會終止所有相關聯的進程,然後終結工作物件本身。 如果巢狀作業已指定JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE旗標,則關閉最後一個工作物件控制碼會終止與作業及其階層中子作業相關聯的所有進程。
管理使用工作物件的進程樹狀結構
從Windows 8和Windows Server 2012開始,應用程式可以使用巢狀作業來管理使用多個工作物件的進程樹狀結構。 不過,必須在 Windows 7、Windows Server 2008 R2 或不支援巢狀作業的舊版 Windows 上執行的應用程式必須以其他方式管理進程樹狀結構。
如果工具必須管理使用工作物件的進程樹狀結構,而且無法使用巢狀作業,則工具與進程樹狀結構的成員都必須合作。 使用下列其中一個選項:
使用JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK限制。 如果此工具使用此限制,它就無法監視整個進程樹狀結構。 此工具只能監視它新增至作業的進程。 如果這些進程建立子進程,它們就不會與作業相關聯。 在此選項中,子進程可以與其他工作物件相關聯。
使用JOB_OBJECT_LIMIT_BREAKAWAY_OK限制。 如果此工具使用此限制,它可以監視整個進程樹狀結構,但樹狀結構的任何成員明確中斷樹狀結構以外的進程除外。 樹狀結構的成員可以在新的工作物件中建立子進程,方法是使用 CREATE_BREAKAWAY_FROM_JOB 旗標呼叫 CreateProcess 函式,然後呼叫 AssignProcessToJobObject 函式。 否則,成員必須處理 AssignProcessToJobObject 失敗的情況。
如果工具未監視樹狀結構,CREATE_BREAKAWAY_FROM_JOB旗標就不會有任何作用。 因此,這是慣用的選項,但需要事先瞭解所監視的進程。
藉由設定JOB_OBJECT_LIMIT_BREAKAWAY_OK和JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK限制,防止任何種類的中斷。 在此選項中,此工具可以監視整個進程樹狀結構。 不過,如果子進程嘗試藉由呼叫 AssignProcessToJobObject將本身或其他子進程與作業產生關聯,呼叫將會失敗。 如果程式是設計成與特定作業相關聯,此失敗可能會防止進程正常運作。