首页 xen调度相关分析

xen调度相关分析

举报
开通vip

xen调度相关分析1、SCHEDULE_SOFTIRQ这个软中断用于触发调度器的执行。在调度器初始化的时候初始化,中断服务例程是调度函数schedule。代码:/*Initialisethedatastructures.*/void__initscheduler_init(void){inti;939940open_softirq(SCHEDULE_SOFTIRQ,schedule);使用:raise_softirq(SCHEDULE_SOFTIRQ);执行该代码之后会导致所在cpu执行调度2、schedule选择下一个待执行的vc...

xen调度相关分析
1、SCHEDULE_SOFTIRQ这个软中断用于触发调度器的执行。在调度器初始化的时候初始化,中断服务例程是调度函数schedule。代码:/*Initialisethedatastructures.*/void__initscheduler_init(void){inti;939940open_softirq(SCHEDULE_SOFTIRQ,schedule);使用:raise_softirq(SCHEDULE_SOFTIRQ);执行该代码之后会导致所在cpu执行调度2、schedule选择下一个待执行的vcpu,执行vcpu切换TOC\o"1-5"\h\z/**Themainfunction*-deschedulethecurrentdomain(schedulerindependent).*-pickanewdomain(schedulerdependent).*/staticvoidschedule(void){structvcpu*prev=current,*next=NULL;s_time_tnow=NOW();structschedule_data*sd;structtask_slicenext_slice;/*getpolicy-specificdecisiononscheduling...*/next_slice=ops.do_schedule(now);〃对于credit调度算法,会执行credit调度器中注册的//csched_schedule函数836837next=next_slice.task;838839sd->curr=next;840if(next_slice.time>=0)/*-vemeansnolimit*/set_timer(&sd->s_timer,now+next_slice.time);//设置next需要运行的时间843if(unlikely(prev==next)){spin_unlock_irq(&sd->schedule_lock);trace_continue_running(next);returncontinue_running(prev);//直接执行schedule_tail函数,跳过vcpu切换}850TRACE_2D(TRC_SCHED_SWITCH_INFPREV,prev->domain->domain_id,now-prev->runstate.state_entry_time);TRACE_3D(TRC_SCHED_SWITCH_INFNEXT,next->domain->domain_id,(next->runstate.state==RUNSTATE_runnable)?(now-next->runstate.state_entry_time):0,next_slice.time);vcpu_runstate_change(prev,(test_bit(_VPF_blocked,&prev->pause_flags)?RUNSTATE_blocked:(vcpu_runnable(prev)?RUNSTATE_runnable:RUNSTATE_offline)),now);prev->last_run_time=now;867ASSERT(next->runstate.state!=RUNSTATE_running);vcpu_runstate_change(next,RUNSTATE_running,now);870ASSERT(!next->is_running);next->is_running=1;〃设置正在运行标志位TRACE_4D(TRC_SCHED_SWITCH,prev->domain->domain_id,prev->vcpu_id,next->domain->domain_id,next->vcpu_id);887context_switch(prev,next);〃执行vcpu切换}3、block/*Blockthecurrently-executingdomainuntilapertinenteventoccurs.*/staticlongdo_block(void){structvcpu*v=current;463local_event_delivery_enable();set_bit(_VPF_blocked,&v->pause_flags);〃设置block标志位_VPF_blocked466/*Checkforevents/after/blocking:avoidswakeupwaitingrace.*/if(local_events_need_delivery())〃检测currentvcpu的pending位是否被设置以及//eventdelivery是否被允许TOC\o"1-5"\h\z{clear_bit(_VPF_blocked,&v->pause_flags);}else{TRACE_2D(TRC_SCHED_BLOCK,v->domain->domain_id,v->vcpu_id);raise_softirq(SCHEDULE_SOFTIRQ);//currentvcpu被标识为block状态,调度其他vcpu运行}477return0;}4、wake唤醒指定的vcpu,使其从block状态却换到可运行状态voidvcpu_wake(structvcpu*v){unsignedlongflags;248249vcpu_schedule_lock_irqsave(v,flags);250if(likely(vcpu_runnable(v)))TOC\o"1-5"\h\z{if(v->runstate.state>=RUNSTATE_blocked)vcpu_runstate_change(v,RUNSTATE_runnable,NOW());SCHED_OP(wake,v);//执行调度器中的wake函数}elseif(!test_bit(_VPF_blocked,&v->pause_flags)){if(v->runstate.state==RUNSTATE_blocked)vcpu_runstate_change(v,RUNSTATE_offline,NOW());}270vcpu_schedule_unlock_irqrestore(v,flags);271TRACE_2D(TRC_SCHED_WAKE,v->domain->domain_id,v->vcpu_id);}重要函数记录:structdomain*d;structvcpu*v;for_each_vcpu(d,v)遍历domain中的vcpu{if(v!=current)vcpu_pause(v);}structdomain*rd;domid_tdom;rd=rcu_lock_domain_by_id(dom);根据domid获取相应的数据结构
本文档为【xen调度相关分析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_179289
暂无简介~
格式:doc
大小:12KB
软件:Word
页数:4
分类:
上传时间:2018-07-18
浏览量:0