关于SO还有其他几个类似的问题,但没有一个问题有令人满意/相关的答案。
我有一个单线程的C ++程序,它可以完成这样的事情:
while(true) {
//do things which are cpu bound
}
问题在于,当我运行这个程序时,它通常是我整个计算机上唯一正在进行活动的过程。
没有别的安排,操作系统自然会大量安排这个程序,我的CPU使用率从顶部开始,我不想要。当然,我的粉丝也开始呼呼,这尤其令人讨厌。
我对抗这个问题的方法是在循环中添加sleep(100)
(这对我而言是正确的),但是当它起作用时,我觉得这不是技术上正确的解决方案。
这是因为如果我想睡一段非常准确的时间并且我的计算机上运行了很多其他进程,这将不是一个好的解决方案,因为sleep
不准确且它也没有
假设这是唯一正在运行的程序,那么在不使用sleep
的情况下减少CPU使用率的正确解决方案是什么?
答案 0 :(得分:1)
这里有3个案例要考虑。
投票循环
对于轮询循环,"正确"解决方案更像是:
while(true) {
wait_for_something();
//do things which are cpu bound
}
问题在于决定你应该等待什么(时间,按键,垂直同步信号,接收数据包,......?);然后试图找到实际上你需要的东西。
终端条件下的CPU绑定
对于这种情况,"正确"解决方案更像是:
do {
//do things which are cpu bound
} while (running);
在这种情况下,你可以(应该?)将线程的优先级设置为"非常低优先级"这样它就不会干扰其他线程。当只有低优先级线程运行时,OS可以决定是否(或不)降低CPU功率/速度;但这不是你的决定(它是操作系统的决定,希望有一些用户/管理员电源管理控制)。
没有终端条件的CPU绑定
这种情况非常罕见(如此罕见,以至于我无法想到一个看似合理的情况,而且我甚至不确定它是否存在于实践中)。大多数情况下,如果您认为您的情况是" CPU绑定没有终端条件"你可能错了,这可能是其他案件之一。
如果它实际上是" CPU没有终端条件",那么它大部分与" CPU绑定终端条件"相同。除了没有条件(你仍然想要一个低优先级的线程,并且只有低优先级线程运行时的电源管理仍然不是你的决定)。
答案 1 :(得分:0)
在处理数字运算问题时,我经常遇到与perl脚本类似的情况。我在运行这些脚本时将我的机器置于省电模式(通过设置最大cpu阈值限制)。这有帮助。
答案 2 :(得分:0)
这在程序内部相对较难。大多数有效的方法(至少我知道)必须从外部施加,可以这么说。
在Linux上,有一种可能性是cpulimit,它监视CPU使用情况,并在必要时定期暂停程序,以将CPU使用率降低到您指定的水平。
Linux确实有像setrlimit和cgroups这样的东西来控制进程的资源使用情况,但这些都不适用于您指定的方案(例如,限制CPU使用率,即使系统处于空闲状态时也是如此)。您传统上设置的限制是在进程'总 CPU使用率,而不是使用率,因此setrlimit
和{ {1}}有点类似,但不能提供你想要的东西。
如果您使用的是Windows,则可以通过Windows作业对象执行此操作。您创建一个作业对象,然后使用SetInformationJobObject使用JOBOBJECT_CPU_RATE_CONTROL_INFORMATION设置该作业对象的限制。