2015.4.8 虚拟存储器

程序被分成虚拟页,内存被分为页帧,虚拟页可以通过全相连的方法映射到任何一个页帧中。

SRAM相当于DRAM的缓存,而DRAM相当于硬盘的高速缓存,但是我们看代价的话,内存不命中相比于SRAM不命中代价要大得多,因此我们要用尽一切办法减少内存的miss,于是我们采用全相连的方法来映射,而且使用写回而不是直写。

于是在调度过程中,我们到底从硬盘调用哪个页面,替换哪个牺牲页的策略由操作系统、MMU和页表实现。页表相当于一个映射,是虚实转换的作用,而具体实现就是由操作系统来实现。

页表(page table)中是一项一项的(Page Table Entry,PTE),这其中包含了的就是一个一个的映射。这是个可以改变的映射。我们可以这样想:这个页表表示一个映射,定义域指向值域的映射,这是个满射。每当我取定义域中的一个元素,如果有值域,那么我就取值,而且计数器加一,如果没有映射,那么证明我需要的东西还不在当前的映射之中,那么我这个时候就删除使用率最低的一个映射替换成我当前需要的。

这个表到目前为止我们来看需要什么内容,定义域:虚拟页的编号;标记:当前定义域中的元素是否被使用,像是used[i]这个数组的含义;值域,表示我当前的虚拟地址映射到的物理地址。

 

当我需要数据的时候,我自然的首先先找页表,看看我需要的那一项是否在页表中,如果在,命中,我直接取数据就好;如果不在,这时候,进入异常处理程序,调用一个缺页中断,然后找一个牺牲页,数据如果有修改就要写回,然后调进来我需要的数据到内存中,重新执行当前指令。

由于局部性原理,这种策略实际上是很高效的,虽然缺失代价很大,但是并不容易缺失。当然,对于缺失来说,如果常驻集(工作集,程序经常活动的界面集合)大于物理存储器大小,程序将会发生颠簸,经常有界面换进换出。比如:电影。

 

*当我们分配新页面,调用malloc的时候,我们实际上是在页表中新建了一项,就相当于在定义域中添加了一个元素。

*按需界面调度(当我需要界面的时候调入内存,其他的方法比如预测界面)和独立的虚拟地址空间的结合可以很大程度优化我们的系统。

 

为了控制页面访问的内容,我们接下来在每一个PTE中增加三个字符来控制SUP,READ,WRITE,意味着是否是超级用户才能访问,是否可读、可写

你可能感兴趣的:(2015.4.8 虚拟存储器)