Share via


排程器原則

本檔說明並行執行時間中的排程器原則角色。 排程器原則 會控制排程器在管理工作時所使用的策略。 例如,請考慮要求某些工作執行 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 方法來擷取排程器原則的複本。 您從這些方法收到的原則值可能與您在建立排程器時所指定的原則值不同。

範例

若要檢查使用特定排程器原則來控制排程器行為的範例,請參閱 如何:指定特定排程器原則 如何:建立使用特定排程器原則 的代理程式。

另請參閱

工作排程器
如何:指定特定排程器原則
如何:建立使用特定排程器原則的代理程式