存储管理——虚拟内存

来源:互联网 发布:ug五轴联动编程 编辑:程序博客网 时间:2024/05/24 07:12

存储管理中虚拟内存是当内存容量不足时需要考虑的一个问题。那么:

  • 1)虚拟内存是否可实现?
  • 2)虚拟内存如何扩展内存容量?

接下来看看,怎么内存是通过外存来扩展的。

1) 虚拟内存是否可以实现?

为什么提出这个问题,实际上问的是这个问题:程序真的可以划分成很多块,取部分程序块装入较小的内存中,然后还能正确运行么?
面对后者提问,可以将程序的逻辑地址正确转化物理地址,实现程序的分块;同时为了高效的完成逻辑地址映射到物理地址的操作,使用页式管理,段式管理或两者结合的方式。
但是由于是从外存中装入到内存中,由于访问外存的速度相对于更慢,是否能高效的完成这个动作?经过大量的试验发现程序的运行符合局部性原理,集中访问程序中的某几块,如果将经常使用的程序块减少移动次数,便可解决这问题。
暂且只考虑到此,其中较为重要的缺页中断处理,以后再说。

2) 虚拟内存如何扩展内存容量?

扩展方式有以下几种:
1. 页式管理
2. 二级页式管理
3. 倒排页表
4. 段式管理
5. 段页式管理
以下将结合图示(参考操作系统精髓与设计原理中文第6版)具体地描述各种扩展方式。

2.1 页式管理

页式管理
其中由于程序划分的虚拟内存块大小与实际内存一致,这就保证了程序中的偏移地址,与内存中的偏移地址一致;
由于在程序装入内存时建立了页表,这就保证了程序可以将虚拟地址映射到页表,访问实际地址。
看看如何将程序的虚拟地址转化为实际地址,实现程序的有效运行。
a. 虚拟地址=页号:偏移量,将其中的页号,与页表指针相加,映射到页表中的相关位置;
b. 通过查找该页号对应的页表中的各项信息,经过处理(可能从辅存中调入相应的页到内存中)得到页框号(块号)
c. 将所得到的页框号(块号)与虚拟地址中的偏移量组合形成,实际的内存地址。

2.2 二级页式管理

二级页式管理
由于内存的限制,页表的增长受限,然而内存增长较快。为了采用页式管理,不得不将较大的页表分成两个页表:根页表和子页表,根页表存入内存,子页表存入辅存。这样既减轻了内存的鸭梨,又能使用较为成熟的管理。具体转化地址过程:
a. 虚地址=根页号:子页内偏移(上图标识不清):偏移量,将其中的根页号与根页表指针相加,得到子页号;
b. 将得到的子页号与虚地址中的子页内偏移相加,经过一系列处理得到实际的块号;
c. 将得到的块号与虚地址中的偏移量组合形成实际地址

2.3 倒排页表

倒排页表
外存的不断发展,是原有的页表无法适应新的要求。
在倒排页表中,将虚地址中的页号通过散列函数,映射到内存中的某一表中,该表将具有相同散列值的页号形成链,如图所示,第i块之后与第j块相连。
具体的转化过程:
a. 虚地址=页号:偏移量,将其中的页号通过散列函数,映射至某一内存块上。
b. 遍历具有相同散列值的页号链,寻找当前页号所对应的块。
c. 将得到的页号对应的内存中的位置,与虚地址中的偏移量组合形成实际的地址。

2.4 段式管理

段式管理
段式管理是程序员自己将程序中具有特定功能的代码归为一个模块,程序运行时,动态的将当前的模块装入内存中,并将各个模块段记录在段表中。
具体流程:
a. 虚地址=段号:偏移量,将虚地址中的段号通过段表指针,定位到段表中的具体位置;
b. 经过一系列处理读出将段表中的某行,得到基址等信息;
c. 将得到的基址与虚地址中的偏移量组合形成实际的内存地址。
由于存在段长等信息可判断当前虚地址是否违法访问;由于每个模块为一个段,其他程序则可以共享其中的某些模块,这是页式管理所不能实现的。

2.5段页式管理

段页式管理
段页式管理是结合页式管理和段式管理两者的优点。内存利用率较高,模块化程度高,能提供较好的保护和共享机制等等。
它是将在段式管理的基础上,将每一段再采用页式管理的一套使用内存方法。
具体转化过程:
a. 虚拟内存=段号:页号:偏移量,将其中的段号取出,通过段表指针,与段表中的相关信息建立联系,得到段中的页表;
b. 将虚地址中的页号映射到所得页表中,得到相应的块号;
c. 所得到的块号与虚地址中的偏移量组合形成实际的地址。

以上只是简单的描述了各种管理方式。
对于具体实现依旧有很多细节没有介绍,比如说:如果虚地址并不能在页表或段表中找到,怎么办?如何使用高速缓冲装置,进行页表项的查找等等问题。
最后一篇只是简单的涉及如何对缺页中断的处理,至于深入了解或学习其他内容请查看相关书籍(比如:《操作系统精髓与设计原理》)或相关网络资源。

0 0