在traditional operating system中,有一个Idle Process:当OS里面没有任何task的时候,就靠Idle Process来空转CPU
在virtualization的环境下,如果还这么“空转”,显然是对CPU cycles的一种浪费。很自然的想法:当Guest Domain不需要CPU的时候,自动让出CPU给其他domain使用。这也是work-conserving的一种methodology。
Xen对Guest Domain里的Idle Process进行了改写,调用hypercall来代替原来的while (1)。 Follow me:-)
------------------------------------------------------------------
cpu_idle
xen_idle
safe_halt
raw_safe_halt
HYPERVISOR_block
HYPERVISOR_sched_op(SCHEDOP_block, NULL)
SCHEDOP_block
do_block: 这个函数只有在SCHEDOP_block时才被调用,也就是说,只有Guest Domain的Idle Process可以引发do_block
-------------------------------------------------------------------
总这么block住也不行是吧,那啥时候被wake up呢?
容我再想想...
(1) ...
(2) ...
...
看看do_block哈:)
/* Block the currently-executing domain until a pertinent event occurs. */
static long do_block(void)
{
struct vcpu *v = current;
local_event_delivery_enable();
set_bit(_VPF_blocked, &v->pause_flags);
/* Check for events /after/ blocking: avoids wakeup waiting race. */
if ( local_events_need_delivery() ) {
clear_bit(_VPF_blocked, &v->pause_flags);
} else {
raise_softirq(SCHEDULE_SOFTIRQ); //哥决定让出CPU啦...
}
return 0;
}
static void schedule(void)
{
struct vcpu *prev = current, *next = NULL;
s_time_t now = NOW();
struct schedule_data *sd =sd = &this_cpu(schedule_data);
struct task_slice next_slice;
/* get policy-specific decision on scheduling... */
next_slice = ops.do_schedule(now);
next = next_slice.task;
sd->curr = next;
... ...
ASSERT(prev->runstate.state == RUNSTATE_running);
if (test_bit(_VPF_blocked, &prev->pause_flags)) { // do_block之后,应该跑到这里就对啦
vcpu_runstate_change(prev, RUNSTATE_blocked, now);
} else {
if (vcpu_runnable(prev))
vcpu_runstate_change(prev, RUNSTATE_runnable, now);
else
vcpu_runstate_change(prev, RUNSTATE_offline, now);
}
prev->last_run_time = now;
.........
context_switch(prev, next);
}
static struct task_slicecsched_schedule(s_time_t now)
{
const int cpu = smp_processor_id();
struct list_head * const runq = RUNQ(cpu);
struct csched_vcpu * const scurr = CSCHED_VCPU(current);
if ( vcpu_runnable(current) ) { // current如果还runnable,就继续插入runq;否则就已经不在runq里了
__runq_insert(cpu, scurr);
} else {
BUG_ON(is_idle_vcpu(current));
BUG_ON(list_empty(runq));
}
... ...
}
static inline int vcpu_runnable(struct vcpu *v)
{
if ( (v->pause_flags == 0) &&
(atomic_read(&v->pause_count) == 0) &&
(atomic_read(&v->domain->pause_count) == 0)) {
return true;
} else {
return false;
}
}
分享到:
相关推荐
分析了xen是如何创建DomainU的,这个是深入了解xen的必备知识
xen文档的分析
xen guest 配置文件,作为参考,方便 大家搭建环境
在xen环境下domain0与domainU之间虚拟驱动样例代码;使用方法如下: 1)在domain0中编译domain0代码 并使用insmod命令进行安装驱动 2)在domainU中编译domainU代码以及应用app 3)在domainU中insmod安装domainU驱动 4)...
To install RHEL 3, 4 and 5 beta 2, and Windows XP Xen guests. Setup at Start: A workstation installed with Red Hat Enterprise Linux 5 beta 2/ Virtualization Platform.
XEN guest虚拟机/云管理外壳提供基于安全,简单,轻松(远程,多用户,多级别)控制台的XEN DomU管理访问-具有简单的带宽监控。
xen 4.0 最新源码xen 4.0 最新源码xen 4.0 最新源码
当前找到的关于Xen内存管理的资料 当前关于Xen内存管理的资料还比较缺乏 有需要的 可以下来看看
XEN4.0内核编译XEN4.0内核编译XEN4.0内核编译XEN4.0内核编译XEN4.0内核编译XEN4.0内核编译XEN4.0内核编译XEN4.0内核编译
Xen中VCPU调度算法分析.pdf
Memory CoW in Xen xen memory cow 介绍
在不断涌现出的虚拟化解决方案中,开源解决方案Xen以其独特的虚拟化设计模式,以及接近单机操作系统的性能被学术界和工业界广泛看好,被认为是未来最有前途的虚拟化解决方案之一。, 《Xen虚拟化技术》以Xen 3.1.0...
c语言获取xen虚拟机的信息,如存储池信息、虚拟机的状态、cpu、cpu利用率、内存,网络信息等。
Xen是一个基于虚拟硬件监控器技术的虚拟化软件。Xen运行在一个宿主linux系统上,提供同时引导启动多个linux实例的...每个由Xen生成的虚拟机,被称为domain 。新创建的domain需要为其安装一个操作系统,方可引导并使用。
使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen 使用yum安装Xen
关于Xen的培训资料. 里面系统的讲述了Xen的构架和应用
Xen虚拟机最大的特点就是高性能,适合用于生产上。目前Xen已经被用于大型商用,例如亚马逊的ec2就是使用xen虚拟化技术。 本文档是本人根椐自己的实操经验和网上的资料整合出来的,包括Xen的历史,原理和操作命令, ...
XEN V1.0.7 [CyberNation]
Xen多网桥配置 Xen多网桥配置 Xen多网桥配置 Xen多网桥配置
Xen源码 —— xen-4.1.1.tar.gz xen-4.1.1.tar.gz