Xen中的时间管理

Xen中要维持两种时间

  1. 真实时间(wall-clock time)
    想想Windows右下角的那个时间,或者家里墙上的钟表,可能就理解这个wall-clock time了
  2. 虚拟时间(virtual time)
    客户机运行的时间

为什么需要虚拟时间呢? 《The definitive guide to the Xen hypervisor》中有一段很好地解释:

“Virtual time is essential for scheduling of tasks running within a domain. Consider the case of two domains running on the same machine, each of which is scheduled for 10ms at a time. If each domain is running two tasks, and scheduling them for 10ms each using wall time, then one task in each domain will get half of the real CPU’s time and the other one will get none.”

我是这样理解的,假如我的机器上同时运行着两个客户机(客户机A,客户机B),Xen的管理程序采用时间片轮转来调度这两个客户机(时间片为10毫秒),客户机A上运行着两个任务(t1, t2),客户机A也恰好也采用时间片轮转来调度这两个任务,无独有偶,时间片也恰好是10毫秒。
假如11点11分11秒00毫秒时,A客户机开始运行(t1运行,t2挂起),B客户机挂起
那么11点11分11秒10毫秒时,B客户机开始运行,A客户机挂起
于是11点11分11秒20毫秒时,假如采用真实时间调度的话,问题就来了,A客户机一看,现在是11点11分11秒20毫秒,又应该调度t1了。
……如此继续下去,t2的结局只能是饿死!
为什么会酱紫呢?可能是客户机A误以为自己在11点11分11秒10毫秒时已经调度了t2,所以现在当然又轮到t1了,人家还是很大公无私的嘛。可是事实上,11点11分11秒10毫秒-11点11分11秒20毫秒之间,客户机A“断片”了,他根本不知道自己刚才做了什么,因此也完全不能意识到t2从来没有运行过。

为了解决这个问题,虚拟时间就粉墨登场了。它的作用就是把断了的片重新连起来,当真实时间是11点11分11秒20毫秒时,客户机A的感觉是从开机到现在只经过了10毫秒(断片时没有意识,也自然感觉不到时间的流逝,它只有看看表才会发现“我去,时间竟然已经过去了20ms”,可是虚拟时间告诉他:“别看表,just follow your heart!”)于是他根据内心的指示调度了t2。依次类推,t1和t2都能被公平的调度!

好像跑偏的有点远,回到我们的主题,时间管理。
管理虚拟时间比较简单,当客户机运行时,Hypervisor每隔一段时间向客户机发送一个tick event(时钟事件?),这样客户机就能知道自己一共运行了多长时间,也就知道了虚拟时间。
但是管理真实时间就比较麻烦了。真实事件主要与以下三个值有关:

  1. Initial system time:当系统第一次启动时的真实时间,这个时间记录在shared_info_t这个数据结构中(wc_sec和wc_nsec)。
  2. Current system time:从系统启动到现在经过的时间
  3. TSC time:(Time Stamp Counter, 时间戳计数器),从过去某个任意的时间点开始到现在所经历的时钟周期数。

    要使用TSC,首先要将它转化为纳秒:

    
    #define NANOSECONDS(tsc) (tsc << shared_info->cpu_info[0].time.tsc_shift)\
    
    * shared_info->cpu_info[0].time.tsc_to_system_mul

    其中用到了移位和乘法因子,这两个值分别存储在下面两个变量中
    这里写图片描述

假如现在,我需要知道真实时间,该怎么做呢?

首先,使用RDTSC指令从TSC寄存器中读出当前的TSC time值,使用上面的宏将其转化为纳秒,记为NSnow
然后取出系统刚启动的时候TSC time的值(记录在tsc_timestamp 中),并将其转化为纳秒,记为NS0
然后Current system time=NSnow-NS0
最后
真实时间(wall-clock time)=Initial system time+Current system time
(即:现在的时间=系统启动时的时间+流逝的时间)

这个问题上基本说清楚了。但理论是理论,实际上为了减少误差,Xen有时候会使用NTP等方法更新系统的真实时间,就像在Windows里从time.windows.com同步时间一样。

你可能感兴趣的:(时间管理)