首页 > 编程知识 正文

虚拟内存是什么意思,虚拟内存自定义大小多少合适

时间:2023-05-06 10:34:21 阅读:213783 作者:1455

1、概述

为了更加有效的管理内存并且减少出错的可能,现代系统提供了一种对主存的抽象概念,叫做虚拟内存。虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每一个进程提供了一个大的、一致的和私有的地址空间

虚拟内存提供了三个重要的能力:
1、它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。

2、它为每个进程提供了一致的地址空间,从而简化了内存管理。

3、保护了每个进程的地址空间不被其它进程破坏。

下面让我们来进行详细的说明

2、物理和虚拟寻址

计算机系统的主存被组织成一个由 M 个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址(Physical Address,PA)。第一个字节的地址为0,接下来的字节地址为1,以此类推。

CPU 访问内存的最自然的方式就是使用物理地址,这种方式称为 物理寻址。如下图所示:

上图展示了一个物理寻址的示例,该示例的上下文是一条加载指令,它读取从物理地址4处开始的4字节字。当CPU执行这条加载指令时,会生成一个有效物理地址,通过内存总线,把它传递给主存。主存取出从物理地址 4 处开始的4个字节,并将它返回给 CPU, CPU会将它存放在一个寄存器里。

早期的PC使用物理寻址,而且数字信号处理器以及超级计算机这样的系统仍然继续使用这种寻址方式。然而,现代处理器使用的是一种称为虚拟寻址的形式,如下图:

使用虚拟寻址,CPU 通过生成一个虚拟地址(Virtual Address,VA)来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址。将一个虚拟地址转换成物理地址的任务叫做 地址翻译(address translation)。

就像异常处理一样,地址翻译需要 CPU 硬件和操作系统之间的紧密合作。 CPU 芯片上叫做内存管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。

3、地址空间

地址空间是一个非负整数地址的有序集合:{0,1,2,3,4,5,6,…}。如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间。为了简化讨论,我们总是假设使用的是线性地址空间。

在一个带虚拟内存的系统中,CPU从一个有 N=2n 个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间

一个地址空间的大小是由表示最大地址所需要的位数来描述的。例如,一个包含 N=2n 个地址的虚拟地址空间就叫做一个 n 位地址空间。现代系统通常支持32位或者64位虚拟地址空间。

一个系统还有一个物理地址空间,对应于系统中物理内存的 M 个字节: {0,1,2,3,…}。M不要求是2的幂,但是为了简化讨论,我们假设 M = 2m。

地址空间的概念是非常重要的,因为它清楚的区分了数据对象(字节)和他们的属性(地址)。虚拟内存的基本思想就是:允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间(不懂继续往下看)

主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

4、虚拟内存作为缓存工具

虚拟内存被组织为一个由 存放在磁盘 上的N个连续的字节大小的单元组成的数组。每个自己都有一个唯一的虚拟地址,数组的内容被缓存在主存中。

VM系统将虚拟内存分割为大小固定的块,称为 虚拟页(virtual page,VP)。虚拟页的大小为 P = 2p。
物理内存也被分割为大小为P的块,称为物理页

在任意时刻,虚拟页面的集合都被分为三个不相交的子集:

未分配的:VM系统还未分配的页。未分配的块没有任何数据和它们相关联,不占用任何磁盘空间缓存的:当前已缓存在物理内存中的已分配页。未缓存的:未缓存在物理内存中的已分配页。

下图展示了一个有8个虚拟页的小虚拟内存。

虚拟页0 和 3 还没有被分配,磁盘上还不存在。
虚拟页1、4 和 6 被缓存在物理内存中。
虚拟页 2、5 和 7 已经被分配了,但是当前并未缓存在主存中。

操作系统向进程描述了一个完整的连续的虚拟地址空间供进程使用,但是在物理内存中进程数据的存储采用离散式存储(提高内存利用率),但是其实虚拟内存和物理内存之间并不想像上图中那样直接,其中还需要使用页表映射虚拟地址与物理地址的映射关系,并通过页表来实现内存访问控制。

5、页表

页表是一种特殊的数据结构,存放着各个虚拟页的状态,是否映射、是否缓存

页表 是一个页表条目的数组。虚拟地址空间中的每个页在页表中一个固定偏移量处有一个PTE。在这里我们假设每个PTE 是由一个有效位 和 一个n位地址字段组成的。有效位表明了该虚拟页当前是否被缓存在主存中。

有效位为 1,则主存缓存了该虚拟页。地址字段就表示主存中相应的物理页的起始位置。有效位为 0,则地址字段的null表示这个虚拟页还未被分配,否则该地址就指向该虚拟页在磁盘上的起始位置。 5.1、页命中

当CPU想要读取包含在某个虚拟页的内容时,如果该页已经缓存在主存中,也就是页命中。(有效位为1)

5.2、缺页

在虚拟内存的习惯说法中,DRAM缓存不命中称为缺页(有效位为0)

缺页后会触发一个缺页异常。缺页异常会调用系统的缺页异常处理程序,该程序会把需要的数据也缓存到主存中。

缺页程序返回后,会重新发送导致缺页异常的指令,但是现在已经缓存,就不会报错了。

5.3、关于术语

因为历史的原因,虚拟内存系统使用了和SRAM缓存不同的术语,即使它们有很多概念是相似的。

块 被称为 页。在磁盘和内存之间传送页叫 交换 或者 页面调度

6、总结

虚拟存储器的工作原理是有一些复杂,即使上文中描述的也并不全是最真实的计算机中的工作方式,比如PTE由一个有效位和一个地址字段组成其实是为了便于理解而假设出来的。

但是这种方式成功的解决了上文中提到的直接使用物理内存会出现的问题,比如物理内存中离散式存储,虚拟内存中连续存储解决了物理内存碎片化资源利用率过低的问题;每个进程只能访问自己独立的用户空间而内核空间是共用的解决了进程间的安全问题;缺页异常和选择牺牲页的算法提高了内存读写的效率。

感谢大家,我是假装很努力的YoungYangD(小羊)

参考资料:
《深入理解计算机系统》
https://zhuanlan.zhihu.com/p/96098896
https://www.jianshu.com/p/415618863d52
https://www.cnblogs.com/yaoxiaowen/p/7805964.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。