虚拟机(xen)中credit调度算法分析----schedule.c中调度部分的代码
杭州电子科技大学网格与服务计算实验室 周峰
目前在XEN虚拟机中的调度算法有两种:一种的是SEDF,另一种是CREDIT。在这里只对CREDIT进行探讨,至于SEDF会留到后进行。首先我们来说说对调度的抽象层中的schedule.c文件中调度部分的代码. 在虚拟机xen中关于调度的代码是这样的:
void __init scheduler_init(void)
{ int i;
open_softirq(SCHEDULE_SOFTIRQ, schedule); //打开/注册schedule这个软中断
for_each_cpu ( i )
{ //为每个cpu定一个定时器。在时间到后就调用回调函数s_time_fn, 并且在回调函数中调用产生软中断(设置bit),在cpu 发送vmexit后会检查软中断的mask位,如果发现某些位被置上后就会调用其中断回调函数。
spin_lock_init(&per_cpu(schedule_data, i).schedule_lock);
init_timer(&per_cpu(schedule_data, i).s_timer, s_timer_fn, NULL, i);
}
for ( i = 0; schedulers[i] != NULL; i++ )
{
ops = *schedulers[i];
if ( strcmp(ops.opt_name, opt_sched) == 0 )
break;
}
if ( schedulers[i] == NULL )
printk("Could not find scheduler: %s/n", opt_sched);
printk("Using scheduler: %s (%s)/n", ops.name, ops.opt_name);
SCHED_OP(init);
}这里你可能有个疑问,既然存在两个不同的算法,那么我们怎么来定义使用哪一个算法呢?其实很简单,选择调度算法是用opt_sched字符数组来选择的!
/* opt_sched: scheduler - default to credit */
static char opt_sched[10] = "credit";
string_param("sched", opt_sched);
ps:这篇借鉴了联想研究院宋伟的文章,特此申明!