2017-11-15


今天闲着没有突然想了想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内核源码

KVM VCPU线程调度问题的讨论的更多相关文章

  1. KVM CPU线程等学习记录

    绝大多数操作系统调度单位是线程.线程是调度和分配的基本单位,进程是资源拥有的基本单位.linux下fork的叫进程pthread叫线程创建进程比线程性能要差好多5-100倍,因进程不同而异.进程之间共 ...

  2. qemu创建vm和vcpu进入kvm的流程

    kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换. 1.qemu发起KVM_CREATE_VM的ioctl创 ...

  3. [ kvm ] 进程的处理器亲和性和vCPU的绑定

    cpu调用进程或线程的方式: Linux内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个CPU上执行.一个进程在前一个执行时间是在cpuM上运行,而在后一个执行时间则是在cpuN上运行, ...

  4. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  5. <Mastering KVM Virtualization>:第二章 KVM内部原理

    在本章中,我们将讨论libvirt.QEMU和KVM的重要数据结构和内部实现.然后,我们将深入了解KVM下vCPU的执行流程. 在这一章,我们将讨论: libvirt.QEMU和KVM的内部运作方式. ...

  6. KVM halt-polling机制分析

    本文由作者朱益军授权网易云社区发布. 简介 在实际业务中,guest执行HLT指令是导致虚拟化overhead的一个重要原因.如[1]. KVM halt polling特性就是为了解决这一个问题被引 ...

  7. kvm详细介绍

    KVM详解,太详细太深入了,经典 2016-07-18 19:56:38 分类: 虚拟化 原文地址:KVM详解,太详细太深入了,经典 作者:zzjlzx KVM 介绍(1):简介及安装 http:// ...

  8. 虚拟化技术实现 — KVM 的 CPU 虚拟化

    目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU ...

  9. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

随机推荐

  1. [WallProxy] WallProxy

    1. 在Linux/Ubuntu平台导入CA.crt证书. 1.1. 首先安装libnss3-tools:sudo apt-get install libnss3-tools. 1.2. 导入证书:c ...

  2. Windows下mysql重设密码

    Windows下的实际操作如下 .关闭正在运行的MySQL,即关闭服务. .打开DOS窗口,转到mysql\bin目录. .输入 mysqld --skip-grant-tables 回车.如果没有出 ...

  3. Matlab 图像处理入门

    一些(形态学)图像处理方法如下: I = imread('pic.jpg'); I2 = rgb2gray(I); figure,imshow(I); title('原图'); figure,imsh ...

  4. Linux记录用户shell命令

    在/etc/profile中添加下面内容: export LC_ALL=C TMOUT=3600 HISTFILESIZE=2000 HISTSIZE=2000 HISTTIMEFORMAT=&quo ...

  5. php pear包打包方法

    一)首先下载工具onion 浏览器打开,服务器上wget测试无法正常下载 地址:https://raw.github.com/c9s/Onion/master/onion 二)在临时目录下,建立相关目 ...

  6. 【PHP】常见算法

    1 冒泡排序 思路:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒. 即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它 ...

  7. C#设计模式--装饰器模式

    0.C#设计模式-简单工厂模式 1.C#设计模式--工厂方法模式 2.C#设计模式--抽象工厂模式 3.C#设计模式--单例模式 4.C#设计模式--建造者模式 5.C#设计模式--原型模式 6.C# ...

  8. [原]openstack-kilo--issue(二) openstack auth error

    /** 系统环境:redhat7.2 repo:163 openstack version : kilo author: lihaibo 本博客已经添加"打赏"功能,"打 ...

  9. [Sdoi2016]生成魔咒[SAM or SA]

    4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 569[Submit][Statu ...

  10. A simple guide to 9-patch for Android UI

    extends:http://radleymarx.com/blog/simple-guide-to-9-patch/ While I was working on my first Android ...