更新:2010 年 7 月
本文件說明並行執行階段中排程器原則的角色。 「排程器原則」(Scheduler Policy) 會控制排程器在管理工作時所使用的策略。 例如,假設應用程式需要讓某些工作使用可排程使用者模式 (UMS) 執行緒,而讓其他工作使用一般的執行緒機制。 您可以建立兩個排程器執行個體:一個在其排程器原則中指定 UMS 執行緒建立,另一個在其排程器原則中指定一般執行緒。 如需 UMS 的詳細資訊,請參閱使用者模式排程。
排程器原則也可讓您分割可用處理資源,並將一組固定的資源指派給每個排程器。 例如,假設有延展性不超過四個處理器的平行演算法。 您可以建立會限制工作所能同時使用的處理器不超過四個的排程器原則。
秘訣 |
|---|
並行執行階段提供了預設排程器,因此您不需要在應用程式中建立排程器。 因為工作排程器有助於微調應用程式效能,如果您是並行執行階段的新使用者,建議請從平行模式程式庫 (PPL) 或非同步代理程式程式庫開始。 |
當您使用 Concurrency::CurrentScheduler::Create、Concurrency::Scheduler::Create 或 Concurrency::Scheduler::SetDefaultSchedulerPolicy 方法建立排程器執行個體時,要提供 Concurrency::SchedulerPolicy 物件,其中包含指定排程器行為的索引鍵/值組集合。 SchedulerPolicy 建構函式可採用不同數目的引數。 第一個引數是您即將指定之原則項目的數目。 其餘引數則是每個原則項目的機碼值組。 下列範例將建立會指定三個原則項目的 SchedulerPolicy 物件。 對於未指定的原則機碼,執行階段會使用預設值。
SchedulerPolicy policy(3,
MinConcurrency, 2,
MaxConcurrency, 4,
ContextPriority, THREAD_PRIORITY_HIGHEST
);
Concurrency::PolicyElementKey 列舉會定義與工作排程器相關聯的原則機碼。 下表說明原則機碼和執行階段為這些機碼所使用的預設值。
原則機碼 |
描述 |
預設值 |
|---|---|---|
SchedulerKind |
Concurrency::SchedulerType 值,指定要使用一般執行緒還是 UMS 執行緒來排程工作。 |
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 |
Concurrency::SchedulingProtocolType 值,指定要使用的排程演算法。 |
EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
Concurrency::DynamicProgressFeedbackType 值,指定是否要根據以統計資料為基礎的進度資訊,讓資源重新取得平衡。 注意:不要將此原則設定為 ProgressFeedbackDisabled。 ProgressFeedbackDisabled 是保留給執行階段使用。 |
ProgressFeedbackEnabled |
每個排程器在排程工作時,都會使用它自己的原則。 因此,與某個排程器相關聯的原則,並不會影響任何其他排程器的行為。 此外,在建立 Scheduler 物件後,您將無法變更排程器原則。
重要事項 |
|---|
只使用排程器原則來控制執行階段所建立之執行緒的屬性。 變更執行緒親和性或執行階段所建立之執行緒的優先權可能會造成未定義的行為。 |
執行階段會為您建立預設排程器 (如果尚未明確建立)。 如果您要在應用程式中使用預設排程器,但要指定該排程器使用的原則,請在排定平行工作之前呼叫 Concurrency::Scheduler::SetDefaultSchedulerPolicy 方法。 如果您未呼叫 Scheduler::SetDefaultSchedulerPolicy 方法,執行階段則會使用表格中的預設原則值。
請使用 Concurrency::CurrentScheduler::GetPolicy 和 Concurrency::Scheduler::GetPolicy 方法,擷取排程器原則的複本。 您以這些方法擷取的原則值,可能會與您在建立排程器時所指定的原則值不同。 例如,UMSThreadDefault 原則值會指定讓排程器使用 UMS 執行緒 (如果作業系統上可使用此功能,例如 64 位元版本的 Windows 7)。 如果無法使用 UMS 執行緒,則排程器會將這個原則值設為 ThreadScheduler,而指定讓排程器使用正常的執行緒。
範例
如需使用特定排程器原則來控制排程器行為的範例,請參閱 HOW TO:指定特定排程器原則和 HOW TO:建立使用特定排程器原則的代理程式。
請參閱
工作
概念
變更記錄
日期 |
記錄 |
原因 |
|---|---|---|
|
2010 年 7 月 |
重新組織內容。 |
資訊加強。 |
秘訣
重要事項