降低 CPU 占用率的方法

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流讨论,大家一起进步,谢谢。 https://blog.csdn.net/SweetLoveFT/article/details/38311925

CPU 占用率和什么有关?

答:1.单位时间内执行的指令数目多少(用户时间);2.I/O操作时间(等待时间);3.线程调度花费的时间(软/硬中断、优先级调整时间)。

举个例子:

好比一个大人,每次来回可以扛一袋大米,每天的任务要求扛 60 袋,假定来回的路程花费的时间为 10 分钟,如果要全速完成(不存在休息),那么需要 10 小时,如果我们选择 10 小时为单位,那么在这个时间段内跑了 60 个不带休息的来回(100% 占用);如果我们每次来回允许其休息 10 分钟(执行时间 Exec(10),休息时间Sleep(10)),那么平均的 CPU 占用就会在 50%,但是如果高精度绘制 CPU 占用曲线图,会发现 CPU 实际上是 10 分钟 100%,10 分钟 0%,如何平均——即把 Sleep(10) 穿插到 Exec(10) 中?

结论1:通过挂起线程去减少每个/单个线程单位时间内连续执行的用户指令数目,是降低 CPU 占用的最好途径,但弊端是:导致任务完成的延期。

例子2:

每天要扛 600 袋米,显然一个大人是扛不完了,所以我们要雇佣 10 个人,每个人到了扛米的地方,先用手机打个电话通知大家,剩余几袋,需不需要再派人来扛(WaitForSingleObject,等待“需要扛米通知”的信号量,实际上就是为了保护,公共变量临界区同时被多个线程访问所导致的错误)?收到通知后(第一个人/线程扛了米,变量恢复到无线程访问,此时可以解锁临界区并且选取第二个线程去访问),在第一个人扛米刚准备回来时,第二个人去扛米,当然到了扛米地点也要打电话通知大家!如此一来,仍然是一天就能完成 600 袋米的作业量。

结论2:

在多核处理器中,多线程技术明显的提高了系统的吞吐量,平均了每个核的 CPU 占用率,但是需要话费较小的管理时间为代价:多个线程竞争 CPU 资源,每次谁可以竞争成功就是如何调度所要花费的时间,而一个任务被逻辑上的分派给不同的线程,但实际上还是位于公共区,就会带来为了防止并发访问资源带来的冲突添加等待信号的时间代价。

注意:对于单核处理器,多线程技术不见得会降低 CPU 占用率,反而会增加占用率,虚拟出来的人手可能导致 CPU 超负荷运转。

例子3:

刚才那 10 个人,每个人都去扛米,但是工头不放心,不断地打电话问询剩余米的数目,导致效率低小,CPU 占用提高。

结论:在循环中,任务的执行是有条件的,那么这个条件语句最好不是异步的,而是阻塞的,这样可以降低 CPU 占用率。

总结:

降低CPU的占用率,基本就是不要用while(1) 空转,用消息、通知等配合多线程在多核处理中的作用;如果有些任务只有跳进成熟才会被执行,比如单独一个线程接收 socket 数据,收到后解析,那么条件收到数据就不要用异步方式不停判断返回值,而是使用同步阻塞的方式

没有更多推荐了,返回首页