刚刚数据库下课讲了很多有关虚拟内存的东西感觉很多都忘了,现在写这篇文章来复习一下
为什么要引入虚拟内存
在计算机系统中,多个进程共享CPU和内存,
- 如果太多的进程需要过多的内存空间,那么其中一部分进程就会无法或得足够得空间而无法运行
- 此外如果一个进程的数据不小心把写入到另一个进程的内存空间中,那么接下俩会发生令人困惑的错误。
为了有效的管理内存现代计算机系统提供了一条对内存的抽象概念---虚拟内存,它可以自动的完成内存管理工作不需要应用程序员来干预。
虚拟内存在计算机系统中扮演了很重要的角色,在链接器、汇编器,加载器和文件以及进程的设计中都扮演了重要的角色。理解虚拟内存有助于理解计算机是如何工作的。
虚拟内为应用程序提供了强大的能力,例如创建和释放内存空间,将内存空间释放到磁盘的某个部分,以及其他空间共享进程,因此我们编写应用程序时会利用虚拟内存的特性。
当我们编写应用程序时,每次引用一个变量、间接引用一个指针,或者调用一个malloc函数都会和虚拟内存发生交互,如果虚拟内存使用不当,会发生非常复杂的错误理解虚拟内存可以让我们避免这些错误。
虚拟内存是如何工作的
物理寻址
一个简单的方式是内存中的元素以数组的方式进行存储 ,CPU在读取这条指令的时候会生成一个有效的物理地址,这个物理地址通过内存总线传递给内存控制器,然后内存响应这种读的请求,从物理地址2的地方取出四个字节的内容返还给CPU
虚拟寻址
这种寻址方式下,CPU是通过一个虚拟地址来访问内存的,这个虚拟地址在被送入到内存之前需要转换成相应的物理地址
- 将一个虚拟地址转换成一个物理地址的任务叫做地址翻译
- CPU有专门的工作部件来做地址转换,这个专用的部件就是内存管理单元MMU
虚拟地址
虚拟内存用作缓存
虚拟内存可以看成磁盘上N个连续的字节构成的数组,由于每一字节都有唯一的虚拟地址,这个虚拟地址就是数组的索引值,图中展示了一条小型的虚拟存储系统,其中虚拟地址的范围是0~N-1,
对于磁盘上数组的内容被暂存到缓存里,磁盘上的数据被切割成块,这些块作为磁盘和内存之间的传输单元,我们把这些块称为虚拟页,简称VP,每个虚拟页的大小为P个字节,P的值通常是4KB~2MB之间
物理页和虚拟页的大小是一样的,也是P个字节,在有些书中也把物理页称为页帧,未分配表示虚拟内存系统还没有创建的页,未分配的页没有任何数据和他相关联,所以他不占用任何的磁盘空间,图中的虚拟内存被分为八个虚拟页,03是未分配的因此在磁盘上还不存在
第二类表示已经缓存的表示已经缓存在物理内存页中,例如图中的虚拟内存页1 4 6
第三类是未缓存的,例如图中虚拟页2 5 7 已经被分配了,但是当前并未缓存在内存中。
SRAM缓存表示L1 L2L3之间的缓存,DRAM表示虚拟内存系统的缓存,也就内存缓存的虚拟页
DRAM大约比SRAM慢10倍,磁盘大约比DRAM慢十万倍,因此DRAM缓存不命中比SRAM缓存不命中比DRAM的影响更大,DRAM缓存补命中时,需要从磁盘读数据到内存,因此耽误的时间比较长,所以DRAM采用全相联的连接方式,也就是说任何一页的虚拟页都可以放到任意内存页中。
同时,不命中的时候的替换策略也很重要,如果替换错了,那么也会耽误很长的时间DRAM的替换算法比cache替换更为复杂,本文章不做过多介绍。
最后由于磁盘的访问时间很长,所以DRAM采用的是写回的策略而不是写穿透