我们使用一个例子来说明问题,在单核CPU的情况下,存在4个需要执行任务,有如下两种情况运行方式:

  1. 使用多线程执行这些任务,会发生线程上下文切换
  2. 一个一个任务按顺序执行完成

image.png

  1. 上述两种情况,到底那个执行效率会快呢?

    分析:第一种情况明显发生很多次线程的上下文切换,我们知道线程的上下文切换是很消耗性能的,而第二种情况发生的则是一个任务完成再执行下一个任务,基本没线程切换,那么讲道理,难道是第二种情况下更加快了,那么就抛出个问题在单核CPU下,有必要存在多线程吗?

  2. 我们需要清楚的认识到:多线程会提高效率到底指的是什么?实际上,多线程会提高效率是跟I/O操作相关的。I/O操作又有磁盘IO,网络IO。

  3. 以磁盘 IO 来说,实际上当 CPU 需要磁盘中某些文件的时候,并不是直接 CPU 向磁盘 IO 要数据,而是交给DMA 来完成磁盘io的数据读取,执行如下操作:

image.png

  1. 从上图我们就可以发现 CPU 在将指令告诉 DMA 的时候就处于空闲状态了。

  2. 如果磁盘 IO 读取的数据较大,则会长时间停留在第三步中。

  3. 那么CPU空闲下来的时间,为啥我们不好好利用起来呢

    因此就出现了多线程,当一个任务被执行第三步磁盘将内容加载到内存中的时候且执行时间巨长,CPU 则空闲的,那么我们就切换线程,让它执行其他的任务,整体就提高了任务完成的效率。

  4. 这也是经常听到这句话的原因:IO 操作不需要占用 CPU

image.png