调度简介
Xen调度不同的虚拟机到处理器上运行,基本方法是虚拟机按时间片运行。Xen通过调度器实现,用户可以根据自己的需要实现不同的调度器,从而实现不同的调度策略。
struct scheduler
schedulers 数组
{
&sched_sedf_def,
&sched_credit_def,
NULL;
&sched_credit_def,
NULL;
}
schedule函数 -调度核心
task_slice,调度器通过返回一个这样的结构来确定下一个调度运行的虚拟机
struct task_slice{
struct vcpu *task;
s_time_t time;
}
static void shcedule(void){
struct vcpu *prev=current;
...
next_slice=ops.do_schedule(now);//咨询调度器得到下一个需要调度的VM;
r_time=next_slice.time;
next=next_slice.task;
...
set_timer;
context_switch(prev,next);
set_current(next);
...
__context_switch();
...
schedule_tail(next);//完成切换
}
static void __context_switch(void){
struct cpu_user_regs *stack_regs=guest_cpu_user_regs();
//保存现场
//恢复现场
}
schedule_tail 函数完成最后的切换,HVM下是vmx_do_resume或svm_do_resume都要调用reset_stack_and_jump
task_slice,调度器通过返回一个这样的结构来确定下一个调度运行的虚拟机
struct task_slice{
struct vcpu *task;
s_time_t time;
}
static void shcedule(void){
struct vcpu *prev=current;
...
next_slice=ops.do_schedule(now);//咨询调度器得到下一个需要调度的VM;
r_time=next_slice.time;
next=next_slice.task;
...
set_timer;
context_switch(prev,next);
set_current(next);
...
__context_switch();
...
schedule_tail(next);//完成切换
}
static void __context_switch(void){
struct cpu_user_regs *stack_regs=guest_cpu_user_regs();
//保存现场
//恢复现场
}
schedule_tail 函数完成最后的切换,HVM下是vmx_do_resume或svm_do_resume都要调用reset_stack_and_jump
在虚拟机xen中主要有两中调度算法,一种是credit算法,另一种是sedf算法。Credit算法就是让每一个vcpu(虚拟cpu)都可以公平的使用物理cpu的资源。Sedf算法可以根据每个vcpu负载的大小动态的调整vcpu的优先级。
credit概述:
1.每个物理CPU下面都有一个虚拟CPU的运行队列
2.每个运行队列中的VCPU都有一个credit值
3. credit表示VCPU的priority的价值
4.CPU调度的是最先入队的处于under状态下的VCPU
5.每10msec 为一个时间片,响应一次中断。如果被调度的VCPU的credit处于OVER状态那么它将不再被继续调度,重新计算credit值,调度后面的处于under状态下的第一个VCPU
6.如果进行了3个时间片也就是30msec时,原先的VCPU还是没有处于OVER状态,那么这个VCPU也将不被继续调度,credit值的重计算,同5后面的步骤
7.代码中VCPU的credit的计算公式 = credit –CSCHED_CREDITS_PER_TICK (100)+30msec/n(VCPU的数)
8.处于OVER状态的VCPU credit的值不被增加
任务的优先级次序:
1.CSCHED_PRI_TS_UNDER
2.CSCHED_PRI_TS_OVER
3.CSCHED_PRI_IDLE
static void
csched_acct(void)计算任务优先级
{
unsigned long flags;
struct list_head *iter_vcpu, *next_vcpu;
struct list_head *iter_sdom, *next_sdom;
struct csched_vcpu *svc;
struct csched_dom *sdom;
uint32_t credit_total;
uint32_t weight_total;
uint32_t weight_left;
uint32_t credit_fair;