大致看完scheduler_credit的代码后,开始想了解下其他的scheduler的实现,新的scheduler有credit2,老一点的有sedf, bvt之类。由于scheduler_sedf在3.0之后一直都存在代码中,就先来看看sedf吧。
sedf--simple earliest deadline first, 从名字上来看类似于io scheduler里面的deadline算法,runq是根据deadline来排序的
没错,从sedf的代码上来,它可以简单的分为三大类队列,runq, waitq, extra。 runq就是当前cpu scheduler时会从top拿任务执行的队列,它的排序就是deadline
对于时间片的分配,先要理解几个名词概念,slice, period, extra。 (3ms, 10ms, 0)这样一个组合就表示vcpu能够在每个10ms的时间段里,用到3ms的时间片,没有extra的时间片,即使7ms都是idle。
在初始化时,如果是dom0,则会初始化period=20ms, slice=15ms,保证dom0有75%的使用率,而其他的domu period=100ms
基本的算法和一般deadline类似,就是每次调度时会依次从runq,waitq,extra里面取任务执行,并且会跟新curr的cpu使用情况,根据使用情况判断它是否需要加入waitq,extra,runq里面。这里需要注意的是,每个pcpu的runq,在schedule_sedf里面不会有migrate,也就是说如果在这个cpu上执行,就一直在这执行,不会主动或者被动的切换(schedule_credit,里面就有主动migrate或者runq_steal的被动切换),所以sedf不具备load balance的功能
furthermore, sedf是抢占型的,即当一个vcpu wake,走到sedf_wake时,会判断shoulw_switch,当vcpu的period_begin < 当前cpu的上vcpu的时间片到期时间, 就立马触发cpu的调度,也就是可以理解为如果一个vcpu的计划执行时间在当前vcpu执行完之前,我会打断当前的执行。schedule_credit里面的原则是比较优先级来决定是否抢占,如果优先级高于当前的优先级,那么主动触发cpu调度。这个优先级可能会被提升,当这个cpu 之前只使用了一点credit, 后来wake的时候prio=under,并且没有cap,就可以提升优先级,抢占当前的cpu。简单的说,scheduler_credit里面的抢占有很多条件很多原则的,sedf里面几乎是无条件的,只要我的计划执行时间在你执行完成前,我就立马抢占。