C ++:故意限制CPU使用率

时间:2011-04-30 03:29:54

标签: c++ cpu-usage

在我公司,我们经常在CPU压力下测试USB和FireWire设备的性能。

我们运行的测试代码可以加载CPU,它通常用于非常简单的非正式测试,以查看设备性能的变化。

我看了一下这个代码,它是一个简单的循环,它递增一个计数器并根据新值进行计算,将这个结果存储在另一个变量中。

运行单个实例将使用1 / X的CPU,其中X是核心数。

因此,例如,如果我们使用的是8核PC,并且我们希望看到我们的设备如何在50%的CPU使用率下运行,我们可以同时打开四个这样的实例,依此类推...... / p>

我想知道:

  1. 是什么决定了CPU耗尽了多少?它是否只是在单线程应用程序中的单个线程上以尽可能快的速度运行所有内容?

  2. 有没有办法自愿限制程序可以使用的最大CPU使用率?我可以想到一些“草率”的方法(添加睡眠命令或其他东西),但有没有办法限制说,某些指定百分比的可用CPU或什么?

4 个答案:

答案 0 :(得分:6)

Windows 7Linux上的CPU配额。

同样在QNX (i.e. Blackberry Tablet OS)LynuxWorks

如果链接断开,文章名称为:

  • Windows - “Windows Server 2008 R2和Windows 7中的CPU速率限制”
  • Linux - “Linux使用限制器”
  • QNX - “自适应分区”
  • LynuxWorks - “分区操作系统”和“ARINC 653”

答案 1 :(得分:1)

  1. 操作系统通常决定如何安排进程以及应该运行哪些CPU。它基本上为准备运行的进程保留了一个就绪队列(没有标记为终止而没有阻塞等待某些I / O,事件等)。每当进程耗尽其时间片或阻塞时,它基本上释放处理核心,并且操作系统选择另一个进程来运行。现在,如果您有一个始终可以运行且永不阻塞的进程,那么只要它可以将处理单元的利用率提高到100%,该进程就会运行。当然,这是一个简化的描述(例如,有一些过程优先级)。
  2. 通常没有通用的方法来实现这一目标。您正在使用的操作系统可能会提供一些机制来执行此操作(某种CPU配额)。您可以尝试测量已经过了多少时间,以及您的进程耗尽了多少CPU时间,然后让您的进程暂停一段时间以达到所需CPU利用率的近似值。

答案 2 :(得分:0)

你基本上回答了自己的问题!

烧掉大量CPU的代码的关键特性是它永远不会阻塞任何东西(例如,等待网络或文件I / O),并且永远不会自愿产生其时间片(例如sleep()等)

另一个技巧是代码必须做一些编译器无法优化的东西。因此,很可能你的CPU烧录代码输出基于最后的循环计算,或者简单地编译而没有优化,因此优化器不会想要移除无用的循环。由于您正在尝试加载CPU,因此无论如何都没有任何意义。

正如您所假设的那样,与此描述相匹配的单线程代码将使CPU内核饱和,除非操作系统拥有更多这些进程而不是运行它们的内核 - 然后它将循环调度它们并使用每个进程是100%的一部分。

答案 3 :(得分:0)

问题不在于CPU占用多少时间,而是代码开始执行需要多长时间。只要延迟很低,谁会关心它是空闲还是做低优先级的繁忙工作?

您的问题基本上是使用合成基准测试的结果,可能是为了获得可重复的结果。但是合成基准测试往往会产生无意义的结果,因此重复性是没有意义的。

查看您的错误数据库,查找实际的客户投诉,并使用实际软件和测试硬件来重现实际让某人不满意的情况。与艰难,有意义的性能要求同时开发性能测试。