计划程序策略
更新:2010 年 7 月
本文档介绍并发运行时中计划程序策略的角色。 计划程序策略控制计划程序在管理任务时使用的策略。 例如,假设某个应用程序要求某些任务使用用户模式可计划 (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 值,该值指定为每个上下文保留的堆栈的大小(以千字节为单位)。 |
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,该值指定计划程序将使用普通线程。
示例
有关使用特定计划程序策略控制计划程序行为的示例,请参见如何:指定特定的计划程序策略和如何:创建使用特定计划程序策略的代理。
请参见
任务
概念
修订记录
日期 |
修订记录 |
原因 |
---|---|---|
2010 年 7 月 |
重新组织了内容。 |
信息补充。 |