对比线程,一个VCPU是什么
1. VCPU是线程不?
是
2. VCPU的线程是在用户态创建还是在KVM创建?
用户态,qemu先创建用户态线程,然后调用KVM ioctl的KVM_CREATE_VCPU;
最终会执行到kvm_main.c中kvm_vm_ioctl_create_vcpu,创建出VCPU;
而用户态线程调用KVM ioctl的KVM_RUN时,发起调用的线程将会作为VCPU的线程执行Guest代码;
3. 进入Guest代码的点?
在__kvm_vpu_run函数会将当前EL1寄存器状态保存,并打开EL2的trap,配置VTTBR、VPIDR等寄存器;
配置VGIC并将Guest的EL1相关寄存器更改为Guest的context;
真实进入Guest代码的点是__guest_enter(vcpu, host_ctxt),保存X19-X30寄存器并eret到EL1
4. 退出Guest代码的点?
而Guest的退出必然是由exception(包括IRQ)触发的,最终又会走到__guest_exit(),保存Guest X2-X30;
然后恢复Host X19-X30,将退出码放到X0并ret(X0再gcc中用于存函数返回值),回到__kvm_vpu_run函数。
5. VCPU的调度与用户线程的调度有何不同?
VCPU的调度与线程是一样的;
6. 傻子也能看得出,VCPU的context比一个thread得多出一堆EL1的特殊寄存器吧,你告诉我VCPU的调度跟线程一样?
是的,就是一样的,虽然KVM在task_struct中多注册了preempt_notifiers元素;
我仔细分析了这个notifier:
这个notifier中的preempt_ops有sched_in/sched_out两个方法:
schedule调度入口在执行context_switch时,
在prepare_task_switch中调用了fire_sched_out_preempt_notifier,
在finish_task_switch中调用了fire_sched_in_preempt_notifier;
struct kvm_vcpu->preempt_notifier中的sched_in/sched_out在上述两处被调用
但这仅在CONFIG_PREEMPT_NOTIFIERS打开时,才可能有用(还受preempt_notifier_key变量控制);
并且我自己查找并确认,#####sched_in/sched_out并没有保存/恢复EL1的各个特殊寄存器#####
7. 那么EL1的特殊寄存器集合是如何在每次context切换中保存/恢复的:
我认为是在__kvm_vpu_run
下面的分析没有Google到太权威的支撑,但是经过对kernel4.15代码的分析、搜索,我认为这是对的:
首先要说,当VCPU在物理CPU中运行时,物理中断发生,是可以对其打断并进入异常向量处理的,
根据__kvm_hyp_vector中的指示,大概就是陷入EL2 context,然后走el1_irq向量,然后执行__guest_exit,也就是4.中所说退出Guest的点
在Guest退出点会恢复之前的线程上下文(依旧在EL2中),也就是回到__kvm_vcpu_run中,若事件可直接处理,在处理完毕后可直接再回到Guest上下文;
若无法直接处理则保存Guest上下文并退出EL2。
在整个退出EL2之前,我认为没有机会触发Host schedule,Host调度Timer等需要Host处理的中断,自然会使VCPU保存Guest上下文并走到Host处理流程。
对比线程,一个VCPU是什么相关推荐
- 多线程下的生产者消费者(一个初始值为0的变量,两个线程一个加1一个减1,轮询5轮)
在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了.配合Object的wait().notify()系列方法可以实现等待/通知模式.Condition接口 ...
- java编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替
2.编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z.打印顺序为12A34B56C-.5152Z.即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印 ...
- python多线程和异步性能对比_python对比线程,进程,携程,异步,哪个快
目录 概念介绍 测试环境 开始测试 测试[单进程单线程] 测试[多进程 并行] 测试[多线程 并发] 测试[协程 + 异步] 结果对比 绘图展示 概念介绍 首先简单介绍几个概念: 进程和线程 进程就是 ...
- 代码对比与文件对比的一个简单方法
使用的工具为Beyond Compare,Beyond Compare这款软件是专门为常常要对文件及文件夹操作的朋友设计的.如平常我们要对文件进行对比,文件夹的同步等操作,用他就能很简单的实现这些需求 ...
- 一台服务器最多多少个线程,一个电脑最多能开启多少个线程?
-- 一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个.一个解决办法是创建线程时减少 ...
- java 两个url对比_一个URL模式中的两个slu ..
如何将两个slu in放在一个url模式中?我有一个与模型类别有多对一关系的模型链接 . url( regex=r'^(?P[\w-]+)/(?P\d+)(?:/(?P[\w\d-]+))?/$', ...
- 宝马 Esys plus NCD对比的一个辅助工具
在对宝马汽车设码的时候,经常会用到 Esys plus NCD对比功能. 对比的结果需要保存,本人开始用Excel,想把结果分列,但结果太麻烦,还是自己写个软件,把结果筛选需要保存的部分,方便设码.免 ...
- C++作用域、局部变量、全局变量、传引用传值对比的一个例子
参考博文:<Essential C++>笔记之传引用&(pass by reference)分析 参考博文:C++基础与深度解析第六章:函数 传引用
- python之进程和线程的对比
python之进程和线程的对比 1. 进程和线程的对比的三个方向 关系对比 区别对比 优缺点对比 2. 关系对比 线程是依附在进程里面的,没有进程就没有线程. 一个进程默认提供一条线程,进程可以创建多 ...
- python提高——进程、线程、协程对比及代码实现
目录 1多任务 1.1并发 1.2并行 2线程 2.1引入线程 2.2线程进行顺序 2.3线程封装 2.4多线程-共享全局变量 2.5资源竞争 2.6互斥锁 2.7死锁 3进程 3.1进程创建 3.2 ...
最新文章
- python操作微信小程序云端数据库_微信小程序云开发之数据库操作
- 业内首创普惠保险,看国泰产险如何借助数据进行智能化的升级和战略转型
- [USACO15FEB]Superbull (最小生成树)
- Android学习第三天--事件监听器
- Python 全国考级二级
- java 动态网页_JavaWeb01-动态网页
- 厦门大学c语言上机答案,厦门大学C语言程序设计2016模拟题讲评及课程复习.pptx...
- JavaAPI之Runtime类以及bat文件开启应用程序
- linux启动 mongo 不了问题
- ADI公司完成对凌力尔特公司的收购
- ATP-EMTP电缆LCC模型中相数与电缆数的设置
- IntelliJ IDEA插件的Jrebel激活踩坑【内网离线使用】
- 2017年网络小说人气排行榜
- 1寸、2寸、小2寸的照片尺寸是多少
- alanwang[GDOU] 直接插入排序法简单演示
- 关于网络性能的一些指标
- IDEA自动补全tab键向下选择s-tab向上选择
- 分数化成有限小数的方法_小数化成分数的方法
- Apache2.2.22 + PHP5.2.17 + MySQL5.5.22 快速搭建部署PHPWind开源论坛
- python pandas AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘