降低 CPU 占用率的方法

2024-03-01 02:48
文章标签 方法 cpu 降低 占用率

本文主要是介绍降低 CPU 占用率的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 数据,收到后解析,那么条件收到数据就不要用异步方式不停判断返回值,而是使用同步阻塞的方式

这篇关于降低 CPU 占用率的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760972

相关文章

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP