2017-11-15windows
今天閒着沒有忽然想了想VCPU線程調度的問題,具體描述以下:線程
當表明VCPU的線程得到控制權後,首先會經過KVM接口進入到內核,從內核進入到非根模式,那麼此時站在全局調度器的點上,這並不算作線程的時間,這種狀況下調度器還能正常調度VCPU線程嗎?接口
經過查看intel手冊,分析相關時鐘中斷的源代碼,目前理解以下:進程
基本知識:源碼
CPU的VMX模式分爲root模式和non root模式,兩者的0-3環是正交的,即在root模式下有ring0~ring3,在non root模式下也有ring 0到ring3,一個VCPU線程獲得運行,經過KVM接口進入到內核,最終須要從root模式進入到non root模式,進入non root模式後就是虛擬機運行的階段了。虛擬機有本身的內核層和用戶層,即ring0-ring3。虛擬機
按照當前Linux下的CFS調度器爲例,基於虛擬運行時間來調度進程,而虛擬運行時間的統計本質上仍是基於時鐘中斷。時鐘中斷處理程序中會分析當前CPU處於ring0 仍是ring3(不區分root和non root),繼而更新進程時間統計量。以前聽人說進程在內核中的時間是不算作調度參考時間的,可是根據代碼來看,時鐘中斷時無論是處理用戶態仍是內核態,最終都會增長對應進程的虛擬運行時間,這點若有仁兄明白還請告知。而在中斷會返回的時候,咱們知道在搶佔內核下,會增長一個調度時機,此時若是有更加緊迫的進程須要執行,則進行內核搶佔。若是返回用戶空間,則正常進行調度的檢查。程序
回到開始咱們提出的問題,假如一個虛擬機正在運行,此時時鐘中斷到來,那麼CPU 在保存現場後,繼而去執行中斷處理程序,其中就會統計當前進程(必然是VCPU線程)的時間信息,並會更新VCPU線程的虛擬運行時間,若是運行時間到了則設置重調度位,處理完成後返回。若是以前虛擬機位於內核模式(non root 下的內核模式)且支持內核搶佔,則會觸發調度器進行調度;若是虛擬機位於用戶模式,則會直接觸發調度。因此從這裏看,HOST上調度器的運行和VMX模式並無本質聯繫。而虛擬機內部進程的調度就比較容易理解了,和傳統進程調度沒有區別,雖然INTEL手冊嚴格規定了non root模式下不容許任務切換嗎,可是其實針對使用TSS來講的,而現實狀況下,無論是windows仍是Linux 都沒有使用TSS作任務切換,故實際上虛擬機內部進程切換仍是在non root 模式下進行的(至少目前我是這麼認爲的)統計
以馬內利時間
參考:源代碼
intel 手冊
Linux內核源碼