linux内核的三种主要调度策略:
  1,SCHED_OTHER 分时调度策略,
  2,SCHED_FIFO实时调度策略,先到先服务
  3,SCHED_RR实时调度策略,时间片轮转
  实时进程将得到优先调用,实时进程根据实时优先级决定调度权值。分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也是曾经使用了cpu少的进程将会得到优先调度。
  SHCED_RR和SCHED_FIFO的不同:
  当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
  SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。
  如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。
  相同点:
  RR和FIFO都只用于实时任务。
  创建时优先级大于0(1-99)。
  按照可抢占优先级调度算法进行。
  绪态的实时任务立即抢占非实时任务。
  所有任务都采用linux分时调度策略时:
  1,创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。
  2,将根据每个任务的nice值确定在cpu上的执行时间(counter)。
  3,如果没有等待资源,则将该任务加入到绪队列中。
  4,调度程序遍历绪队列中的任务,通过对每个任务动态优先级的计算权值(counter+20-nice)结果,选择计算结果大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。
  5,此时调度程序重复上面计算过程,转到第4步。
  6,当调度程序发现所有绪任务计算所得的权值都为不大于0时,重复第2步。
  所有任务都采用FIFO时:
  1,创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。
  2,如果没有等待资源,则将该任务加入到绪队列中。
  3,调度程序遍历绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务绪(即使优先级相同也不行)或者主动放弃(等待资源)。
  4,调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。
  5,如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从绪队列中删除,加入等待队列,此时重复第3步。