内存的工作原理

内存在物理上是由内存卡提供的,也就是我们俗称的内存条,内存条提供了物理内存。

在物理内存之上还有虚拟内存,虚拟内存操作系统给程序分配的一段连续的内存,属于逻辑上的概念。

虚拟内存和物理内存之间会有一个映射关系,这个映射关系我们称之为页表,通过页表,软件可以把数据真实的写到物理内存里

比如在电脑上打开一个程序,比如打开微信,这时操作系统会给微信分配一段连续的虚拟内存空间,但是这个虚拟内存空间它仅仅是一个逻辑上的概念,当这个程序需要往物理内存里写东西的时候,它首先找到虚拟内存,通过虚拟内存和物理内存之间映射关系的页表,软件就可以把数据真实的写到物理内存里。对于软件来说,它本身能看到的只是分配给它的这个虚拟内存空间,它是看不到底层的物理内存的,

总结一下:

· 物理内存:内存条,内存数据真实存放的物理设备。

· 虚拟内存:操作系统给应用程序分配的一段连续的虚拟内存空间,并没有真实的实体存在。

· 页表:记录了物理内存和虚拟内存之间的映射关系

内存虚拟化架构

当在物理机上起了一台虚拟机之后,虚拟机要将数据写入到物理内存需要经历三次映射。如下图,所以为什么虚拟相比物理机性能是有下降的,仅内存读写的操作,原先只需要经过一次映射,而虚拟机则需要经过三次映射

· 宿主机物理内存地址:物理机上内存条的物理内存地址

· 宿主机虚拟地址:Host OS给运行在物理机上的应用分配的虚拟内存地址,Hypervisor本质上也是操作系统上的一个应用。

· 客户机物理地址:虚机的物理内存地址,因为虚拟机作为一台完整的设备也是有物理内存地址的,只不过虚机的物理内存是由Hypervisor使用宿主机给Hypervisor分配的虚拟内存地址模拟出来的。

· 客户机虚拟地址:虚机的操作系统GuestOS给运行在 虚机上的应用分配的虚拟内存地址。

第一次映射:客户机系统页表--虚拟机的虚拟内存地址到虚拟机的物理内存地址(Hypervisor模拟)

第二次映射:内存槽--虚拟机的物理内存地址(Hypervisor模拟)到物理机的虚拟内存地址

第三次映射:宿主机系统页表--物理机的虚拟地址到宿主机物理地址

MMU虚拟化

传统MMU(内存管理单元)负责虚拟地址映射为物理地址,主要包含两种技术

· Software technique:shadow page tables(影子页表)

· Hardware technique:Inter EPT and AMD RVI

shadow page tables(影子页表)

· 影子页表是VMM(Hypervisor)在宿主机内核中为虚拟机进程维护了一个虚拟机的虚拟地址到宿主机物理地址的页表,这个页表和虚拟机内核的页表同步更新。

虚拟机上的应用想要调度底层物理硬件的物理地址需要经理三次映射:

· 虚拟机的虚拟内存地址到虚拟机的物理内存地址

· 虚拟机的物理内存地址到物理机的虚拟内存地址

· 物理机的虚拟内存地址到物理机的物理内存地址

每次虚拟机应用要在内存中读写数据,都需要经历三次映射,这样工作量太大,这时技术人员就想出一个办法,在这三张页表都建立完成后,再创建一张新的页表:影子页表,影子页表记录了虚拟机的虚拟内存地址到物理机的物理内存地址之间的映射。这样虚拟机读写内存时不需要经过三次查找,而是直接读第四张影子页表,就可以直接从虚拟机的虚拟内存地址直接到物理内存地址,极大提升了虚拟机应用的内存读写效率

影子页表适合于一次写入、频繁读取的场景。

随着互联网技术的发展,影子页表在一些特定的场景下页出现了一些其他的问题。举个例子:

比如说网络游戏,在网络游戏中多人在线上同时玩,网络游戏公司为了防止大家作弊,比如说英雄的金钱、血量等,这些其实都已一个一个的数据存在内存中的,对于一些黑客来说,他就可以找到那个内存然后更改这个内存中的数据,这样的话就会影响游戏的公平性。

所以游戏公司开发了一个动态内存技术,将游戏中的一些关键数据动态的存储在内存中,它可能每秒就变一次,第一秒在第一个内存空间里,第二秒系统就自动的把它随机挪到另一个物理内存空间里。

对于这种场景,影子页表就会产生一个巨大的问题,因为影子页表是三张页表建立完成后,影子页表直接将虚拟机的虚拟内存地址映射到物理机的物理内存地址,而动态内存的场景下,因为数据在内存中是动态存放的,所以,内存中的数据每更新一次存放位置,三张页表也需要更新映射关系,因为有影子页表的存在,还要等三张页表更新完成后再更新第四张影子页表。

所以在这种动态内存场景中,如果用之前的笨方法,映射三次,那它的处理时间就是延长三倍,如果用影子页表,它还要创建第四张页表,在这种场景下,它不仅没有提升性能,反而增加了负担。所以影子页表适合于一次写入、频繁读取的场景。

所以这个技术随着IT技术的发展,在一些特定的场合下是没有使用空间的

Inter EPT and AMD RVI

· 基于硬件的内存虚拟化技术,也叫硬件辅助内存虚拟化,英特尔的叫Inter EPT,AMD的叫 AMD RVI,主要实现了虚拟机虚拟地址到宿主机物理地址“一步到位”的自动映射

Inter EPT and AMD RVI在CPU里新增了一个硬件:TLB(Translation look-aside buffer,转换查找缓冲器)

原先虚拟机上的应用需要调度物理内存需要经历三次映射,这三次映射它的运算都是要靠CPU和内存完成的,这三次映射都会占用一部分CPU和内存资源,从而造成了虚机性能下降。

现在硬件辅助内存虚拟化增加了一个专门的硬件TLB,这个硬件的功能就是完成那三次映射运算的,这样那三次映射的运算就不用再占用CPU和内存资源,这个专用的硬件是针对映射算法进行了专门的优化的,它的转换速度是非常快的。这个技术就对于提升虚拟机内存虚拟化后的性能有一个显著的帮助

这个技术也是需要在BIOS里开启,有些服务器开了CPU虚拟化会同步把内存虚拟化也开启,有些需要单独打开

Inter EPT and AMD RVI在CPU里新增了一个硬件:TLB(Translation look-aside buffer,转换查找缓冲器)

原先虚拟机上的应用需要调度物理内存需要经历三次映射,这三次映射它的运算都是要靠CPU和内存完成的,这三次映射都会占用一部分CPU和内存资源,从而造成了虚机性能下降。

现在硬件辅助内存虚拟化增加了一个专门的硬件TLB,这个硬件的功能就是完成那三次映射运算的,这样那三次映射的运算就不用再占用CPU和内存资源,这个专用的硬件是针对映射算法进行了专门的优化的,它的转换速度是非常快的。这个技术就对于提升虚拟机内存虚拟化后的性能有一个显著的帮助

这个技术也是需要在BIOS里开启,有些服务器开了CPU虚拟化会同步把内存虚拟化也开启,有些需要单独打开

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐