虚拟存储器

为了有效管理存储器并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟存储器。它为每个进程提供一个大的,一致的和私有的地址空间。

1 物理和虚拟寻址

[1] 物理寻址

 cpu执行这条指令时,他会生成一个有效物理地址,通过存储总线,把它传递给主存。主存从物理地址4处开始的4字节的字,并将它返回给CPU,CPU会将它存放在一个寄存器里。

[2] 虚拟寻址

CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址(地址翻译)。CPU芯片上叫做MMU的专用硬件,动态翻译虚拟地址。

2 地址空间

地址空间是一个非负整数地址的有序集合:

 地址空间的有效区分了数据对象(字节)和它们的属性(地址)。每个对象有多个独立的地址,其中每个地址都选自不同的地址空间。这就是虚拟存储器的基本思想。主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

3  为什么要使用虚拟存储器

3 .1 虚拟存储器作为缓存工具

磁盘上的数据被分割成块,这些块作为磁盘和主存之间的传输单元。VM系统通过将虚拟存储器分割为虚拟页的大小固定的块来处理这个问题,每个虚拟页大小为P字节。物理存储器被分割为物理页,大小也为P字节,页帧。

 未分配的:VM系统还未分配的页。未分配不占用任何磁盘空间。

 缓存的:当前缓存在物理存储器中的页。

 未缓存的:没有缓存在物理存储器中的已分配的页。 

  • DRAM缓存的组织结构

DRAM缓存表示虚拟存储器的缓存,在主存中缓存虚拟页。DRAM比磁盘快大约100000倍,DRAM的缓存不命中开销非常大。所以DRAM的组织结构完全是由巨大的缓存不命中开销所导致的。由于大的不命中处罚以及和访问第一字节的开销, 虚拟页往往很大,一般是4KB~2MB。DRAM是全相连的,任何虚拟页可以放在任何的物理页中。不命中时的替换策略也很重要,因为替换虚拟页的惩罚很高,相比于SRAM,操作系统给DRAM提供了更复杂和精密的替换算法。因为对磁盘的访问时间比较长,DRAM采用的都是写回的方式,而不是直写的方式。

  • 页表

如何确定访问的虚拟页是否缓存在DRAM中,如果缓存了是存放在DRAM中的哪个位置,如果没有缓存应该访问那块物理页。这些需要操作系统,MMU以及页面相互配合才能实现。页表实际上是一个页表项目,缓存了虚拟地址到物理地址的映射,MMU每次做地址翻译的时候都会访问页表。

每个虚拟地址中的一个虚拟页就会在页表中占据一个表项,如果有效位是1,表示虚拟地址已经缓存在了DRAM中的,后面地址项就是DRAM中的物理地址。如果有效位是0,表示虚拟地址未缓存在DRAM中,后面的物理地址就是磁盘上的位置。如果地址是NULL,表示虚拟页还未分配。

  • 页命中

  •  缺页

 DRAM缓存不命中称为缺页,会触发一个缺页异常。缺页异常会调用缺页异常处理程序,会把页从磁盘中换入DRAM中。异常处理程序会返回,重新启动导致缺页的指令。磁盘和存储页之间的活动叫做叫做页面调度,当缺页发生时才会换入页面,这种策略叫做按需页面调度。

  • 分配页

 页未命中会导致开销比较大,但是程序的局部性使得程序的在某一时刻的访问集中在一个较小的活动页面上(工作集)。如果工作集超过了物理存储器的大小,就会产生颠簸,页面就会不停的换进和换出,性能就会很慢。

3.2 虚拟存储器作为存储器管理的工具

虚拟地址是一个有用的机制,大大简化了存储器的管理,并提供一种自然的保护存储器的方法。

 操作系统为每一个进程提供了一个独立的页表,因而是一个独立的虚拟地址空间。同时多个虚拟页面可以映射到同一个·共享物理页面上。按需页面调度和独立的虚拟地址空间的结合,简化了链接和加载,代码和数据共享,以及应用程序的存储器的分配。

简化链接。独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的具体位置。例如Linux系统上每个进程,文本节总是从虚拟地址0x08048000处开始,或者0x40000处开始。数据和bss节紧跟在文本节后面。栈占据地址空间最高的部分,并向下生长。这样的一致性极大的简化了连接器的设计与实现。

简化加载。虚拟存储器还是得容易向存储器中加载可执行文件和共享对象文件。加载器一开始从不实际拷贝任何数据从磁盘到存储器,在每次页初次被引用时,要么是CPU取指令时引用的等。此时虚拟存储器系统会按照需要自动地调入数据页。

简化共享。独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。一般每个进程都会调用相同的操作系统内核代码,每个C程序都会调用C标准中的程序,如printf。操作系统将不同进程中适当的虚拟页映射到相同的物理页面,从而多个进程共享这部分代码,而不需要在每个进程中都包括内核代码和C标准库的拷贝。

简化存储器的分配。虚拟存储器为向用户进程提供一个简单的分配额外存储器的机制,当一个运行在用户进程中需要额外的堆空间时,操作系统分配一个适当数字(例如k)个连续的虚拟地址页面,并且将他们映射到物理存储器中任意位置K个任意物理页面。由于页表工作方式的方式,操作系统没有必要分配k个连续的物理存储器页面。页面可以分散在物理存储器中。

3.3 虚拟存储器作为存储器保护的工具

提供独立的地址空间使得分离不同进程私有存储器变得容易。同时地址翻译机制可以以一种自然地方式扩展提供更好的访问控制。每次CPU生成一个地址时,地址翻译硬件会读一个PTE,PTE会添加一些额外的控制许可位对来控制对一个虚拟页面内容的访问。

 

动态存储器分配器维护这一个进程的虚拟存储器区域,堆。

分配器将堆视为一组不同大小的块的集合来维护。每个块都是一个连续的虚拟存储器片,要么是分配的,要么是空闲的。

分配器有两种类型。(1)显示分配器,内存的分配和释放需要显示调用函数进行(C中的malloc和free 以及C++中的new和delete) (2)隐示分配器,用户不需要显示调用释放内存函数 (垃圾收集器)。

为什么使用动态存储器分配器。程序使用动态存储器分配器的最重要的原因是经常知道程序实际运行时,它们才知道某些数据结构的大小。

分配器的评价指标。

(1) 最大化吞吐率。吞吐率定义为每个单位时间里完成的请求数。例如如果一个分配器在1秒钟内完成500个分配请求和500个释放请求,那么它的吞吐率就是每秒1000慈操作。

(2) 最大化存储器利用率。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值