排程器原則
本文件說明並行執行階段中排程器原則的角色。「排程器原則」(Scheduler Policy) 會控制排程器在管理工作時所使用的策略。例如,假設應用程式如果需要在執行某些工作THREAD_PRIORITY_NORMAL ,並在執行其他工作THREAD_PRIORITY_HIGHEST。您可以建立兩個排程器執行個體: 指定的其中一個ContextPriority原則THREAD_PRIORITY_NORMAL ,另一種指定相同的原則是THREAD_PRIORITY_HIGHEST。
藉由使用排程器 」 原則,您可以將分割可用處理資源,並將一組固定的資源指派給每個排程器。例如,假設有延展性不超過四個處理器的平行演算法。您可以建立會限制工作所能同時使用的處理器不超過四個的排程器原則。
提示 |
---|
並行執行階段提供的預設排程器。因此,您不需要建立一個應用程式中。因為工作排程器有助於微調應用程式效能,如果您是並行執行階段的新使用者,建議請從平行模式程式庫 (PPL) 或非同步代理程式程式庫開始。 |
當您使用 concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create,或 concurrency::Scheduler::SetDefaultSchedulerPolicy 方法,以建立排程器的執行個體,您提供 concurrency::SchedulerPolicy 物件,其中包含指定的排程器行為的索引鍵 / 值組的集合。SchedulerPolicy 建構函式可採用不同數目的引數。第一個引數是您即將指定之原則項目的數目。其餘引數則是每個原則項目的機碼值組。下列範例將建立會指定三個原則項目的 SchedulerPolicy 物件。Runtime 會使用預設值,未指定原則機碼。
SchedulerPolicy policy(3,
MinConcurrency, 2,
MaxConcurrency, 4,
ContextPriority, THREAD_PRIORITY_HIGHEST
);
Concurrency::PolicyElementKey 列舉型別定義的工作排程器相關聯的原則機碼。下表說明原則機碼和執行階段為這些機碼所使用的預設值。
原則機碼 |
描述 |
預設值 |
---|---|---|
SchedulerKind |
A concurrency::SchedulerType 值,指定要使用排程工作的執行緒的型別。 |
ThreadScheduler(使用一般的執行緒)。這是唯一有效的值,此機碼。 |
MaxConcurrency |
unsigned int 值,指定排程器可使用的並行資源最大數目。 |
|
MinConcurrency |
unsigned int 值,指定排程器可使用的並行資源最小數目。 |
1 |
TargetOversubscriptionFactor |
unsigned int 值,指定要為每項處理資源配置的執行緒數目。 |
1 |
LocalContextCacheSize |
unsigned int 值,指定在每個虛擬處理器的本機佇列中可快取的最大內容數目。 |
8 |
ContextStackSize |
unsigned int 值,指定要為每項內容保留的堆疊大小 (以 KB 為單位)。 |
0 (使用預設堆疊大小) |
ContextPriority |
int 值,指定每項內容的執行緒優先順序。這可以是任何您能夠傳遞至 SetThreadPriority 或 INHERIT_THREAD_PRIORITY 的值。 |
THREAD_PRIORITY_NORMAL |
SchedulingProtocol |
A concurrency::SchedulingProtocolType 值,指定要使用的排程演算法。 |
EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
A concurrency::DynamicProgressFeedbackType 值,指定是否要重新平衡根據統計資料為基礎的進度資訊的資源。 附註未設定此原則為ProgressFeedbackDisabled ,因為它由執行階段保留供使用。 |
ProgressFeedbackEnabled |
每個排程器在排程工作時,都會使用它自己的原則。一個排程器相關聯的原則不會影響其他的排程器的行為。此外,在建立 Scheduler 物件後,您將無法變更排程器原則。
重要事項 |
---|
只使用排程器原則來控制執行階段所建立之執行緒的屬性。請勿變更了可能會造成未定義的行為,因為執行階段所建立的執行緒優先權的執行緒相似性。 |
執行階段會為您建立預設排程器 (如果尚未明確建立)。如果您想要在應用程式中使用預設排程器,但您想要指定的原則,使用、 呼叫該排程器 concurrency::Scheduler::SetDefaultSchedulerPolicy 才您排定平行工作的方法。如果您未呼叫 Scheduler::SetDefaultSchedulerPolicy 方法,執行階段則會使用表格中的預設原則值。
使用 concurrency::CurrentScheduler::GetPolicy 和 concurrency::Scheduler::GetPolicy 方法來擷取一份排程器 」 原則。您以這些方法擷取的原則值,可能會與您在建立排程器時所指定的原則值不同。
範例
若要檢視使用特定排程器 」 原則來控制排程器的行為的範例,請參閱HOW TO:指定特定排程器原則和HOW TO:建立使用特定排程器原則的代理程式。