如果一次执行一条指令,CPU负载究竟是什么?

时间:2014-01-13 11:35:52

标签: cpu scheduling cpu-usage scheduler

我知道这个问题已经多次以多种方式被问过,但我仍然不清楚CPU负载%的含义。

我将开始解释我现在如何看待这些概念(当然,我可能,肯定会是错误的):

  • CPU核心一次只能执行一条指令。在完成当前指令之前,它不会执行下一条指令。
  • 假设您的盒子有一个CPU,只有一个核心。因此不可能进行并行计算。操作系统的调度程序将选择一个进程,将IP设置为入口点,然后将该指令发送到CPU。在CPU完成当前指令之前,它不会移动到下一条指令。经过一段时间后,它将切换到另一个进程,依此类推。但如果CPU当前正在执行指令,它将永远不会切换到另一个进程。它会等到CPU可以自由切换到另一个进程。由于您只有一个核心,因此不能同时执行两个进程。
  • I / O很贵。每当进程想要从磁盘读取文件时,它必须等到磁盘完成其任务,并且当前进程在此之前不能执行其下一条指令。磁盘工作时CPU没有做任何事情,因此我们的操作系统将切换到另一个进程,直到磁盘完成其工作,以免浪费时间。

遵循这些原则,我得出结论,在给定时间的CPU负载只能是以下两个值之一:

  • 0% - 空闲。 CPU什么都不做。
  • 100% - 忙。 CPU当前正在执行指令。

这显然是错误的,因为taskmgr报告%1%,12%,15%,50%等CPU使用率值。

  • 在给定时间,给定进程使用给定CPU核心的1%(由taskmgr报告)是什么意思?当给定的过程正在执行时,99%会发生什么?
  • 整体CPU使用率为19%(Rainmeter目前报告)是什么意思?

2 个答案:

答案 0 :(得分:2)

如果你看一下Windows上的任务管理器,就会有空闲进程,就是这样,它只显示了没有做任何有用的循环。是的,CPU总是很忙,但它可能只是在循环中运行,等待有用的事情发生。

  

由于您只有一个核心,因此您不能拥有两个进程   同时执行。

这不是真的。是的,单核心无法实现真正​​的并行性,但您可以使用preemptive multitasking创建一个错觉。是的,不可能中断指令,但这不是问题,因为大多数指令需要很少的时间才能完成。 OS与时间片共享时间,这明显长于单个指令的执行时间。

What does it mean that a given process, at a given time, is utilizing 1% of a given CPU core

大多数时候,应用程序没有做任何有用的事情。想想等待用户点击按钮开始处理的应用程序。这个应用程序不需要CPU,因此它大部分时间都处于睡眠状态,或者每次获取时间片时它都会进入睡眠状态(参见event loop in Windows)。 GetMessage正在阻塞,因此这意味着线程将一直处于休眠状态,直到消息到达。那么CPU负载究竟意味着什么?因此,想象一下应用程序接收一些事件或数据来做事情,它将执行操作而不是休眠。因此,如果它利用X%的CPU意味着应用程序使用X% CPU时间的过采样时间段。 CPU时间使用量是平均指标。

PS:总结一下CPU负载的概念,想一想速度(就物理而言)。有瞬时和平均速度,所以说到CPU负载,还有瞬时和平均测量。瞬时总是等于0%或100%,因为在某个时间点,过程要么使用CPU,要么不使用CPU。如果进程在250ms的过程中使用100%的CPU并且在接下来的750ms没有使用,那么我们可以说进程加载CPU为25%,采样周期为1秒(平均测量只能是适用于一定的抽样期限。)

答案 1 :(得分:1)

http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages

  

单核CPU就像是单通道流量。想象一下,你是一名桥梁操作员...有时你的桥很忙,有车排成一排。您想让人们知道您的桥上的流量是如何移动的。一个合适的指标是在特定时间等待多少辆汽车。如果没有车等待,传入的司机知道他们可以立即开车。如果汽车备份,司机知道他们是在延误。

     

这基本上是CPU负载。 “汽车”是使用一段CPU时间(“过桥”)或排队使用CPU的过程。 Unix将此称为运行队列长度:当前运行的进程数加上等待(排队)运行的进程数之和。

另见:http://en.wikipedia.org/wiki/Load_(computing)