CPU 密集型 & I/O 密集型

本片文章介绍如何区分 CPU 密集型任务和 I/O 密集型任务~~

在设置 Java 线程池 的参数时,需要参考到底是 CPU 密集型任务,还是 I/O 密集型任务,根据任务的不同类型,设置不同线程池大小:

那么到底如何判断是 CPU 密集型任务,还是 I/O 密集型任务呢?

从宏观上分析,CPU 密集型任务多为计算型代码,需要始终在 CPU 上运行,而 I/O 密集型任务多为文件读写、DB 读写、网络请求等,总之是一切偏向于 I/O 操作的任务

上面的判断方法还是过于主观,比如如何判断是计算型代码呢?如何判断任务中更侧重于 I/O 操作呢?有没有一些硬性指标可以更加客观的去判断呢??

在 Linux 中可以使用top命令查看进程的 CPU 占用率,如果一个进程大多数时候都是满载使用 CPU,那么可认为是 CPU 密集型;反之为 I/O 密集型

Demo -> CPU 密集型任务

下面给出一个 CPU 密集型任务的 Demo:

说白了,上面的例子就是一个死循环,肯定会一直占用 CPU 资源,通过jps命令获得该任务的 pid:

然后通过top -p 1897查看该任务的执行情况:

从结果中可以看出该任务的 CPU 占用率为 99.3%,可认为几乎满载了!!

Demo -> I/O 密集型任务

下面给出一个 I/O 密集型任务的 Demo:

上面例子中,test.txt是一个 6G 的大文件,通过BufferedReader读取到内存中,并将读取到的内容输出到终端

通过系统自带的性能监控软件可以看到该任务从磁盘读取了大量数据,可认为它是 I/O 密集性,如下图所示:

image-20230617023434629