2016-08-14 138 views
1

在SO上还有一些类似的问题,但没有一个具有满意的/相关的答案。故意限制只有一个线程的CPU使用率

我有一个单线程的C++程序,做一些事情基本上是这样的:

while(true) { 
    //do things which are cpu bound 
} 

的问题是,当我运行这个程序,它通常是我的整个计算机上唯一的过程,正在做积极的工作。

没有别的安排,操作系统很自然地安排了这个程序,我的CPU使用率通过屋顶,我不想要。当然,我的粉丝也开始呼呼,这特别烦人。

我打击这个的方式是在循环内添加sleep(100)(这在我的正确性方面很好),但是它的工作原理让我很烦恼,它不是技术上正确的解决方案。

这是因为如果我想睡一个非常准确的时间量,并且我的计算机上有很多其他进程正在运行,这将不是一个好的解决方案,因为sleep不准确,它也不允许其他进程使用CPU,而我的程序仍在计划中 - 但这不是我真正的问题。

什么是正确的解决方案,以降低CPU的使用,而无需使用sleep,假设这是正在运行的唯一的方案?

+0

通常,如果一个进程是可执行的,OS将执行它。故事结局。如果你不想让你的程序运行,就睡吧。另外,谁告诉你睡眠进程阻止其他进程执行?谁告诉你这完全错了。 –

+1

我想你应该调用'std :: this_thread :: yield()',这会优先考虑其他进程。这可能会减少CPU使用率 – Rakete1111

+0

@SamVarshavchik,你是对的。忙于等待一秒钟。 – noobcoder

回答

0

我在处理数字运算问题时经常遇到类似perl脚本的情况。在运行这些脚本时,我将机器设置为省电模式(通过设置最大cpu阈值限制)。这有帮助。

0

这里有3种情况需要考虑。

轮询循环

轮询循环,“正确”的解决方案更像是:

while(true) { 
    wait_for_something(); 
    //do things which are cpu bound 
} 

的问题是决定做什么,你应该等待(时间,一按键,一垂直同步信号,接收包,......?);然后试图找到实际做你需要的东西。

CPU绑定的终端条件

对于这种情况,“正确”的解决方案会更喜欢:

do { 
    //do things which are cpu bound 
} while (running); 

在这种情况下,您可以(?应该)设置线程的优先级“非常低的优先级”,以便它不会干扰其他线程。当只有低优先级的线程在运行时,操作系统可以决定是否(或不)降低CPU功率/速度;但这不是你的决定(这是操作系统的决定,希望有一些用户/管理电源管理控制)。

CPU绑定无端子条件

这种情况是非常罕见的(非常罕见,我想不出一个合理的情景,我甚至不能确定它在实践中存在的话)。大多数情况下,如果你认为你的情况是“没有终端条件的CPU绑定”,那么你可能是错的,这可能是其他情况之一。

如果它实际上是“没有终端条件的CPU绑定”,那么它大部分与“CPU绑定终端条件”大致相同,除非没有条件(您仍然需要低优先级的线程,只有低优先级的线程运行仍然不是你的决定)。

0

这在您的程序中很难做到。可以说,大多数有效的方法(至少我知道的)必须从外部强加。

在Linux上,一种可能性是cpulimit,它监视CPU使用情况,并在必要时定期暂停您的程序,以使其CPU使用率保持在您指定的级别。

Linux确实有类似setrlimit和cgroups的东西来控制进程的资源使用情况,但这两种方法都不适用于您指定的场景(例如,限制CPU使用率,即使在系统空闲时也是如此)。传统上能够设置的限制一直在总共 CPU使用率,而不是使用速率,所以像setrlimitrctl这些东西有点类似,但不提供你想要的东西。

如果您使用的是Windows,则可以通过Windows作业对象执行此操作。您创建一个作业对象,然后使用JOBOBJECT_CPU_RATE_CONTROL_INFORMATIONSetInformationJobObject设置该作业对象的限制。

+0

即时通讯使用Windows 10.这不是我真正想要的答案,但我认为你是对的,只有从'外部'才有可能。我不认为C++有办法让代码运行速度变慢:)我会在下班后检查几个小时。 – noobcoder