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同步時間一樣。

發佈了44 篇原創文章 · 獲贊 48 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章