虚拟存储器

虚拟存储器

引入

一个系统中的进程是与其他进程共享CPU和主存资源的。但是如果有很多进程都需要访问主存,那就很危险了,如果一个进程将自己的数据写进别的进程的逻辑中去了,那么两个进程都挂掉了,你自己出错了,别拉上别的进程垫背啊。当存储器没有空间了,却有进程要访问内存,那只能等待了,谁又能记录有进程等待的信息呢,万一内存有空间了,这个进程还没有动手,就被别的进程捷足先登了,那这个进程永远也不会被启动了。
所以为了更加有效地管理存储器并且少出错,现代系统提供了对主存的抽象的概念—-虚拟存储器(Virtual Memory),虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核文件的完美交互,它为每一个进程都提供了一个大的、一致的和私有的地址空间。它的机制如下:

①它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
②它为每个进程提供了一致的地址空间,从而简化了存储器管理。
③它保护了每个进程的地址空间不被其他进程破坏。
两种寻址方式
物理寻址

计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址(Physical Address)。第一个字节的地址为0,接下来的字节地址为1,2,3,4…给定这样简单的结构,CPU访问存储器的最自然的方式就是使用物理地址,即物理寻址。物理寻址的过程如下:
当CPU执行从主存加载一条指令时,它会生成一个有效地物理地址,通过存储器总线,把它传递给主存。主存取出物理地址处的4字节的字,并将它返回给CPU,CPU将它放到一个寄存器中。如图所示实例过程:物理寻址的过程图

虚拟寻址

使用虚拟寻址时,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译。就像异常处理一样,地址翻译需要CPU硬件和操作系统之间的紧密合作。CPU存在一个叫做存储器管理单元(Memory Management Unit,MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由操作系统管理的。过程如下图所示:
虚拟寻址

地址空间

地址空间(address space)是一个非负整数地址的有序集合,如果地址空间中的整数是连续的,那么就说它是一个线性地址空间。在一个带虚拟地址空间的系统中,CPU从一个有N=2^n个地址的地址空间中生成虚拟地址,这个地址空间就称为虚拟地址空间;一个地址空间的大小是由表示最大地址所需要的位数来描述的。例如,一个包含N=2^n个地址的虚拟地址空间就叫做一个n位地址空间。比如Windows系统中支持32位或者64位虚拟地址空间。一个系统中还有一个物理地址空间,它与系统中物理存储器的M个字节相对应。主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
虚拟存储器(VM)被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的 索引的。磁盘上数组的内容被缓存在主存中。和存储器层次结构中的其他缓存一样,磁盘上的 数据被分割成块,这些块作为磁盘和主存之间的传输单元。VM胸膛呢通过将虚拟存储器分割为称为虚拟页的大小固定的块来处理这个问题。每个虚拟页的大小为P个字节,类似的,物理存储器被分割为物理页,大小也为P字节(物理也也称为页帧)。
在任意时刻,虚拟页面的集合都分为三个不相交的子集:
**未分配的:**VM系统还未分配或者创建的页。未分配的块没有任何数据和它们相关联,因此也就不占任何磁盘空间。
缓存的:当前缓存在物理存储器中的已分配页。
未缓存的:没有缓存在物理存储器中的已分配页。

页表

和其他缓存一样,虚拟存储器系统必须有某种方法来判定一个虚拟页是否存放在DRAM中的某个地方。如果是,系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理存储器中选择一个牺牲页,并将虚拟页从磁盘拷贝到DRAM中,替换这个牺牲页。
这些功能是由软硬件合作提供的,包括操作系统软件、MMU中的地址翻译硬件和一个存放在物理存储器中叫做页表的数据结构,页表将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时都会读取页表。操作系统负责维护页表的内容,以及在磁盘与DRAM之间来回传送页。

页命中

如图所示,详细介绍一下页命中的过程:
页命中
Q:当CPU要读包含在VP2中的虚拟存储器的一个字时会怎样做?
A:要访问VP2中的内容就需要得到VP2在页表中缓存的位置,这里通过地址翻译的技术得到这个虚拟地址,通过访问DRAM中的页表发现VP2的这一页的有效位是1,代表已经缓存在物理主存中了,然后将这里的虚拟地址转换为物理地址就能访问VP2中的内容了。这里发生的就是页命中,如果在页表中不能找到VP2的虚拟地址,那就发生下面这种情况了。

缺页

DRAM缓存不命中称为缺页(page fault)。例如上图中,当CPU要访问VP3中的内容,VP3未被缓存在DRAM中,访问VP3的虚拟地址PTE3从页表中的有效位得到VP3未被缓存,并且触发一个缺页异常
缺页异常调用内核中的缺页异常处理程序,该程序会选择一个牺牲页,在此例中就是存放在PP3中的VP4,如果VP4已经被修改了,那么内核就将它拷回磁盘。无论哪种情况,内核都会修改VP4的页表条目,反映出VP4不再缓存在主存中这一事实。
接下来,内核从磁盘拷贝VP3到存储器中的PP3,更新PTE3,然后返回。当异常处理程序返回时,它会重新启动导致缺页的指令,该指令会把导致缺页的虚拟地址重发送到地址翻译硬件,接下来重新访问一下VP3,那就会发生上面的页命中了。
颠簸
在程序运行过程中程序引用的不同页面总数可能超出物理存储器总的大小,但是局部性原则保证了在任意时刻,程序将往往在一个较小的活动页面的集合上工作,这个集合叫做工作集或者叫做常驻集。在初始开销,也就是将工作集页面调度到存储器中之后,接下来对这个工作集的引用将导致命中,而不会产生额外的磁盘流量。只要我们的程序有较好的时间局部性,虚拟存储器系统就能工作得相当好。但是,当然不是所有的程序都能展现良好的时间局部性,如果工作集的大小超出了物理存储器的大小,那么程序就产生一种“不幸”的状态,即颠簸,这时页面将频繁的换进换出。虽然虚拟存储器通常是有效的,但是如果程序性能慢的出奇,那么基本上就是发生了颠簸。

统计缺页次数

可以利用UNIX的getrusage函数监测缺页的数量。

虚拟地址空间布局&数据分布

详见http://blog.csdn.net/adminlpx/article/details/78209975

地址翻译
使用页表的地址翻译
页命中

页命中
页命中完全由硬件来处理的,CPU硬件执行的步骤:

①处理器生成一个虚拟地址,并把它传送给MMU;
②MMU生成PTE地址,并从高速缓存/主存请求得到它;
③高速缓存/主存向MMU返回PTE;
④MMU构造物理地址,并把它传送给高速缓存/主存;
⑤高速缓存/主存返回所请求的数据字给处理器。
缺页

缺页
与页命中不同的是,在缺页异常时,需要操作系统内核处理,是需要软件支持的。

①~③与页命中一致;
④PTE中的有效位是零,所以MMU触发了一次异常,传递给CPU中的控制到操作系统内核中的缺页异常处理程序。
⑤缺页处理程序确定出物理存储器中的牺牲页,如果这个页面已经被修改了,则把它宦楚到磁盘。
⑥缺页处理程序页面调入新的页面,并更新存储器中的PTE;
⑦缺页处理程序返回原来的进程,再次执行导致缺页的指令。CPU将引起缺页的虚拟地址重新发送给MMU。因为虚拟页面现在缓存在物理存储器中,所以会命中,然后处理器就会拿到所请求的字。
结合高速缓存的虚拟存储器

从我们熟悉的i386开始高速缓存cache就称为了计算机的一部分了。那么cache和虚拟存储器的结合过程如下:
CPU&cache
过程很清楚,不啰嗦了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值