调度

OS scheduler

OS scheduler 保证如果有可以执行的线程时,就不会让 CPU 闲着。并且它还要保证,所有可执行的线程都看起来在同时执行。另外,OS scheduler 在保证高优先级的线程执行机会大于低优先级线程的同时,不能让低优先级的线程始终得不到执行的机会。OS scheduler 还需要做到迅速决策,以降低延时。

线程切换

OS scheduler 调度线程的依据就是它的状态,线程有三种状态(简化模型):Waiting, Runnable or Executing

线程能做的事一般分为两种:计算型IO 型

计算型主要是占用 CPU 资源,一直在做计算任务,例如对一个大数做质数分解。这种类型的任务不会让线程跳到 Waiting 状态。

IO 型则是要获取外界资源,例如通过网络、系统调用等方式。内存同步访问控制原语:mutex 也可以看作这种类型。共同特点是需要等待外界资源就绪。IO 型的任务会让线程跳到 Waiting 状态。

线程切换就是操作系统用一个处于 Runnable 的线程将 CPU 上正在运行的处于 Executing 状态的线程换下来的过程。新上场的线程会变成 Executing 状态,而下场的线程则变成 Waiting / Runnable 状态。正在做计算型任务的线程,会变成 Runnable 状态;正在做 IO 型任务的线程,则会变成 Waiting 状态。

因此,计算密集型任务和 IO 密集型任务对线程切换的态度是不一样的。由于计算型密集型任务一直都有任务要做,或者说它一直有指令要执行,线程切换的过程会让它停掉当前的任务,损失非常大。

相反,专注于 IO 密集型的任务的线程,如果它因为某个操作而跳到 Waiting 状态,那么把它从 CPU 上换下,对它而言是没有影响的。而且,新换上来的线程可以继续利用 CPU 完成任务。从整个操作系统来看,工作进度是往前的。

记住,对于 OS scheduler 来说,最重要的是不要让一个 CPU 核心闲着,尽量让每个 CPU 核心都有任务可做。

Last updated