Linux内核调度策略

Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不同数值,以通过查询 /boot/config 内核选项来查看它的配置值。

Linux的调度策略主要分为实时任务和普通任务。实时任务需求尽快返回结果,而普通任务则没有较高的要求。在前文中我们提到了task_struct中调度策略相应的变量为policy,调度优先级有prio, static_prio, normal_prio, rt_priority几个。优先级其实就是一个数值,对于实时进程,优先级的范围是 0~99;对于普通进程,优先级的范围是 100~139。数值越小,优先级越高。

实时调度策略

实时调度策略主要包括以下几种

  • SCHED_FIFO:先来先出型策略,顾名思义相同优先级的情况下先到先得
  • SCHED_RR:轮询策略,注重公平性,相同优先级的任务会使用相同的时间片轮流执行
  • SCHED_DEADLINE:根据任务结束时间来进行调度,即将结束的拥有较高的优先级

普通调度策略

普通调度策略主要包括以下几种

  • SCHED_NORMAL:普通任务
  • SCHED_BATCH:后台任务,优先级较低
  • SCHED_IDLE:空闲时间才会跑的任务
  • CFS:完全公平调度策略,较为特殊的一种策略。CFS 会为每一个任务安排一个虚拟运行时间 vruntime。如果一个任务在运行,随着一个个 CPU时钟tick 的到来,任务的 vruntime 将不断增大,而没有得到执行的任务的 vruntime 不变。由此,当调度的时候,vruntime较小的就拥有较高的优先级。 vruntime的实际计算方式和权重相关,由此保证了优先级高的按比例拥有更多的执行时间,从而达到完全公平。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!