计算密集型任务的特点就是要进行大量的计算,消耗 CPU 资源来实现运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间越多,CPU 执行任务的效率越低,所有要高效利用 CPU,任务的数量应当等于 CPU 的核数。另外代码运行效率很重要,此类任务最好用 C 语言编写。
IO 密集型任务主要是网络、磁盘 IO 的任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等在 IO 操作完成,因为 IO 的速度远远低于 CPU 和内存的速度。对于 IO 密集型任务, 任务越多,CPU 效率越多,但是也要有一个限度。常见的大部分任务都是 IO 密集型任务,比如 WEB 应用。另外此类任务 99% 的时间都用于 IO,花在 CPU 上的时间很少,因此语言应该选用开发效率高的脚本语言,C语言最差。
异步 IO
考虑到 CPU 和 IO 之间的巨大速度差异,一个任务耗时大多是因为等待 IO 操作,单进程单线程模型会导致别的任务无法并行执行,因此需要多进程模型或者多线程模型来支持多任务并发执行。
如今异步 IO 可以被操作系统完全支持,可以用单进程单线程模型来执行多任务,在单核 CPU 上采用单进程模型就可以高效支持多任务,在多核 CPU 上,可以运行多个进程,数量与 CPU 的核数相同可以充分利用 CPU 资源。因为一个系统的进程数量十分有限,因此操作系统调度非常高效。用异步 IO 来实现多任务是一个主要趋势。