登 录
注 册
< 云 计 算
虚拟化
云原生
云服务
Docker安装
Docker容器管理
Docker网络管理
内存虚拟化概述
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
虚拟化
>>
内存虚拟化概述
内存虚拟化概述
2023-09-17 17:27:53 星期日 发表于北京 阅读:723
![](/static/images/article_images/1695483207.7096767.jpeg) 云时代的到来为计算机内存管理提出了新的挑战: `需要为客户机提供从0开始的、连续的、相互隔离的虚拟“物理内存”`,并且使内存访问延迟低,接近宿主机环境下的内存访问延迟。 **内存虚拟化**即给访存指令提供一个内存空间,或称为地址空间。地址空间必须是从0开始且连续的,可以形象地看作一个大数组,通过从0开始的编号访问其中的元素,每个元素储存了固定大小的数据 具体虚拟地址空间的类型有如下 #### 单机上的物理地址空间 对于一条访存指令,若系统中没有开启分页模式,在不考虑开启分段模式的情况下,这条指令可以访问全部的物理内存 指令访问的物理地址是从0开始且连续的。在计算机启动时,BIOS探测到主板内存插槽上的所有内存条,并给每个内存条赋予一个物理地址范围,最后给CPU提供一个从0开始的物理地址空间。从而每个内存条都被映射到一个物理地址范围内,软件无须知道自己访问的是哪个内存条上的数据 物理地址隐藏了内存条的相关信息,**给系统提供了从0开始且连续的物理地址空间抽象**,是一种虚拟化 ![](/static/images/article_images/1695481327.4713745.jpeg) *图片来自《深入浅出系统虚拟化:原理与实践》* 但如果只有一层物理地址空间,则系统中只能运行一个进程,无法对CPU分时复用 #### 单/多机上的虚拟地址空间 为了实现CPU的分时复用,操作系统提供了进程的概念 `一个进程即是一串相互关联、完成同一个任务的指令序列` 为了使不同进程的访存指令在访问物理内存时不会相互冲突,虚拟地址的概念被引入。每个进程都有一个独立的虚拟地址空间,从0开始且连续,VA到PA的映射由操作系统决定 这样,假设操作系统为 进程A分配了第0块和第2块的物理内存; 进程B分配了第1块和第3块的物理内存; 而两个进程的虚拟地址空间大小均为4。两个进程都可以使用虚拟地址0访问它们拥有的第0块虚拟内存,而不会引起访问冲突,如上图b #### 单机上的“虚拟”物理地址空间 如果保持物理地址空间的概念不变,继续更改物理地址空间,那就可以用虚拟内存代替物理内存条作为物理地址实现的后台。而物理内存可以提供给一整台机器使用,于是产生了`内存虚拟化`的概念 假设: 进程A运行在物理硬件上,它提供4块虚拟的物理内存给客户机A使用,分别对应其0、1、2、3块虚拟内存。 客户机A在此“虚拟”物理内存的基础上,继续提供虚拟内存的抽象,将第0、1块物理内存分别给客户机中运行的进程A1、B1使用,分别映射到进程A1的第0块虚拟内存、进程B1的第1块虚拟内存。 由于“虚拟”物理内存的抽象没有改变,客户机将不会感知到它所依赖运行的硬件发生变化 ![](/static/images/article_images/1695481478.3516643.jpeg) *图片来自《深入浅出系统虚拟化:原理与实践》* #### 多机上的“虚拟”物理地址空间 大数据环境下的应用都会占用大量的物理内存。单个机器渐渐无法满足大数据处理任务运行过程中所需要的内存空间。 于是,人们将关注点从**高配置的单机纵向扩展转向了数量较大的单机横向扩展**。 为了使大数据应用运行在多个机器上,而掩盖掉网络通信、容错等分布式环境下需要额外注意的复杂度,大数据框架被应运而生,如Spark、Hadoop等 **如果存在一个单一系统镜像,即在多个节点组成的分布式集群上给程序员提供一种单机的编程模型,则会极大地提高分布式应用的开发效率,彻底掩盖分布式系统的复杂性** 这其实就是DSM(`分布式共享内存`)的思想,用于实现“虚拟”物理内存,将获得一个容量巨大的“虚拟”物理内存。DSM在多个物理节点之上建立了一个“虚拟”物理内存的抽象层 这也被称为**“多虚一”,即多个节点共同虚拟化出一个虚拟机**。DSM保持了“虚拟”物理内存的抽象层不变,任何一个操作系统均可运行在这样的抽象之上,和运行在真实物理硬件上没有差别 ![](/static/images/article_images/1695481612.3641052.jpeg)