虚拟机(xen)中credit调度算法分析
来源:互联网 发布:武汉黄陂公安局网络 编辑:程序博客网 时间:2024/06/05 10:09
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的值不被增加
概念:Credit, Weight, Cap
想彻底搞清楚这三个词的概念,我想最重要的是把这个函数读懂:sched_credit.c/csched_acct()
Credit: 这是针对Scheduler而言的,而不是针对Domain.
csched_priv.credit = CSCHED_CREDITS_PER_ACCT * #_of_PCPU. (for example: 300 * 4 = 1200)
Weight: 这个是针对Domain而言的,Scheduler根据各个domain的Weight,来分配credit。是一个“相对”的概念
比如说:256:256和512:512是一样的,彼此各占一半。但有什么区别呢?
512:512相对于256:256,控制的精度更高。
/*
* A domain's fair share is computed using its weight in competition
* with that of all other active domains.
*
* At most, a domain can use credits to run all its active VCPUs
* for one full accounting period. We allow a domain to earn more
* only when the system-wide credit balance is negative.
*/
Cap: 这个也是针对Domain而言的,是一个“绝对”的概念。100代表一整颗PCPU的Cycles。50代表,最多可以运行半个PCPU的Cycles.
在csched_acct这个函数中:
(1) 根据各个domain的weight情况,把total_credit分配到各个domain中
credit_fair = ( ( credit_total * sdom->weight) + (weight_total - 1)
) / weight_total;
(2) 再把domain的Credit平均分配到domain的各个VCPU中
credit_fair = ( credit_fair + ( sdom->active_vcpu_count - 1 )
) / sdom->active_vcpu_count;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/snailhit/archive/2010/12/30/6107279.aspx
虚拟机(xen)中credit调度算法分析
宋伟 联想研究院
调度简介
在虚拟机xen中主要有两中调度算法,一种是credit算法,另一种是sedf算法。Credit算法就是让每一个vcpu(虚拟cpu)都可以公平的使用物理cpu的资源。Sedf算法可以根据每个vcpu负载的大小动态的调整vcpu的优先级。
在虚拟机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);
}
在schedule.c中其实是对调度的抽象层,具体的实现在sched_credit.c or sched_sedf.c中。至于要使用sedf或者credit算法。可以由宏定义来指明。
Credit算法
Credit算法:
每个物理cpu都有一个runq,这个runq是一个以每个vcpu的priority的大小来排序的。Priority有over(above fair share) and down(below fair share)
(图一)调度队列整体结构
图(二)Credit scheduler调度队列具体实现
图(三)内核启动调度器流程
图(四)调度器初始化流程
图(五)Credit 调度的优先级计算方法
我们可以看到bsp对其他的ap的runq队列按照计算的优先级进行排序。
图(六) Credit算法偷取任务流程图
- 虚拟机(xen)中credit调度算法分析(一)
- 虚拟机(xen)中credit调度算法分析(1)
- 虚拟机(xen)中credit调度算法分析(2)
- 虚拟机(xen)中credit调度算法分析(3)
- 虚拟机(xen)中credit调度算法分析
- 虚拟机(xen)中credit调度算法分析---(二)
- Xen中Credit调度算法分析
- Xen Credit调度算法
- xen中cpu调度算法credit的过程详解
- Xen Credit调度算法详细说明
- xen的调度算法分析
- Xen CPU 调度算法对比
- 虚拟机 Xen 调度schedule研究文档
- xen的cpu调度流程分析(1)
- xen的cpu调度流程分析(2)
- Xen's Credit Scheduler
- xen credit scheduler 机制
- Xen 虚拟机 网络结构分析
- Intent 广播 发送 接收
- 团队建设
- Flex+J2EE获取FlexSession的方法
- JQuery实现radio、select、checkbox禁用
- linux 笔记
- 虚拟机(xen)中credit调度算法分析
- activity的基本介绍(转)
- C#.NET页面跳转+js
- 不修改IIS设置,在IIS6下运行MVC架构的网站
- org.codehaus.xfire.fault.XFireFault: Parameter {http://xxx.xxx}method(方法) does not exist!异常
- Oracle中的游标
- 一个关于文件写入时乱码的故事
- MOSS爬网问题Error from SharePoint site: Data is Null. This method or property cannot be called on Null values
- 如何面对自己