Winapi Win32线程调度

Winapi Win32线程调度,winapi,Winapi,据我所知,windows线程调度程序不会区分属于两个不同进程的线程,只要它们具有相同的基本优先级。我的问题是,如果我有两个应用程序,一个只有一个线程,另一个有50个线程,都具有相同的基本优先级,这是否意味着第二个进程比第一个进程占用更多的CPU时间 这取决于线程的行为。一般来说,线程数相差50:1,是的,具有更多线程的应用程序将获得更多的时间。然而,windows也使用动态线程优先级,这在某种程度上可以改变这一点。此处描述了动态线程优先级: 相关摘录: 线程的基本优先级是进行这些向上调整的基本

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

这取决于线程的行为。一般来说,线程数相差50:1,是的,具有更多线程的应用程序将获得更多的时间。然而,windows也使用动态线程优先级,这在某种程度上可以改变这一点。此处描述了动态线程优先级:

相关摘录:

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


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


Windows Internals是一本了解更多Windows线程调度程序的好书

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


请尝试阅读以获得深入理解。

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


IMHO做到这一点的最佳方法是使用管理流程的使用。首先调用,然后限制作业对象中进程的最大CPU使用量,并将具有50个线程的进程分配给作业对象。然后,您可以让操作系统确保50个线程的进程不会占用太多的CPU时间。

有一个本地“高级”设置,据说可以用来稍微隐藏调度,以利于有焦点的应用程序。使用“服务”设置时,没有首选项。在以前的Windows版本中,此设置比“有焦点的应用程序”(略微偏爱有焦点的应用程序)和“服务”(所有功能都相同)更精细


由于这可以由用户在targe机器上进行设置,因此似乎需要依赖此设置……

如果一个应用程序有50个进程,而另一个应用程序只有一个进程,该怎么办。第一个应用程序是否应该获得更多的CPU时间?信息也在这里:因此可以公平地说,窗口线程调度程序使用“公平”算法,例如,具有相同优先级的所有线程都同样可能被调度?如果是的话,对于相同优先级的线程,哪一个是最先调度的?顺序是随机的还是在某种程度上是确定的?如果最终用户能够使用这些工具,那将是Windows的巨大胜利。有,某种程度上。启动任务管理器,右键单击流程并选择“设置关联”。这允许您将单个线程分配给特定的CPU。这不完全是一回事,但很接近。