1、cpu 密集型和 io 密集型是什么
在计算机科学中,有两种不同类型的程序:IO 密集型和 CPU 密集型。这两种程序的主要差别在于它们在执行任务时瓶颈所在的地方。
IO 密集型:这类程序主要通过读写磁盘文件、网络通信等外部设备来完成任务,因此它们大多数时间都在等待外部设备的响应。这些程序在处理等待时间方面效率较低,但对于存储和传输数据方面效率较高。
CPU 密集型:这类程序主要通过使用 CPU 完成任务,因此它们大多数时间都在计算。这些程序在处理计算任务方面效率较高,但对于读写磁盘文件、网络通信等外部设备的响应方面效率较低。
2、cpu 密集型和 io 密集型与内核线程的对应关系
2.1 cpu 密集型
CPU 密集几乎无 I/O 阻塞,CPU 一直会全速运行。如果是单核情况下,开多线程是没有意义的,说白了就是一个 CPU 来回切着运行而已,徒增线程切换的资源消耗,卵用没有。可见,CPU 密集任务只有在多核 CPU 上、开多线程才可能提速。
CPU 使用率较高时(如我们训练算法模型、搞训练集),通常线程数只需要设置为 CPU 核心数的线程个数就可以了。单 CPU 对应单线程效率最高。
一般其计算公式可遵循:CPU 密集型核心线程数 = CPU 核数。
2.2 io 密集型
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,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。