Win32线程调度

时间:2009-03-18 04:25:11

标签: winapi

据我所知,Windows线程调度程序不会区分属于两个不同进程的线程,前提是它们都具有相同的基本优先级。我的问题是,如果我有两个应用程序,一个只有一个线程,另一个说50个线程都具有相同的基本优先级,这是否意味着第二个进程比第一个进程享有更多的CPU时间?

5 个答案:

答案 0 :(得分:9)

Windows中的计划是线程粒度。这种方法背后的基本思想是流程不会运行,而只是提供资源和线程运行的上下文。回到你的问题,因为调度决策是严格按线程进行的,所以不考虑线程属于哪个进程。在您的示例中,如果进程A具有1个可运行线程并且进程B具有50个可运行线程,并且所有51个线程具有相同优先级,则每个线程将接收1/51的CPU时间 - Windows将不会给予50处理A的CPU百分比和处理B的CPU百分比。 要了解线程调度算法,必须首先了解Windows使用的优先级。您可以refer在此处进行快速参考。

尝试阅读Windows Internals以便深入了解。

答案 1 :(得分:5)

以上所有内容都是准确的但如果您担心50线程进程占用所有CPU,那么您可以采用一些技术来确保没有任何一个进程占用CPU。

恕我直言,最好的方法是使用job objects来管理流程的使用。首先调用CreateJobObject,然后调用SetInformationJobObject以限制作业对象中进程的最大CPU使用率,并AssignProcessToJobObject将进程分配给作业对象的50个线程。然后,您可以让操作系统确保50线程进程不会占用太多CPU时间。

答案 2 :(得分:3)

调度单元是一个线程,而不是一个进程,所以一个包含50个线程的进程都处于紧密循环中,将比只有一个线程的进程获得更多的cpu,前提是所有进程都在优先权相同。这通常不是问题,因为系统中的大多数线程都不处于可运行状态,并且不会进行调度;他们正在等待I / O,等待用户输入,等等。

Windows Internals是一本很好的书,用于了解有关Windows线程调度程序的更多信息。

答案 3 :(得分:2)

这取决于线程的行为。通常,线程数有50:1的差异,是的,具有更多线程的应用程序将获得更多的时间。但是,Windows也使用动态线程优先级,这可以稍微改变一下。此处描述了动态线程优先级划分:

http://support.microsoft.com/kb/109228

相关摘录:

  

线程的基本优先级是进行这些向上调整的基准级别。线程的当前优先级称为其动态优先级。在时间片开始之前产生的交互式线程将倾向于从其基本优先级向上调整优先级。计算限制的线程不会产生,消耗它们的整个时间片,它们的优先级往往会降低,但不会低于基本级别。这种安排通常称为启发式调度。它提供了更好的交互性能,并且倾向于减少“CPU hog”线程的系统影响。

答案 4 :(得分:0)

有一个本地的“高级”设置,据称可以用来稍微调整日程安排,以支持具有焦点的应用程序。使用“服务”设置,没有偏好。在以前版本的Windows中,此设置比以前的“具有焦点的应用程序”(稍微偏向于具有焦点的应用程序)和“服务”(所有相等的权重)更为细化

由于这可以由目标机器上的用户设置,似乎要求依赖此设置的悲伤......