2011年系统架构设计师真题7题
7.虚拟存储器发生页面失效时,需要进行外部地址变换,即实现( )的变换。
A.虚地址到主存地址
B.主存地址到 Cache 地址
C.主存地址到辅存物理地址
D.虚地址到辅存物理地址
这个题比较坑,答案是D, 我们一步步分析:(如果仅仅了解页式存储管理,那么这题很容易就选A了)
虚拟存储器中,如果页面失效,会发生缺页中断,即访问的数据不在内存中,需要将磁盘中的数据加载到内存。这个过程中磁盘中的数据加载到内存,到底发生了什么?
有个大前提,缺页中断了,也就是我们要访问的数据不在内存中(不在“页表”中),如果内存已经满了,那么需要进行页面淘汰,并将所要访问的数据加载到淘汰页面的位置,如果内存没有满,那么就将所要访问的数据加载到内存的空闲位置。
1. 所要访问的数据加载到淘汰页面的位置
要淘汰内存中的页面,需要页面置换算法, 比如FIFO、LRU等,淘汰是直接清理掉吗?并非如此。要淘汰的时候,需要判断该页面的数据是否已经被修改了,如果被修改了,需要写回到磁盘。试想一下,如果不回写到磁盘,那么我们修改的数据是不是就永久的丢失了?
所以,内存中的页面被置换的时候,如果修改位为“1”,那么就要将数据回写。如何回写呢? 那是不是要找到该页面当时是如何从磁盘加载到内存的?
这时候就需要“外页表”了,它记录了操作系统中内存的虚拟地址与磁盘物理地址的映射关系,通过虚拟地址找到该页在磁盘中的准确位置(磁盘机号、柱面号、磁头号和扇区),然后写回。
到此位置,上面题的答案就出来了, 外部地址变换,需要通过虚拟地址找到磁盘的物理地址,然后将被置换的页面写回到磁盘。
2. 所要访问的数据加载到内存的空闲位置
要访问的数据,从磁盘加载到内存的空闲位置,需要记录以下从磁盘哪个具体位置加载到内存的,这时候也需要维护以下“外页表”,即为虚拟内存的虚拟地址到磁盘物理地址的映射。
综上,无论内存是否满,从磁盘加载数据到内存时,都要访问“外页表”,也就是虚拟地址与磁盘物理地址的映射。
那么我们经常说的页表,其实是内页表,是内部地址转换的时候用的,也就是通过虚拟地址定位到内存的物理地址。我们我们写的Java、C++代码, 声明了一个变量a,这个a的地址是虚拟地址,我们要改a的值,就需要通过“页表”找到实际的物理地址,然后更改物理地址上保存的内容。
总的来说,“外页表”是虚拟地址与磁盘物理地址的映射关系表,“页表”是虚拟地址与内存物理地址的映射关系表。
关于操作系统的存储管理可以参考以下两篇文章:
http://www.ylaihui.com/blog/article/9280?rootCategoryId=16
http://www.ylaihui.com/blog/article/9276?rootCategoryId=16
文章最后附上操作系统的地址变换流程图: