软件虚拟化 vs 硬件虚拟化

本篇文章从这张图片开始

大家应该都听过毛不易的《消愁吧》,里面有句歌词是:一杯敬朝阳,一杯敬月光...我觉得人真的要敬畏未知,不然容易闹出笑话来,比如这位网友...此时我又想起了韩寒的一句话:人还是要多读书,才能不丢人

CPU虚拟化,是一种硬件虚拟化技术,是由CPU提供的!你们经常用的docker、k8s,是一种软件虚拟化技术,是由Linux内核提供的。本篇文章,跟大家展开说说硬件虚拟化vs软件虚拟化

不论是软件虚拟化技术,还是硬件虚拟化技术,它们诞生的最直接原因都是给创建虚拟机提供基础设施。早期,是没有硬件虚拟化技术的,只有软件虚拟化技术。你们用过VMware吗,早期,它也是基于软件虚拟化技术实现的,今天的VMware,纯纯的基于硬件虚拟化技术实现

Linux平台下的qemu,你可以选择让它基于软件虚拟化技术运行,或者硬件虚拟化技术运行,开关就是个参数:-enable-kvm

如果qemu不加参数-enable-kvm,它是如何运行的呢?它自己需要模拟解析CPU指令,比如CPU的mov指令

这里只是举个例子,qemu内部实际使用的是性能更高的解决方案:TCG,这个技术有点类似Java虚拟机JVM的模板解释器或即时编译JIT,上面的伪代码类似JVM的字节码解释器

TCG的工作流程是这样的

是不是看到这,你还是不知道TCG的性能为什么比上面伪代码的效率高?举个例子(拿这句话去问AI就能得到答案)

CPU虚拟化技术,是一种硬件虚拟化技术,又名vt。qemu加参数-enable-kvm就是基于硬件虚拟化技术运行,kvm又是什么呢?kvm与vt是什么关系呢?docker与它们又有什么区别呢?

废话不多说,直接上图

kvm,是Linux内核的一个驱动模块,是在Linux系统中写虚拟机的基础设施,它是基于vt实现的。你可以这样理解:虚拟机是精装修房,kvm是简装修房,vt是毛坯房

举个代码例子,你可能更容易理解,比如你基于vt写虚拟机,代码类似于

如果基于kvm写呢,两句话搞定

不是说基于kvm写虚拟机不需要做vt写虚拟机做的那些,而是那些事,是写虚拟机都要做的,kvm做了,所以你基于kvm写虚拟机,更省事!

CPU虚拟化是什么,vt是什么,kvm是什么,kvm与vt的关系,这四个问题已经讲清楚了!接下来说docker

严格意义上来说,docker不算一种软件虚拟化技术,它更像操作系统虚拟化技术。如何判断是不是虚拟化技术呢?就看它是不是在模拟硬件!很显然,docker不是!但是docker给人的感觉,又是虚拟机

docker虽然给人的感觉是虚拟机,但是它运行的不是一个完整的操作系统,它运行的更像是一个个应用

你可能想说:docker也可以运行Ubuntu镜像呀!是的,没错,但是这个Ubuntu镜像是没有Linux内核的,只是Ubuntu的用户态!其实在docker的眼里,Ubuntu的用户态也只是一个应用而已!

docker是如何实现的呢?基于Linux内核提供的namespace+cgroups+overlayfs实现的。细节不展开了,如果你想深入学习,我之前做过课程《手写docker》

而真正的虚拟机,运行的都是完整的操作系统,包含操作系统内核、操作系统用户态、应用...甚至可以在虚拟机中打游戏!

至此,软件虚拟化的全部,与硬件虚拟化的全部,就分享完了!如果你收获满满,我感受到你的欣赏,你的谢意,能不能帮我点下在看、转发,万分感谢!

如果你对上面的内容感兴趣,想看我之前的文章及我的奋斗历程。白手起家程序员的职场心得,欢迎看我【个人简介】详细了解。

相关推荐
音草2 分钟前
Linux 基础指令入门:常用命令、Shell 原理与权限管理
linux
aosky5 分钟前
Linux 写内容到文件的几种方式
java·linux·服务器
云老大-阿里云国际站代理商17 分钟前
腾讯云国际站渠道代理商:新加坡CVM怎么搭配TencentDB?企业部署、内网连接和高可用怎么规划
云计算·腾讯云
吴声子夜歌1 小时前
Shell编程——函数
linux·运维·shell
码少女2 小时前
Linux——多路复用之poll模型
linux·服务器·网络
PatrickYao04222 小时前
Linux安装UV
linux·运维·uv
顶点多余2 小时前
面试题总结 ---Linux篇
linux·运维·服务器
T1mzhou3 小时前
ARM64 Linux 6.10 内核驱动(14):drivers/base/platform.c:板级设备主战场
linux·c语言·开发语言·arm开发
微露清风3 小时前
Linux 虚拟地址空间:一道屏障、一张地图、一场延迟兑现的博弈
linux·服务器
zx_741484813 小时前
【Linux入门】Shell 与第一个 Shell 脚本:认识命令行解释器,写出 Hello World
linux·运维