KVM VCPU线程调度问题的讨论
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线程调度问题的讨论的更多相关文章
- KVM CPU线程等学习记录
绝大多数操作系统调度单位是线程.线程是调度和分配的基本单位,进程是资源拥有的基本单位.linux下fork的叫进程pthread叫线程创建进程比线程性能要差好多5-100倍,因进程不同而异.进程之间共 ...
- qemu创建vm和vcpu进入kvm的流程
kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换. 1.qemu发起KVM_CREATE_VM的ioctl创 ...
- [ kvm ] 进程的处理器亲和性和vCPU的绑定
cpu调用进程或线程的方式: Linux内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个CPU上执行.一个进程在前一个执行时间是在cpuM上运行,而在后一个执行时间则是在cpuN上运行, ...
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- <Mastering KVM Virtualization>:第二章 KVM内部原理
在本章中,我们将讨论libvirt.QEMU和KVM的重要数据结构和内部实现.然后,我们将深入了解KVM下vCPU的执行流程. 在这一章,我们将讨论: libvirt.QEMU和KVM的内部运作方式. ...
- KVM halt-polling机制分析
本文由作者朱益军授权网易云社区发布. 简介 在实际业务中,guest执行HLT指令是导致虚拟化overhead的一个重要原因.如[1]. KVM halt polling特性就是为了解决这一个问题被引 ...
- kvm详细介绍
KVM详解,太详细太深入了,经典 2016-07-18 19:56:38 分类: 虚拟化 原文地址:KVM详解,太详细太深入了,经典 作者:zzjlzx KVM 介绍(1):简介及安装 http:// ...
- 虚拟化技术实现 — KVM 的 CPU 虚拟化
目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU ...
- [原] KVM 虚拟化原理探究(2)— QEMU启动过程
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...
随机推荐
- 第一个map reduce程序
完成了第一个mapReduce例子,记录一下. 实验环境: hadoop在三台ubuntu机器上部署 开发在window7上进行 hadoop版本2.2.0 下载了hadoop-eclipse-plu ...
- [XPath] XPath 与 lxml (二)XPath 语法
XPath 选取节点时使用的表达式是一种路径表达式.节点是通过路径(path)或者步(steps)来选取的. 本章使用以下 XML 文档作为示例. <?xml version="1.0 ...
- warning C4305:“初始化”:从“double”到“float”截断
编译VS项目时出现警告: warning C4305:“初始化”:从“double”到“float”截断(warning C4305: 'initializing' : truncation from ...
- 使用composer进行依赖管理:以guzzle为例
今天突然发现一个不错的php http客户端库guzzle,欣喜不已,跃跃欲试.打开guzzle文档,发现需要composer做依赖管理.之前没有接触过composer,正好以此学习下,也蛮好! 本文 ...
- codeforces水题100道 第二题 Codeforces Beta Round #4 (Div. 2 Only) A. Watermelon (math)
题目链接:http://www.codeforces.com/problemset/problem/4/A题意:一个整数能否表示成两个正偶数的和.C++代码: #include <cstdio& ...
- Matlab PCA 算法
Matlab 自带PCA函数形式为 [mappedX, mapping] = pca(X, no_dims) 自己编写PCA函数的步骤 %第一步:输入样本矩阵%%%%%%%%%%%%%%%%%%%%% ...
- springbatch---->springbatch的使用(七)
这里我们讲述一下springbatch中关于step层面上面的数据共享技术.而对街的人影都浸染在一片薄荷的白色中,由于无声,都好像经过漂染,不沾人间烟火. step的数据共享 关于springbatc ...
- commander.js 制作简易的 MINA CLI 脚手架
出发点并不是小程序本身,是想要做一个脚手架(command-line interface),看过 VUE / REACT 脚手架,觉得很厉害,但是并不太知道里面是怎么做成的,所以最近研究了研究,看能不 ...
- jQuery事件处理(三)
继续了解jQuery对浏览器兼容的处理 1.keyHooks对键盘按键的封装 keyHooks: { // 一些键盘相关的属性 props: "char charCode key keyCo ...
- 攻防对抗中常用的windows命令(渗透测试和应急响应)
一.渗透测试 1.信息收集类 #查看系统信息 >systeminfo #查看用户信息 >net user >net user xxx #查看网络信息 >ipconfig /al ...