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. SaltStack Grains 和 Pillar

    Grains: (1) grains 是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息(2) grains 是 minion 启动时收集到的一些系统信息,比如操作系统版本.内核版本.C ...

  2. GitLab 使用

    命令行界面的基本操作如下,Web界面的操作参考:https://www.cnblogs.com/pzk7788/p/10291378.html [root@localhost ~]$ gitlab-c ...

  3. Linux 上安装oracle客户端

    1. 下载安装包 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html oracle-instantclient11 ...

  4. Android 中的 Context

    主要的功能是加载和访问资源(Context通常用来获取APP资源,创建UI,获取系统Service服务,启动Activity,绑定Service,发送广播,获取APP信息等) 如何理解: 我们可以理解 ...

  5. C语言变量的存储布局

    分析以下代码中变量存储空间如何分配: //MemSeg.c: 代码无意义,仅供分析用 #include <stdio.h> #include <stdlib.h> //mall ...

  6. 原生js--异步请求

    1.异步请求的方法: iframe.script.XMLHttpRequest.comet(服务器端发起) 2.XMLHttpRequest request = new XMLHttpRequest( ...

  7. ant重新编译打包hadoop-core-1.2.1.jar时遇到的错

    错误1. [root@MyDB01 hadoop]# ant -Dversion=1.2.1 examples 错误: 找不到或无法加载主类 org.apache.tools.ant.launch.L ...

  8. Sencha Touch 实战开发培训 电子书 基础篇

    本期课程基于Sencha Touch 2.4.1,属于新手实战入门课程,侧重于实用性. 课程目录: 开源Demo:https://bitbucket.org/moLangZaiShi/demo 本课程 ...

  9. Javascript 变态题解析

    读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了.... 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变 ...

  10. 如何防御mimikatz致敬Mimikatz攻防杂谈学习笔记

    零.绪论:mimikatz简介 mimikatz是一款出色的内网渗透工具,可以抓取windows主机的明文密码.NTLMhash值或者kerberos对应的缓存凭据.mimikatz的使用在获取权限后 ...