当我们在 Windows 中使用 _task_manager_ 或顶部在Linux中,我们可以看到cpu的使用率通常不是很高。而且,开发人员也在尽力让这个目标降下来。实际上,如果cpu使用率很高,我们认为那里出了问题。
但是我从大多数操作系统教科书中了解到,我们要充分利用 CPU,不要浪费 CPU 资源。但实际上大多数时间,我们的 CPU 处于空闲状态。
这让我很困惑。为什么会有这种矛盾?有人能解释一下吗?
答案1
这其实并不矛盾。想想你自己的一天。你有巨大的工作能力,但有时,你没有足够的时间完成所有工作,因为你有太多同时进行的任务或截止日期……而在其他日子里,你无所事事,什么也没做成。
同样,我们的计算机实际上往往会花费大量时间等待我们。即便如此,作为程序员,我们也会尝试优化代码,不仅使其能够快速执行并尽快产生结果,而且还要优化系统资源。这样,如果是“繁忙的一天”,我们就会尝试避免在系统内引发“争用”(同时需要相同的硬件资源)。
举个例子,看看现代虚拟化产品是如何实现这一有趣情况的。我们之所以能够在只有 4 或 8 GB RAM 的双核或四核处理器上同时运行 10 或 20 个虚拟机,是因为所有这些系统都不会同时尝试使用大量内存和处理器时间。(当然,您必须获得强大的硬件或明智地选择在同一主机中虚拟化哪些系统,否则您将产生争用问题!)
答案2
扩展 Breakthrough 的评论“如果您有一辆 500 马力的汽车,您认为您会多久真正踩下油门,用完 500 马力?”
奇怪的是,这与汽车发动机和 CPU 相似。
对于汽车来说,如果您拥有 500HP 的发动机,有时您会希望拥有这种动力,但是当不需要时,您可以像道奇卡车和 C7 Corvette 一样停用气缸。
AMD 称 CPU 做同样的事情凉爽安静英特尔称他们的速度步伐. 两者都旨在降低时钟速度和空闲时的能量消耗,并在需要时增加它。
答案3
这里有一个抽象的计算机科学/电子工程与现代实用的终端用户计算之间的根本区别。本质上并没有矛盾,只是视角和目标不同。
说白了,他们考虑的是服务器、超级计算机、拥有上百个用户的大型机以及随之而来的庞大而持续的工作负载,而最终用户考虑的只是加载一次网页并花 10 分钟阅读,或者打开一个文档并以人类的打字速度进行编辑,或者最多翻录一张 DVD,或者运行一次病毒扫描,或者玩游戏(这些 CPU 密集型任务需要花费几秒钟以上的时间,其主要瓶颈是 IO 速度)。
这两种思维方式都优化了其环境的最重要的特性,即时间与成本和功耗。
如果您正在运行一个高性能集群,该集群可以对批量无线电遥测进行数学计算或运行高级连续模拟,或者可以容纳数百或数千名用户,那么您会以不同的方式思考问题。模拟执行的每次计算中几毫秒的效率低下可能会在处理大型数据集的多年差异中体现出来。
然而,客户端用户更关注的是能够同时处理大量小而短暂的负载,并且更关心经济性、低功耗和安静性,而不是计算时间的毫秒差异。