排程器原則
本文件說明並行運行時間中的排程器原則角色。 排程器原則會控制排程器在管理工作時所使用的策略。 例如,請考慮要求某些工作執行 THREAD_PRIORITY_NORMAL
以及要求其他工作執行 THREAD_PRIORITY_HIGHEST
的應用程式。 您可以建立兩個排程器執行個體:一個將 ContextPriority
原則指定為 THREAD_PRIORITY_NORMAL
,另一個將同一個原則指定為 THREAD_PRIORITY_HIGHEST
。
使用排程器原則,您就可以分割可用處理資源,並將一組固定的資源指派給每個排程器。 例如,請考慮不會調整超過四個處理器的平行演算法。 您可以建立排程器原則,限制其工作不能同時使用超過四個處理器。
提示
並行執行階段會提供預設排程器。 因此,您不需要在應用程式中自行建立。 由於工作排程器可協助您微調應用程式的效能,因此如果您不熟悉並行運行時間,建議您從平行模式連結庫 (PPL) 或異步代理程序連結庫開始。
當您使用 concurrency::CurrentScheduler::Create、 concurrency::Scheduler::Create 或 concurrency::Scheduler::SetDefaultSchedulerPolicy 方法來建立排程器實例時,您會提供 並行::SchedulerPolicy 物件,其中包含指定排程器行為的索引鍵/值組集合。 建 SchedulerPolicy
構函式會採用可變數目的自變數。 第一個自變數是您即將指定的原則元素數目。 其餘自變數是每個原則元素的索引鍵/值組。 下列範例會建立 物件,指定三個 SchedulerPolicy
原則元素。 對於未指定的原則機碼,執行階段會使用預設值。
SchedulerPolicy policy(3,
MinConcurrency, 2,
MaxConcurrency, 4,
ContextPriority, THREAD_PRIORITY_HIGHEST
);
concurrency ::P olicyElementKey 列舉會定義與工作排程器相關聯的原則索引鍵。 下表描述運行時間針對每個金鑰使用的原則索引鍵和預設值。
原則金鑰 | 描述 | 預設值 |
---|---|---|
SchedulerKind |
並行 ::SchedulerType 值,指定要用來排程工作的線程類型。 | ThreadScheduler (使用一般執行緒)。 這是這個金鑰的唯一有效值。 |
MaxConcurrency |
unsigned int 值,指定排程器所使用的並行資源數目上限。 |
concurrency::MaxExecutionResources |
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 |
concurrency ::SchedulingProtocolType 值,指定要使用的排程演算法。 | EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
並行::D ynamicProgressFeedbackType 值,指定是否根據以統計數據為基礎的進度資訊重新平衡資源。 注意 請勿將此原則設定為 ProgressFeedbackDisabled ,因為它保留供運行時間使用。 |
ProgressFeedbackEnabled |
每個排程器在排程工作時,都會使用自己的原則。 與某個排程器相關聯的原則並不會影響任何其他排程器的行為。 此外,您無法在建立 Scheduler
對象之後變更排程器原則。
重要
只使用排程器原則來控制運行時間所建立之線程的屬性。 不要變更執行緒同質性或執行階段所建立的執行緒優先權,因為這樣可能會造成未定義的行為發生。
如果您未明確建立排程器,運行時間會為您建立預設排程器。 如果您想要在應用程式中使用預設排程器,但想要指定該排程器使用的原則,請在排程平行工作之前呼叫 concurrency::Scheduler::SetDefaultSchedulerPolicy 方法。 如果您未呼叫 Scheduler::SetDefaultSchedulerPolicy
方法,運行時間會使用數據表的默認原則值。
使用 concurrency::CurrentScheduler::GetPolicy 和 concurrency::Scheduler::GetPolicy 方法來擷取排程器原則的複本。 您從這些方法收到的原則值可能與您在建立排程器時所指定的原則值不同。
範例
若要檢查使用特定排程器原則來控制排程器行為的範例,請參閱 如何:指定特定排程器原則 和 如何:建立使用特定排程器原則的代理程式。