CPU密集型vsIO密集型

一些进程绝大多数时间在计算上,称为计算密集型,系统运作大部分的状况是CPU,CPU要读/写IO(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU loading很高。(例如:计算圆周率、图片处理、视频编码、人工智能等),全靠CPU的运算能力。

这种计算密集任务虽然也可以多任务完成,但是任务越多,花费在任务切换的时间就越多,CPU执行任务的效率就低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

计算密集型任务由于主要消耗CPU资源,因此代码运行效率至关重要。

python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

 

第二种任务的类型是IO密集型,有一些进程则在input 和output上花费了大多时间,称为I/O密集型,I/O-bound。

比如搜索引擎蜘蛛大多时间是在等待相应这种就属于I/O密集型。所以说 CPU密集型的项目适合调用多进程。I/O密集则适合调用多线程,例如爬虫。

 

涉及网络、磁盘IO的任务都是IO密集型任务,系统的CPU性能比硬盘、内存的性能高的多,大部分时间是CPU在等待IO操作完成,CPU占用率仍然比较低。

因为IO的速度远远低于CPU和内存的速度。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如web应用。

IO密集型任务执行期间,99%的时间都花在IO上,大部分的状况是CPU在等I/O(硬盘/内存)的读/写操作,

python运行速度效率低的脚本语言,不适合CPU密集型任务。对应IO密集型任务,最合适的语言就是开发效率最高的语言,脚本语言是首选,C语言最差。

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