CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

这篇具有很好参考价值的文章主要介绍了CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

cpu 密集型,java学习之路,java,android,面试,线程,cpu

一、导读

我们继续总结学习Java基础知识,温故知新。

二、概览

CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程;
如果是IO密集型任务,使用多线程,线程越多越好;
如果是CPU密集型任务,使用多进程,线程数量与CPU核心数匹配。

我们了解这些概念有助于在资源分配和性能优化等方面有很大的帮助。
我们在选择线程池的时候,我们需要知道某一个任务是否是CPU消耗型的任务,还是说IO类型的任务,以便充分的调用CPU资源。

三、CPU密集型与IO密集型

3.1、CPU密集型

CPU密集型,也叫计算密集型
系统运行时,CPU读写I/O(硬盘/内存)时可以在很短的时间内完成,几乎没有阻塞时间(等待I/O的实时间),而CPU一直有大量运算要处理,因此CPU负载长期过高。

CPU密集几乎无I/O阻塞,CPU一直会全速运行。如果是单核情况下,开多线程是没有意义的,一个CPU来回切着运行,增加线程切换的资源消耗。
可见,CPU密集任务只有在多核CPU上、开多线程才可能提速。

CPU使用率较高时(如我们训练算法模型、搞训练集),通常线程数只需要设置为CPU核心数的线程个数就可以了。

一般其计算公式可遵循:CPU密集型核心线程数 = CPU核数 + 1。

《Java并发编程实践》这么说:

计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。

特点:

  • 进行大量的计算
  • 消耗CPU资源,较高的CPU占用率,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。
  • 较少的IO操作

3.2、I/O密集型

I/O密集型相反,听名字就知道,系统运行多是CPU在等I/O (硬盘/内存) 的读写操作,此类情景下CPU负载并不高。

I/O密集型的程序一般在达到性能极限时,CPU占用率仍然较低。
这可能是因为任务本身需要大量I/O操作,没有充分利用CPU能力,导致线程空余时间很多。
通常我们会开CPU核心数数倍的线程,在线程进行 I/O 操作 CPU 空闲时,启用其他线程继续使用 CPU,以提高 CPU 的使用率,充分利用CPU资源。

一般其计算公式可遵循:I/O密集型核心线程数 = (线程等待时间/ 线程CPU时间 + 1)* CPU数目。

当然我们也看到有多种计算公式,但都不是最优解,具体情况需结合项目实际使用,配置合适的线程数

一般来说:文件读写、DB读写、网络请求等都是I/O密集型

特点:

  • 高IO操作
  • 计算操作少
  • CPU占用率低

四、如何区分IO密集型、CPU密集型任务

我们需要知道某一个任务是否是CPU消耗型的任务(定容线程池),还是说IO类型的任务(缓存线程池),充分的调用CPU资源。

那在此之前,我们需要知道两个概念:

Wall Duration:代码执行时间(包括了running + runnable + sleep等所有时长)

比如我们要知道某方法执行时间,可以通过系统时间差即可:

    void method() {
        long start = System.currentTimeMillis();
        // 业务代码    
        long wallTime = System.currentTimeMillis() - start;
    }

CPU Duration: 代码消耗CUP的时间(重点指标,优化方向)。

    void method() {
        long start = SystemClock.currentThreadTimeMillis(); //当前线程运行了多少时间(毫秒值,不含thread或systemclock.sleep的值)
        // 业务代码    
        long wallTime = SystemClock.currentThreadTimeMillis() - start;
    }

那如果在Android 端,我们借助SysTrace工具即可(具体方法可自行搜索),如下图
cpu 密集型,java学习之路,java,android,面试,线程,cpu
通过SysTrace查看 Wall Duration 与 CPU Duration,

消耗的CPU时间片较多,我们就把它定义为CPU消耗型的任务,放在定容线程池里调度(即线程数量固定)

消耗的时间片少,我们就把它定义为IO类型的任务,放在缓存线程池中。

  • 缓存线程池(CachedThreadPool)是Java中的一种线程池类型。它是一种动态线程池,可以根据需要自动创建新的线程,并在线程空闲一段时间后销毁。

以上是比较粗暴的分类方法,如果是混合型的任务,那就要慢慢调试,找个最佳数量。

五、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏文章来源地址https://www.toymoban.com/news/detail-599607.html

到了这里,关于CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据密集型应用系统设计--3.1 数据库核心:数据结构

    3.1 数据库核心:数据结构 数据库只需做两件事情:向它插入数据肘,它就保存数据:之后查询时,它应该返回那些数据。 本章我们主要从数据库的角度再来探讨同样的问题,即如何存储输入的数据,井在收到查询请求时,怎样重新找到数据. 了解存储引擎的底层机制。 存储

    2024年01月24日
    浏览(36)
  • 文件未找到异常 [java.io.FileNotFoundException

    文件未找到异常 [java.io.FileNotFoundException 【解决文件丢失问题:深入了解Java.io.FileNotFoundException异常的原因和解决方案】 引言: 当您在编写Java应用程序时,可能会遇到一个常见的异常,即文件未找到异常(java.io.FileNotFoundException)。这个异常表示您的程序无法找到所需的文件

    2024年02月09日
    浏览(34)
  • 设计模式学习笔记 - 开源实战五(上):Mybatis如何权衡易用性、性能和灵活性?

    前面几篇文章讲解了 Spring 框架,剖析了背后蕴含的一些通用设计思想、设计原则,以及用到的十几种设计模式。从本章开始,我们再剖析一个 Java 项目中经常用到的开发框架:Mybatis。本次也分为三篇文章进行讲解: 第一篇文章,分析 Mybatis 如何权衡代码的易用性、性能和灵

    2024年04月28日
    浏览(53)
  • 【开源与项目实战:开源实战】87 | 开源实战五(上):MyBatis如何权衡易用性、性能和灵活性?

    上几节课我们讲到了 Spring 框架,剖析了背后蕴含的一些通用设计思想,以及用到的十几种设计模式。从今天开始,我们再剖析另外一个 Java 项目开发中经常用到的框架:MyBatis。因为内容比较多,同样,我们也分三节课来讲解。 第一节课,我们分析 MyBatis 如何权衡代码的易用

    2024年02月12日
    浏览(31)
  • Linux CentOs7 监控CPU 内存 硬盘IO读写,网络负载,CPU温度等

    一般我们都知道TOP命令可以加载服务器的负载详情,但界面不太友好。因此用到htop 我们开发的软件服务需要在服务器上运行,所以服务器性能代表了软件的性能上限,因此服务器性能调优是个十分重要的环节,然而大部分同学对服务器性能调优关注的较少,今天从3个部分对

    2024年02月07日
    浏览(38)
  • DiffMatch:扩散模型 + 图像配对 + 密集匹配,如何在一对图像之间建立像素级的对应关系?

      论文地址:https://arxiv.org/pdf/2305.19094.pdf 代码地址:https://ku-cvlab.github.io/DiffMatch/   在做一个项目,需要俩张配对图像相互转换的算法。 用 pix2pix(GAN)的效果不好。 因为 扩散模型 比 GAN模型 生成要好,那得找 扩散模型 + 配对算法,这就是 DiffMatch。 图像转换、密集对应差

    2024年01月20日
    浏览(62)
  • shell脚本:监控cpu,内存,磁盘,IO,带宽,阈值告警

    一.shell脚本监控内存和磁盘的使用率,设置阈值,并通过邮件告警 二.shell脚本监控内存,磁盘,带宽,io,cpu的使用率,设置阈值进行微信告警

    2024年02月04日
    浏览(33)
  • Linux命令查看CPU、内存、IO使用情况简单介绍

    物理cpu就是计算机上实际安装的cpu,物理cpu数就是主板上实际插入的CPU数量。 在Linux上查看/proc/cpuinfo,其中的physical id就是每个物理cpu的id,有几个不同的physical id就有几个物理cpu。 每颗物理CPU可以有1个或者多个物理内核,通常每颗物理CPU的内核数都是固定的, 单核CPU就是有

    2024年02月10日
    浏览(41)
  • linux下压力测试工具stress(cpu,内存,io)

    stress-1.0.2-1.el7.rf.x86_64.rpm下载地址,centos7适用: fr2.rpmfind.net/linux/dag/redhat/el7/en/x86_64/dag/RPMS/stress-1.0.2-1.el7.rf.x86_64.rpm 安装: rpm -Uivh stress-1.0.2-1.el7.rf.x86_64.rpm stress-ng源码下载: https://kernel.ubuntu.com/~cking/tarballs/stress-ng/ 编译: make 安装: sudo make install yum安装 yum install -y epel-rel

    2024年01月17日
    浏览(31)
  • Linux系统资源分析手段:CPU,内存,磁盘与网络IO的瓶颈定位

    用于优化: 在程序编码完成后,我们通常要对自己编写的工具进行功能测试与性能分析。 用于监控: 在观察某个系统的运行情况时,需要观察系统内多个中间件及组件的资源占用情况。 用于测试: 在开启某个服务时,我们需要拥有对于该服务运行时资源占用的量化手段。

    2024年01月18日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包