操作系统:虚拟内存的存储管理

页式管理

在基于分页的虚拟内存方案中,通常每个进程都有一个唯一的页表,对应于每个进程都有自己的虚拟地址空间

页表项的格式为:

  • P位:由于一个进程可能只有一些页在内存中,因此每个页表项需要有一位(P)来表示它所对应的页当前是否在内存中。如果这一位表示该页在内存中,则这个页表项还包括该页的页框号。
  • M位:修改位(脏位),表示相应页的内容从上一次装入内存中到现在是否已经改变。若未改变,则当需要把该页换出时,不需要用页框中的内容更新该页,即不需要将该页的内容再写回磁盘,可以直接丢弃。

由于页表的长度可以基于进程的长度而变化,因此不能在寄存器中保存,页表必须在内存中且可以访问到

当一个进程正在运行时,一个寄存器保存该进程页表的起始地址,虚拟地址(又称为逻辑地址,由页号和偏移量组成)的页号用于检索页表(可以看作是页表的索引,即页表项相对于页表起始地址的位置),查找内存中相应的页框号,并将查找到的页框号与虚拟地址中的偏移量组合起来产生对应的物理地址(由页框号和偏移量组成,是内存中的实际地址)。

 

当页表过大,占据过多内存时,可以采用多级页表的形式,主要有二级页表(即创建页表的页表,可以理解为将原来的页表分为多个大小相等的块/页表)。(参考文章,强烈推荐

以虚拟地址空间为32位(4GB)为例,若页面大小为4KB(即2^12),则页表一共有1M个页表项(4GB/4KB=1M),一个页表项包含了一个页框号,指向内存中的具体页框。若每条页表项占用4B,则一个页表需要占用4MB的内存。如果使用二级页表,则将原来的页表再分为大小相同的页,再建立对应的索引。所以如果二级页表退化为一级页表,那么它最终包含的页表项与原来的一级页表是一样的(1M个)。

采用二级页表时,若其第一级页表每个页表项映射4MB,则一共有1K(4GB/4MB)个页表项,而每个一级页表项则对应1K(4MB/4KB——页框大小)个第二级页表项。(最后一级页表,即第二级页表的页表项包含了指向内存中页框号的信息)这样的话该二级页表一共占用1K*4B+1K*1K*4B=4.004MB的内存,看似比原来多占了内存,实则可以通过一些方法来节约内存。

  • 第二级页表可以不存在。每个进程有4GB的虚拟地址空间,但实际上远远不需要完全使用这些空间。当使用一级页表时,操作系统通过虚拟地址中的页号去页表中查找对应的页表项,页表需要覆盖全部虚拟地址空间才能够保证每一次根据页号查找时都能找到对应的页表项,否则系统会出错。但采用二级页表时,其第一级页表已经覆盖了整个虚拟地址空间,其中每个页表项映射到虚拟地址空间中的4MB。若对于进程来说,这4MB实际上不需要用到,则可以不创建该页表项对应的第二级页表,这就起到了节省空间的作用。(即第二级页表可以在需要的时候才创建
  • 第二级页表可以不再主存中。根据进程的运行的局部性原理,虚拟地址的使用也存在局部性,故可以把第二级页表都放在磁盘中,在需要使用时才调入内存。但这是时间换空间的做法,频繁地换入换出需要花费大量的额外时间。

如上图的二级页表转换方式,虚拟地址原页号被分割为两部分,前10位指向第一级页表的页号,找出其对应的第二级页表的起始地址;后10位指向第二级页表的页号,与前10位找到的起始地址结合找到了第二级页表中对应的页表项,该页表项指明了该页对应到内存中的页框号。

上述页表设计中,页表的大小与虚拟地址空间的大小始终成正比。

 

当物理内存远远小于虚拟内存(CPU可寻址空间)时,在内存中创建包含所有虚拟存储空间中的页帧所对应的页表项需要花费较大的内存,可以采用倒排页表解决这个问题。

倒排页表:

倒排页表之所以被称为“倒排”,是因为它使用页框号而非虚拟页号来索引页表项

虚拟地址的页号部分使用一个简单的散列函数映射到散列表中。散列表包含一个指向倒排页表的指针,而倒排页表中包含有页表项散列表和倒排表中各有一项对应于一个实存页。因此无论有多少进程,支持多少虚拟页,页表都只需要实存中的一个固定部分。由于多个虚拟地址可能映射到同一个散列表,所以需要使用链接技术管理。

实际内存的每一个页帧对应一个页表项,而不是每个虚拟内存的页面有一个页表项。(对于大小为2^m个页框的物理内存,倒排页表包含2^m项,所以第i个项对应于第i个页框,不用再在页表项上标识该项属于哪一个页框。)

页表项内容:

  • 页号:虚拟地址的页号部分;
  • 进程标识符:指明当前是哪个进程在使用该页。进程标识符和页号结合起来标志一个特定进程的虚拟地址空间的一页
  • 控制位:比如有效位、访问位和修改位;
  • 链指针:如果某个项没有链项,则该域为空,否则该域包含链中的下一项的索引值(0到2^m-1)。

当物理内存较小时,倒排页表可以大量节省空间。

但是从虚拟地址转换到物理地址的过程变得困难,无法使用CPU提供的页帧映射机制,需要搜索整个倒排页表查找对应于页表项的页帧。

 

转换检测缓冲区

原则上每次虚存访问可能引起两次物理内存访问,一次是取相应的页表项,一次是取查找到的页帧中的数据。这样效率比较低。因此大多数虚拟内存方案为页表项提高了一个特殊的高速缓存,通常称为转换检测缓冲区(Translation Lookaside Buffer,TLB),包含了最近使用过的页表项

给定一个虚拟地址,处理器首先检查TLB,如果需要的页表项在TLB中则称为命中(Hint),表示找到了页框号并可以形成物理地址。如果未找到需要的页表项则称为未命中,那么处理器需要用页号去检索进程页表并检查相应的页表项。如果检查到页表项中的”存在位“已经置位,则表示该页在内存中,处理器从页表项中检索出页框号以形成物理地址。处理器同时更新TLB,使其包含这个新的页表项。如果”存在位“没有置位,则表示需要的页不在内存中,这将产生一次内存访问故障,称为缺页(page fault)中断。这时需要通过操作系统来装入所需要的页并更新页表(缺页中断处理,将要访问的页从磁盘装入到内存,需要检查内存是否有空闲)。

TLB中的项必须包括页号以及完整的页表项,只有整个项完全匹配才算命中(包括各种控制位的匹配)。在页表中查找页表项时使用的是直接映射(虚页号对应了页表的索引),在TLB中查找的技术称为关联映射,这一技术是通过硬件实现的,是并行的(逻辑地址中的虚页号与TLB表项的匹配)。

 

页的尺寸的设置

需要考虑的一个因素是内部碎片,显然页越小,其内部碎片的总量越少;但页越小又造成每个进程需要的页的数目越多,意味着需要更大的页表。对于多道程序设计环境中的大程序,这意味着活动进程有一部分页表在虚存中而不是在内存中,从而一次内存访问可能产生两次缺页中断,第一次读取所需的页表部分,第二次读取进程页。另一个因素是基于大多数辅存设备的物理特性,希望页尺寸能比较大从而实现更有效的数据块传送。

页尺寸对缺页中断发生的概率也有一定影响。一般而言基于局部性原理(CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中),如果页尺寸非常小,那么每个进程在内存中有较多数目的页。一段时间后内存中的页都包含有最近访问的部分,因此缺页率比较低。但当页尺寸增加时,每一页包含的单元和任何一个最近访问过的单元越来越远,因此局部性原理的影响被削弱,缺页率开始增长。而若页尺寸继续增长至接近整个进程的大小时,缺页率开始下降。(当一个页包含整个进程时,不会发生缺页中断)。

另外,缺页率还与分配给一个进程的页框数目有关,对固定的页尺寸,当内存中的页数目增加时缺页率会下降。

小结:

  • 小页面有利于减少内部碎片总量;
  • 大页面有利于减小进程的页表容量;
  • 大页面有利于实现有效的磁盘数据块传送。

 

段式管理

页式管理对程序员来说是不可见的,而段式管理则是可见的。段式管理将内存视为由多个地址空间或段组成,段的大小不相等,是动态的。内存访问以段号和偏移量的形式组成地址。

与页式管理类似,每个进程都有一张段表,段表长度不定,存放在内存中(但进程中有的段可能不在内存中)。进程的段表起始地址保存在CPU的一个专用寄存器里。

与非段式地址空间相比有以下优点:

  • 简化了对不断增长的数据结构的处理。对于段式虚存,操作系统可以在需要时扩大或缩小一个段来适应其中的数据结构。
  • 允许程序独立地改变或重新编译,而不要求整个程序集合重新链接和重新加载。
  • 有助于进程间的共享。可以在某个段中放置一个工具程序或数据表使得其他进程可以通过访问这个段来调用工具或者获取数据。
  • 有助于保护。由于一个段可以被构造成包含一个明确定义的程序或数据集(整个段),所以可以方便地指定段的访问权限(而不造成浪费或者错误的指定)。

 

段页式管理

在段页式系统中,用户的地址空间被程序员划分成许多段。每个段依次划分成许多固定大小的页,页的长度等于内存中的页框大小。操作系统为每个进程建立并维护一个段表,为每个段建立并维护一个页表。从程序员的角度来看,逻辑地址依然由段号和段偏移量组成;从系统的角度看,段偏移量可视为指定段中的一个页号和页偏移量。

存在位和修改位位于页表中;共享和保护位则通常在段表中。

段表表项包括了段的长度和段基地址,因此程序不会不经意地访问超出该段的内存单元。

 

环保护

一种常用的保护方案是环保护,在此方案中编号小的内环比编号大的外环具有更大的特权。典型情况下,0号环为操作系统的内核函数,应用程序则位于更高层的环。基本原理如下:

  • 程序可以只访问驻留在同一个环或更低特权环中的数据;
  • 程序可以调用驻留在相同或更高特权环中的服务;

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值