12

CPU密集型、IO密集型

核心是可以分别独立运行程序指令的计算单元。

线程是操作系统能够进行运算调度的最小单位。CPU密集型(CPU-bound)

CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。

在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU bound的程序。IO密集型(I/O bound)

IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。

I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低。CPU密集型 vs IO密集型

我们可以把任务分为计算密集型和IO密集型。

计算密集型任务,要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

计算密集型任务,由于主要消耗CPU资源,因此,代码运行效率至关重要。对于计算密集型任务,最好用C语言编写。

IO密集型任务,涉及到网络、磁盘IO的任务都是IO密集型任务,其CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选。

总之,计算密集型程序适合C语言多线程,I/O密集型适合脚本语言开发的多线程。

过少的活跃线程导致 CPU 无法被充分利用,过多的活跃线程导致过大的线程上下文切换开销。

处于 IO 的线程,休眠的线程等均不消耗 CPU。 计算密集型

线程数 = CPU核数+1

线程数 = CPU内核线程数*2

IO密集型

对于IO密集型的应用,大部分都是WEB应用,涉及到大量的网络传输,不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。因此对于IO密集型的应用,可以多设置一些线程池中线程的数量,这样就能让在等待IO的这段时间内,线程可以去做其它事,提高并发处理效率。 线程数 = CPU核心数/(1-阻塞系数)

这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9。

13
发表评论
留言与评论(共有 0 条评论)
昵称:
匿名发表 登录账号
         
   
验证码:

相关文章

推荐文章

10
11
'); })();