JOBOBJECT_BASIC_LIMIT_INFORMATION結構 (winnt.h)

包含工作物件的基本限制資訊。

語法

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,進程仍然可以使用SetProcessWorkingSetSize函式搭配 (SIZE_T) -1來清空其工作集。 不過,您無法使用 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