Win32线程调度

13 winapi

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

aJ.*_*aJ. 9

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

尝试阅读Windows Internals以深入了解.


Rei*_*man 5

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

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


Don*_*eld 2

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

https://web.archive.org/web/20130312225716/http://support.microsoft.com/kb/109228

相关摘录:

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