* 调度策略
  * SCHED_NORMAL(SCHED_OTHER): 普通的分时进程
  * SCHED_FIFO: 先进先出的实时进程
  * SCHED_RR: 时间片轮转的实时进程
  * SCHED_BATCH: 批处理进程
  * SCHED_IDLE: 只在系统空闲时才能被调度执行的进程
* 调度时机
  * 主动式
    * 在内核中直接调用schedule() 当进程需要等待资源而暂时停止运行，主动请求调度把自己挂起
      * current -> state = TASK_INTERRUPTIBLE(可唤醒的阻塞态)
      * schedule()
  * 被动式
    * 又名抢占式调度，用户态抢占2.4+2.6，内核态抢占2.6
    * 用户抢占 -> 用户态(时间) / 抢占
      * 从**系统调用**返回用户空间
      * 从**中断处理程序**返回用户空间
    * 内核态抢占
      * 进程/线程一旦运行到**内核态**，就可以一直执行，直到它**主动放弃**或者**时间片耗尽**为止，会降低整个系统的实时性 2.4
      * 中断处理程序完成，返回**内核空间**之前
      * 当内核代码再一次具有可抢占性的时候，如**解锁**以及**使能软中断**
      * 不允许抢占
        * 内核正在运行中断处理
        * 正在执行调度
        * 持有锁的时候
    * 抢占计数
      * 抢占式内核有一个内核抢占计数preement_count
* 调度步骤
  * schedule函数工作流程
    * 清理当前运行中的进程
    * 选择下一个要运行的进程
    * 设置新进程的运行环境
    * 进程上下文切换