怎么理解CPU密集型和I/O密集型

CPU密集型任务适合多进程,I/O密集型任务适合多线程。CPU密集型任务在多核CPU上开多线程可提升效率,线程数等于CPU核心数。I/O密集型任务因CPU空闲时间多,可开更多线程提高CPU利用率,线程数基于阻塞系数计算。
摘要由CSDN通过智能技术生成

【摘要】 CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程。

说在前面,CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程。

如果是IO密集型任务,使用多线程,如果是CPU密集型任务,使用多进程。前者指内存磁盘I/O使用率高,CPU使用率低;相反,后者指CPU使用率高,内存磁盘I/O使用率低。

CPU密集型

CPU密集型,也叫计算密集型,一般是指服务器的硬盘、内存硬件性能相对CPU好很多,或者使用率低很多。系统运行CPU读写I/O(硬盘/内存)时可以在很短的时间内完成,几乎没有阻塞(等待I/O的实时间)时间,而CPU一直有大量运算要处理,因此CPU负载长期过高。

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

CPU使用率较高时,通常线程数只需要设置为CPU核心数的线程个数就可以了。单CPU对应单线程效率最高。

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

I/O密集型

I/O密集型相反,一般是指服务器CPU的性能相对硬盘、内存硬件好很多,或者使用率低很多。系统运行多是CPU在等I/O (硬盘/内存) 的读写操作,此类情景下CPU负载并不高。

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

一般其计算公式可遵循:I/O密集型核心线程数 = CPU核数 / (1-阻塞系数)

阻塞系数在在0到1范围内。一般为0.8~0.9之间,也可以取0.8或者0.9。对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。

小结

  • I/O密集型:当线程等待时间所占比例越高,需要越多线程,启用其他线程继续使用CPU,以此提高CPU的利用率;
  • CPU密集型:当线程CPU时间所占比例越高,需要越少的线程。任务越多,花在进程、线程切换的时间就越多,通常线程数和CPU核数一致即可,这一类型在开发中主要出现在一些计算业务频繁的逻辑中。
  • I/O密集型任务的特点是CPU消耗很少,任务的大部分时间都在等待I/O操作完成(磁盘I/O远低于内存、CPU速度)。涉及到网络、磁盘I/O的任务多是I/O密集型任务。I/O密集型任务,线程数越多,CPU效率越高,但也有相对限度。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值