第四章 进程调度

1. 进程调度

Linux作为多任务处理系统,同一时刻肯定会有多个任务进程存在于内存,因此内核的调度程序需要决定为哪些进程运行,哪些进程等待,以及决定进程运行的时间(时间片)。调度是一个平衡的过程。一方面,它要保证各个运行的进程能够最大限度的使用CPU(即尽量少的切换进程,进程切换过多,CPU的时间会浪费在切换上);另一方面,保证各个进程能公平的使用CPU(即防止一个进程长时间独占CPU的情况)。

Linux是抢占式的内核调度,进程有优先级的,Linux最出名的调度程序被称为完全公平调度算法——CFS

2. 策略

  • 进程分为I/O bond和CPU bond
  • 调度策略通常在进程响应速度和系统吞吐量之间平衡
  • 优先级:根据进程的价值和对CPU时间的需求赋予进程优先级概念,在Linux下,优先级一种称为nice值,范围[-20,19],默认为0,nice越大优先级越低,nice代表时间片的比例;第二种是实时优先级,其值可以配置,默认范围[0,99],值越高优先级越高,实时进程优先级高于普通进程。实时优先级比nice高,一个进程的优先级动态地改变:设想一个低优先级的进程,如果一直有高优先级的进程在,它可能饿死,因此有一种改进方式就是这个动态增加进程的优先级
  • 时间片:进程被抢占前所能持续运行的时间,回想I/O bond型和CPU bond型,前者不需要长的时间片,后者则希望时间片越长越好。Linux的CFS调度器将处理器的使用比划分给进程,这样一来进程获得的处理器时间和系统负载密切相关,这个比例受nice值影响

3. Linux调度算法

Linux调度器以模块方式提供,这样可以针对不同进程类型选择合适的调度算法,这种模块化结构被称为[scheduler classes]。

每个调度器都有一个优先级,调度器代码在kernel/sched,调度器策略uapi/linux/sched.h

4. 抢占和上下文切换

  • 抢占
    • 用户抢占
      • 从系统调用返回用户空间时
      • 从中断处理程序返回用户空间时
    • 内核抢占
      • 中断处理程序正在执行,且返回内核空间之前
      • 内核代码再一次具有可抢占性的时候
      • 如果内核中的任务显示调用schedule()
      • 如果内核中的任务阻塞(这会导致调用schedule())
  • 上下文切换

5. 实时调度策略

Linux提供的实时调度策略:

  • SCHED_FIFO
  • SCHED_RR

参考资料: