为什么说线程是CPU调度的基本单位?
点击上方“Python编程时光”,选择“加为星标”
第一时间关注Python技术干货!
原文: https://dwz.cn/V9ukPOOE
在大学操作系统的课本中,一般会有那么一句话:线程是CPU调度的基本单位。但是课本很少会去解释为什么。这里我简单说一下哈。因为寄存器中保存了当前线程的状态,例如一些栈指针呀,程序计数器呀。
但是这种答案好像并没有解释为什么要让线程是CPU调度的基本单位,这只是告诉了我们一个结果说线程是CPU调度的基本单位。因为我们还有进程这个概念呀,为什么不让进程成为CPU调度的基本单位呢?
这里我从设计的角度给出一个可能的原因。
首先我们要知道什么算作CPU调度,也就是拥有时间片对吧。OK,我们也知道一个进程是可以有多个线程的对吧。
现在我们假设我们的计算机是单 CPU 4核。此时,我们的进程中的4个线程占据了CPU的所有核。因为任务不同,所以这些线程执行的时间也不同。
如果这个进程中的某个线程已经完成了自己的任务,那么这个完成了任务的线程所占据的那个CPU核就处于空闲的状态了对吧。OK,此时我们的操作系统有两种设计方式:
1、以进程为CPU的调度单位
2、以线程为CPU的调度单位
假如是第一种设计方式,因为这个进程中还有另外3个线程在执行任务,所以因为一个线程执行完了而把当前进程切换掉,显然是很不明智的。那么,如果不切换进程,而去等待另外3个线程执行完任务的话,那么肯定会有CPU的某个或者某些核处于空闲的状态,此时没有充分利用好硬件。
因此,如果以进程为CPU的调度单位,在面对上面这种情况的时候,显得很无力。
OK,假如是第二种设计方式,就可以很好地解决这个问题了。操作系统把所有的线程一视同仁,我不管你这个线程是属于哪个进程的,只要你任务完成或者时间片用完,我就切换掉你,换一个线程过来。至于这个换过来的线程是同一个进程的线程还是其他进程的线程我不管,因为我是以线程为调度单位的。显然,第二种方式能够充分利用好CPU的所有核,不至于让某些核无所事事。
推荐阅读