我同时在 CPU 上运行多个进程,现在我试图找出每个进程可以使用多少 CPU 能力,直到它们开始互相干扰:
为了简单起见,我们假设一台机器只有一个 CPU,并且假设 CPU 是唯一相关的资源。
现在,我们在一台 Windows 7 64 位计算机上的单个 CPU 上以相同的 CPU 优先级运行着两个不同的进程。我们将它们称为P1
和P2
。P1
和P2
各自使用 20% 的 CPU。
如果对方没有跑步,他们是否会以同样的方式跑步?
从逻辑上讲,它们会这样做,因为 CPU 能力足以让它们两者同时运行。但由于 CPU 共享,实际情况可能有所不同。如果对问题 1 的回答是肯定的:那么他们什么时候会开始互相干扰?
它们是否只会在双方都尝试使用超过 50% 的总 CPU 功率时才开始互相干扰,还是会因为某种原因而更早地进行干扰?如果有超过 2 个进程,或者是不同类型的进程(例如每个进程有多个线程),前面问题的答案会有所不同吗?它们有何不同?
答案1
忽略其他进程的开销(您标记了 Windows 7)。内核将按照每个线程的就绪顺序对其进行排队。这里面还有很多内容,但这就是大致内容。
每个程序都会做很多事情,比如读取或写入磁盘或内存,这些都是它自己的任务。如果每个进程只使用 20% 的 CPU;P1
将运行一个任务,然后P2
运行另一个。如果P2
在第二轮中第一个就绪,P2
将运行一个任务,然后运行P1
。这将持续到每个进程完成并退出。
现在,进程利用率 100% 意味着每次测量(本例中为 1 秒),因此每一秒处理器都始终处于繁忙状态,并且始终在计算。在您的示例中,每秒使用率为 40%,处理器工作并进行计算,持续 400 毫秒。因此,10 秒后,处理器总共处于待机状态 6 秒。(忽略其他程序和开销)
确实如此。如果您每次只运行一个,则来回切换的开销不会产生,但如果处理器的利用率只有 40%,那么这实际上就不是什么问题。
如果每个程序都需要 100% 的处理器资源,那么你会注意到来回切换会有一些延迟。请记住,单个核心实际上一次只能做一件事,它似乎能做更多的事情,因为它来回切换的速度非常快。每个核心 50% 加上大约 0.01% 的开销意味着 100.01%,所以你需要“等待” 10 毫秒。
是的,在介绍中,每个程序都有许多任务,在多线程的情况下,程序必须执行的每个任务(读取,然后写入)都会更快地进入队列,因此“等待”时间会更少,并且您可以将 40% 的 CPU 使用率打包到前 400 毫秒中,而不必包括等待时间,从而迫使工作分散到 600 毫秒左右。对于更多程序来说,这实际上是一样的,每个程序的开销都更多,但仍然可以忽略不计。(除非您进入实时系统。)
再次强调,这是非常普遍的,但它或多或少是多个程序共享单个 CPU 的方式。当逻辑/程序/调度程序在对任务队列进行排序时出现问题,这会导致更多的开销,开销越大,等待时间越长,因此即使您的程序每个只需要 40%,切换的开销也会导致切换任务或等待的时间增加 30%。