据我所知,Windows线程调度程序不会区分属于两个不同进程的线程,前提是它们都具有相同的基本优先级.我的问题是,如果我有两个应用程序,一个只有一个线程,另一个说50个线程都具有相同的基本优先级,这是否意味着第二个进程比第一个进程享有更多的CPU时间?
Windows中的调度是线程粒度.这种方法背后的基本思想是流程不会运行,而只是提供资源和线程运行的上下文.回到你的问题,因为调度决策是严格按线程进行的,所以不考虑线程属于哪个进程.在您的示例中,如果进程A具有1个可运行的线程,并且进程B具有50个可运行的线程,并且所有51个线程具有相同的优先级,则每个线程将接收1/51的CPU时间 - Windows将不会提供50%的处理A的CPU和处理B的50%.要了解线程调度算法,必须首先了解Windows使用的优先级.您可以参考这里快速参考.
尝试阅读Windows Internals以深入了解.
以上所有内容都是准确的,但如果您担心50线程进程占用所有CPU,那么您可以采用一些技术来确保没有任何一个进程压倒CPU.
恕我直言,最好的方法是使用作业对象来管理进程的使用.首先调用CreateJobObject,然后调用SetInformationJobObject以限制作业对象中进程的最大CPU使用率,并使用AssignProcessToJobObject将具有50个线程的进程分配给作业对象.然后,您可以让操作系统确保50线程进程不会消耗太多CPU时间.