0

0

虚拟化与云计算技术硬核内幕 (20) —— 时间管理大师(下)

蓮花仙者

蓮花仙者

发布时间:2025-07-17 10:42:19

|

686人浏览过

|

来源于php中文网

原创

在上一期中,小e了解了“时间管理大师”的概念。实际上,这种将物理硬件分配给多个使用者的技术,称为“时分复用”。计算机操作系统的任务调度模块,实际上提供的就是将cpu以“时分复用”的方式分配给不同任务使用的机制。

在虚拟化系统中,如果同样利用时分复用机制,将一个物理CPU或HT分配给多个虚拟机使用,就可以让多个虚拟机共享一个物理HT。这意味着在虚拟机操作系统看来,CPU的数量会超过宿主机的物理HT数量。这就是所谓的“超分配”。

在Linux自带的KVM中,超分配实际上是默认的设置方式。

下图展示了Linux KVM中,vCPU的实现方式:

虚拟化与云计算技术硬核内幕 (20) —— 时间管理大师(下)通常,每台物理服务器上会有2-4个物理CPU,每个物理CPU内部会有若干个Core。Intel的处理器在开启了VT技术后,每个Core有两个HT(Hyper-Threads),在宿主机上的Linux操作系统看来就是两个CPU。

例如,一台服务器配置了2颗Intel 5218R CPU,每颗有20核,整机40核,那么,服务器上的操作系统可以检测到80个HT,也就是在操作系统看来,整机有80个CPU。

在Linux侧,KVM中,每一个VM就是一个用户空间的QEMU进程,而分配给VM的vCPU就是该QEMU进程的一个线程Thread。例如,某VM有4个vCPU,那么,这个QEMU进程中就有4个Thread。

由于Linux是一个SMP操作系统,在没有特殊设置的前提下,Linux的每个线程或进程,都可以被Linux调度到任意一个CPU。如果用户希望虚拟机的vCPU独占一个HT,可以通过将vCPU对应的QEMU进程下的thread绑定到HT来实现。

虚拟化与云计算技术硬核内幕 (20) —— 时间管理大师(下)如图所示,VM1的vCPU0和vCPU1被绑定到两个硬件HT,每个vCPU都有对应的硬件HT。

而VM2,则采用了“时间管理大师”的方式进行调度,如图所示,VM2的vCPU0和vCPU1,对应的QEMU线程在同一个硬件HT上运行,CPU会利用时分复用的方式调度两个QEMU的线程,也就是将一个硬件HT作为2个vCPU提供给虚拟机使用。

看到这里,大家可能会有一个疑问:VM上的vCPU是运行了包括GuestOS本身在内的多任务的,而它又只是QEMU的一个线程,这不是矛盾的吗?这个线程实际上到底会让物理CPU的HT执行什么样的指令呢?

Evoker
Evoker

一站式AI创作平台

下载

让我们回顾一下《虚拟化与云计算硬核技术内幕 (6) —— 妇女能顶半边天》里面,我们提到的:

Intel通过增加了VT-X系列机制,在VM Entry和VM Exit中让一个HT可以在宿主机状态和虚拟机状态之间切换。

实际上,当VM的vCPU发生VM Exit,退回到hypervisor的时候,就是退回到QEMU中,也就是当前VM GuestOS上的程序代码在运行时被切掉,CPU转而执行QEMU的代码!

如果这个vCPU是超分配出来的,也就是对应的QEMU线程会与其他VM的vCPU共用一个HT,那么,在系统的时钟中断中,会无条件切断虚拟机vCPU在这个HT上的运行,并引发VM Exit,中断处理程序会做下面这些事情:

保存vCPU的运行现场(各寄存器),特别是保存在堆栈中的切断时的程序指针(CS:IP)、标志位(EFLAGS)、堆栈选择子SS和堆栈指针SP;进入Linux的任务调度程序;确定该HT上应当运行的下一个任务,并将该任务上次被时钟中断切掉时的现场恢复到CPU的各寄存器;最后执行iret指令,把下一个任务的SS,SP,EFLAGS和CS:IP数据恢复到CPU的这两个寄存器,CPU开始执行下一个任务;由于这个HT已经被虚拟化KVM所管理,上面只会运行分配给不同VM的vCPU对应的线程,因此,下一个任务一定是其他VM对应的QEMU里面,拉起vCPU的线程。这个线程会再次通过VM Entry,转到上次这个vCPU被时钟中断切断的执行现场,继续执行该vCPU服务于虚拟机时的程序。

这样,Linux操作系统的“时间管理大师”功能就可以用于虚拟机对CPU资源的时分复用啦!

然而,小E又思考了一个新的问题:

在虚拟化系统中,CPU可以通过“时间管理大师”的方式被多个虚拟机复用,或“超卖”,那么,有没有办法让内存也这样“超卖”呢?

请看下回分解。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

389

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

389

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

60

2025.12.01

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1348

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

701

2023.06.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号