计算虚拟化1——CPU虚拟化

news2024/11/28 4:40:43

目录

vCPU的概念

vCPU和CPU的关系

CPU的Ring级别

CPU虚拟化技术

软件辅助全虚拟化

半虚拟化

硬件辅助虚拟化


计算资源的虚拟化可以分为CPU虚拟化、内存虚拟化、I/O虚拟化三个方面

CPU虚拟化:多个虚拟机共享CPU资源,对虚拟机中的敏感指令进行截获并模拟执行

内存虚拟化:多个虚拟机共享同一物理内存,需要相互隔离

I/O设备虚拟化:多个虚拟机共享一个物理设备

vCPU的概念

vCPU和CPU的关系

vCPU和物理CPU的关系

一个物理CPU有多个内核,每个内核可以有多个线程

如果物理CPU没有超线程技术

一个内核同时只能处理一个任务

即一个内核对应一个vCPU,将一个内核虚拟为一个vCPU,为虚拟机提供CPU资源

如果物理CPU有超线程技术

一个内核若有两个线程,就可以同时处理2个任务

即一个线程对应一个vCPU,将一个线程虚拟为一个vCPU,为虚拟机提供CPU资源

综上可知:多台虚拟机之间可以复用同一个物理CPU

vCPU的分配

虚拟CPU分配给虚拟机时,虚拟CPU的数量不能超过单台物理节点所能提供的vCPU数量

即:虚拟机分配的CPU总量不能超过单台物理节点所能提供的vCPU数量

分配规则

为虚拟机分配CPU初始值,该初始值应考虑该虚拟机在物理机运行所需的配置(在物理机运行需要多少cpu资源,虚拟机就分配多少cpu资源)

观察该虚拟机使用资源的均值和峰值(2个星期左右),然后再修改CPU的分配数量,得到资源利用最大化(修改后的CPU尽量保证虚拟机的均值控制在50~70%,峰值控制在50~90%之间)

CPU的Ring级别

CPU 指令分级

现代计算机的CPU技术有个核心的特点,就是根据指令的敏感程度分为不同的权限级别来实现运行的,避免了用户与应用程序层面的错误导致整个系统的崩溃;不同类型的CPU会分为不同的权限级别,不过总体的思想是一致的,以下我们主要通过x86的CPU作为代表来讲解CPU的虚拟化

x86 物理CPU的权限分级

x86 CPU分为4个级别,分别为Ring0、Ring1、Ring2、Ring3

Ring0级别(内核态)

直接作用于操作系统内核,给系统核心命令使用的权限,调用系统资源,优先级最高;可以访问内存的所有数据

Ring1-2级别

用于操作系统服务(设备驱动程序)

Ring3级别(用户态)

应用程序APP使用的权限,优先级最低;只能受限的访问内存,并且CPU资源可以被其他程序获取

我们重点关注的是Ring0(内核态)与Ring3(用户态)

每一层只能访问本层以及权限更底层的数据,当用户态直接执行Ring0权限的指令时,会被系统显示为非法指令,会报错,这种操作可能会导致系统出错

物理机操作系统中的用户态如何实现访问内核态呢

当APP需要执行访问磁盘、写文件等操作时,APP需要通过执行系统调用函数,在执行系统调用时CPU的运行级别就会从Ring3切换到Ring0,并跳转到系统调用对应的内核代码位置来进行相关操作,相关操作执行完成之后,从Ring0返回到Ring3,实现用户态与内核态的切换

CPU的指令类型

特权指令

只用于操作和管理关键系统资源的指令,必须在Ring0权限级别上才能运行的指令(可能会有部分特权指令存在于Ring1的权限)

普通指令

在CPU普通权限级别上就可以运行,即在Ring3级别上运行的指令(Ring1-2也属于用户态)

敏感指令

在虚拟化环境下的特殊指令被称为敏感指令

敏感指令指的是修改虚拟机的运行模式或宿主机状态的指令,也就是说是将Guest OS中原本需要在Ring 0模式下才能运行的特权指令剥夺特权后,交给VMM所执行的指令


CPU虚拟化技术

虚拟化架构知识:

Ring0不允许出现在多个操作系统同时运行的时候,因为宿主操作系统工作在Ring0,虚拟机操作系统就不能运行在Ring0,而当客户操作系统执行特权指令时就会发现错误

为了解决以上问题,提出了软件辅助全虚拟化、半虚拟化、硬件辅助全虚拟化三种解决方法

不论是哪种虚拟化技术,关于虚拟机特权指令的操作都要交给VMM,由VMM交给底层硬件,不同的虚拟化技术只是说VMM交给底层硬件的方式不同

 

软件辅助全虚拟化

半虚拟化

硬件虚拟化

实现技术

通过二进制转换、翻译实现

通过超级调用Hypercall实现

通过将特权指令转到Root模式实现

应用厂商

Vmware Workstation

Xen
不过Xen只支持对Linux的虚拟化
不支持对Windows的虚拟化
因为Windows不开源

Vmware ESXi/Hyper-v/KVM/Xen 3.0

性能

最好,几乎与物理主机性能相同

CPU需要在两种模式切换,带来额外开销
不过其性能正逐渐逼近半虚拟化

兼容性

最佳兼容性

需要修改操作系统,兼容性差

最佳兼容性

软件辅助全虚拟化

使用VMM在底层硬件和服务器之间建立一个抽象层,将物理资源全部抽象化(即针对与虚拟机的所有的底层硬件都是由VMM模拟实现的),不过虚拟机会认为自己是在真实的主机上运行的,而VMM就是虚拟机访问物理层的接口

实现的原理

VMM运行在最高权限等级,Guest OS的特权指令等操作交由VMM代为完成

即:将虚拟机运行的特权指令进行捕获、翻译,使之成为只能对虚拟机生效的虚拟特权指令,软件拦截使得性能开销大

提供两种工作机制(特权解除、陷入模拟)

特权解触(优先级压缩)

虚拟机执行Ring0指令时,将指令发到VMM时会触发VMM异常,这些异常就被VMM捕获,再由VMM将这些特权指令进行虚拟化成为只针对虚拟CPU起作用的虚拟特权指令

本质为使用能运行在物理机用户态中的非特权指令模拟出只对虚拟机有效的虚拟特权指令,实现特权指令的降级

存在的问题:有一部分特权指令会存在于Ring1权限中,而Ring1指令并不会触发VMM的异常捕获,从而导致在虚拟机中执行的特权指令直接对物理机造成了影响,可能导致系统出现故障

陷入模拟(二进制模拟—使用较多)

VMM会对虚拟机传来的指令的二进制代码进行扫描,一旦发现执行的是特权指令时,会将这些二进制代码翻译成虚拟特权指令的二进制代码或者是翻译成运行在核心态中的特权指令二进制代码从而强制的触发异常

这种方案就解决了虚拟机运行Ring1指令时没有被VMM捕获的问题

半虚拟化

实现的原理

通过对Guest OS的内核代码进行一定的修改,将原来在Host OS上执行的一些特权指令修改成可以和VMM直接交互的方式(即将虚拟机对特权指令的调用改为对直接对VMM的调用-这种调用方式为Hypercall),由VMM直接将特权指令传递给物理机,这样就不会有捕获异常、翻译等过程,性能损耗比较少;不过需要给虚拟机操作系统打补丁,并且虚拟机系统的镜像文件并不通用

此时虚拟机知道自己是运行在虚拟环境中,并不是运行在真正的物理主机上

硬件辅助虚拟化

通过此方式就形成了新的执行态(Root态和非Root)

Root与非Root操作模式将原有的CPU操作区分为VMM所在的Root操作区和虚拟机所在的非Root操作区,每个操作区都拥有Ring0-3的所有指令级别;通过这种新的执行态,使得VMM和Guest OS被完全隔离

实现原理

硬件辅助虚拟化是使用了支持虚拟化功能的CPU进行支撑(Inter-TV和AMD-V技术就可以使得CPU支持虚拟化),虚拟机运行在非Root态的核心态中,可以直接调用特权指令,不过其调用特权指令是通过硬件的虚拟化机制将特权指令调用转到处在根模式下的VMM中,由VMM完成对硬件的同一管理

CPU厂商支持虚拟化的力度在不断加大,靠着硬件辅助的虚拟化技术性能逐渐逼近半虚拟化,再加上该虚拟化不需要修改客户端操作系统的优势,该虚拟方式是未来的发展趋势(目前很多的服务器/CPU 上面都可以开启硬件辅助虚拟化)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1175129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaSE】基础笔记 - 类和对象(上)

目录 1、面向对象的初步认知 1.1、什么是面向对象 1.2、面向对象与面向过程 2. 类定义和使用 2.1、简单认识类 2.2、类的定义格式 2.3、自定义类举例说明 2.3.1、定义一个狗类 2.3.2、定义一个学生类 3、类的实例化 3.1、什么是实例化 3.2、类和对象的说明 1、面向…

MySQL性能优化的最佳20条经验

概述 关于数据库的性能,这并不只是DBA才需要担心的事。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。下面讲下MySQL性能优化的一些点。 1. 为查询缓存优化你的查询 大多数的MySQL服务器…

Python基础入门例程47-NP47 牛牛的绩点(条件语句)

最近的博文: Python基础入门例程46-NP46 菜品的价格(条件语句)-CSDN博客 Python基础入门例程45-NP45 禁止重复注册(条件语句)-CSDN博客 Python基础入门例程44-NP44 判断列表是否为空(条件语句&#xff0…

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

一、Attachment 介绍 Attachment 插件是 Elasticsearch 中的一种插件,允许将各种二进制文件(如PDF、Word文档等)以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件&a…

redis数据库缓存服务器(基础命令)

redis比mysql访问数据快 非关系型数据库以键值对的方式存储数据 作用:加快访问速度,缓解数据库压力 redis最新版本7 特点 丰富的数据结构 list,set,hash等数据结构的存储 支持持久化 支持事务 “一个完整的动作,要么全部执行&#xff0…

数据结构:AVL树讲解(C++)

AVL树 1.AVL树的概念2.平衡因子3.节点的定义4.插入操作5.旋转操作(重点)5.1左单旋5.2右单旋5.3左右双旋5.4右左双旋 6.一些简单的测试接口7.完整代码 1.AVL树的概念 普通二叉搜索树:二叉搜索树 二叉搜索树虽可以缩短查找的效率,但…

D-Link监控账号密码信息泄露

访问漏洞的 url 为 /config/getuser?index0其中泄露了账号密码 使用泄露的账号密码登陆系统 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的…

CCF-CSP真题《202309-3 梯度求解》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202309-3试题名称:梯度求解时间限制:1.0s内存限制:512.0MB问题描述: 背景 西西艾弗岛运营公司近期在大力推广智能化市政管理系…

文本生成评估指标简单介绍BLEU+ROUGE+Perplexity+Meteor 代码实现

以下指标主要针对两种:机器翻译和文本生成(文章生成),这里的文本生成并非是总结摘要那类文本生成,仅仅是针对生成句子/词的评价。 首先介绍BLEU,ROUGE, 以及BLEU的改进版本METEOR;后半部分介绍P…

volatile-禁重排案例详解

在每一个volatile写操作前面插入一个StoreStore屏障--->StoreStore屏障可以保证在volatile写之前,其前面所有的普通写操作都已经刷新到主内存中。 在每一个volatile写操作后面插入一个StoreLoad屏障--->StoreLoad屏障的作用是避免volatile写与后面可能有的vo…

【Qt之QtXlsx模块】安装及使用

1. 安装Perl,编译QtXlsx源码用 可以通过命令行进行查看是否已安装Perl。 下载及安装传送门:链接: https://blog.csdn.net/MrHHHHHH/article/details/134233707?spm1001.2014.3001.5502 1.1 未安装 命令:perl --version 显示以上是未安装…

测试面试题集-UI自动化测试

1、列举web自动化中常见的元素定位方式? id:根据id来获取元素,返回单个元素,id值一般是唯一的;name:根据元素的name属性定位;tagName:根据元素的标签名定位;className&a…

基于国产仪器的某海上平台SPM振动监测系统

摘要:使用分布式采集仪和云智慧监测系统,实现海上浮式储油轮的单点SPM(水上水下有轴承的钢结构)振动监测,经受住了湿度高、气温变化大等多变的气候环境的考验。 关键词:石油平台,振动监测,环境 某海上浮式…

【vue2高德地图api】04-poi搜索

系列文章目录 文章目录 系列文章目录前言一、高德地图文档入口二、使用步骤1.创建文件以及路由2.编写页面代码3.样式4变量以及方法5.编写查询方法 总结 前言 提示:这里可以添加本文要记录的大概内容: 本篇要实现的功能,看下图 提示&#x…

FinalCutPro 移动项目的时候,遇到失去连接的文件怎么处理

FinalCutPro 移动项目的时候,遇到失去连接的文件怎么处理 有时候,FinalCutPro 项目在移动之后,一些链接到外面的文件会失去连接,文件虽然还在原有位置,但显示成下面这样: 解决方法 1. 点击菜单【文件】…

Java VMTranslator Part II

用Java写一个翻译器,将Java的字节码翻译成汇编语言 目录 程序控制流开发 基本思路 核心代码 实验结果,使用例子进行验证 函数调用 基本思路 核心代码 实验结果,使用例子进行验证 Parser CodeWriter Main 程序控制流开发 基本思路…

Activiti监听器

文章目录 学习链接任务监听器 TaskListener监听器监听的事件监听器委托类DelegateTask任务监听实现方式 — 类class绘制流程图自定义任务监听器SiteReportUserTaskListener 测试 监听实现方式 — 表达式expression绘制流程图自定义 TaskListenerExpression测试spring表达式 执行…

【MySQL事务篇】MySQL锁机制

MySQL锁机制 文章目录 MySQL锁机制1. 概述2. MySQL并发事务访问相同记录2.1 读-读情况2.2 写-写情况2.3 读-写或写-读情况2.4 并发问题的解决方案 3. 锁的不同角度分类3.1 从数据操作的类型划分:读锁、写锁1. 锁定读2. 写操作 3.2 从数据操作的粒度划分:…

前端框架Vue学习 ——(五)前端工程化Vue-cli脚手架

文章目录 Vue-cliVue项目-创建Vue项目-目录结构Vue项目-启动Vue项目-配置端口Vue项目开发流程 Vue-cli 介绍:Vue-cli 是 Vue 官方提供的一个脚手架,用于快速生成一个 Vue 的项目模版 安装 NodeJS安装 Vue-cli npm install -g vue/cliVue项目-创建 图…