KVM VCPU线程调度问题的讨论

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内核源码

相关文章
相关标签/搜索