操作系统中的分页机制小结

1、分页概述

大部分虚拟内存系统中都使用一种称为分页的技术。
       在任何一台计算机上,程序引用了一组内存地址,由程序产生的这些地址称为虚拟地址,他们构成了一个虚拟地址空间。在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存总线上,读写操作使用具有同样地址的物理内存字;而在使用虚拟内存的情况下,虚拟地址不是直接被送到内存总线上,而是被送到内存管理单元(Memeory Management Unit,MMU),MMU把虚拟地址映射为物理内存地址。
       虚拟地址空间按照固定大小划分成称为页面的若干单元。在物理内存中对应的单元称为页框。页面和页框大小是一样的,这里假设都为4KB。他们之间的映射关系如下图:
这里写图片描述

   注:在上图中,我们假设有一台可以产生16位地址的计算机,地址范围从0到64K,且这些地址是虚拟地址。然而,这台计算机只有32K的物理内存,因此,虽然可以编写64KB的程序,但它们却不能被完全调入内存运行。在磁盘上必须有一个可以大到64KB的程序核心映像的完整副本,以保证程序片段在需要时能被调入内存。
    内存和磁盘之间的交换总是以整个页面为单元进行的。

在图中,对应于64KB虚拟地址空间和32KB的物理内存,我们得到16个虚拟页面和8个页框。

    图中的标记符号如下:标记0-4K的范围表示该页的虚拟地址或物理地址是0-4095;4K-8K的范围表示地址4096-8191,等等,每一页包含了4096个地址。
    当程序试图访问地址8203时,例如执行下面这条指令
          MOV REG 8203
将虚拟地址8203送到MMU,MMU看到虚拟地址落在页面2(8192-12287),偏移量为11,根据其映射结果,这一页面对应的是页框6(24576-28671),因此,MMU把地址变换为24576+11=24587,并把24587送到总线上。内存对MMU一无所知,它只看到一个读或写地址24587的请求并执行它。MMU从而有效地把所有从8192-12287的虚拟地址映射到了24576-28671的物理地址。
      通过恰当地设置MMU,可以把16个页面映射到8个页框中的任何一个。但是这样并没有解决虚拟地址空间比物理内存大的问题。在上图中只有8个物理页框,于是只有8个虚拟页面被映射到了物理内存中(图中的×表示页面没有被映射。)在实际的硬件中,用一个“在/不在”位来记录页面是否在内存中。
      当程序访问一个未映射的页面时,例如执行如下指令
            MOV REG 32780
将虚拟地址32870送到MMU,MMU看到虚拟地址落在页面8(32768-36863),但是该页面并没有被映射到内存中,于是COU陷入到操作系统,称为缺页中断,操作系统调用适当的页面置换算法,找到某个页框将它的内容写入磁盘(如果它不在磁盘),随后把页面8读到刚才回收的页框,修改映射关系,然后重新启动引起陷阱的指令。

2、分页管理

2.1页表

       分页系统中,允许将进程的每一页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面对应的物理块,系统为每个进程建立一张页表,用于记录进程逻辑页面与内存物理页面之间的对应关系。页表的作用是实现从页号到物理块号的地址映射,地址空间有多少页,该页表里就登记多少行,且按逻辑页的顺序排列,形如:
这里写图片描述
虚拟地址到物理地址的映射可以概括如下:

    虚拟地址被分成虚拟页号(高位部分)和偏移量(低位部分)。例如,对于16位地址和4KB的页面大小,高4位可以指定16个虚拟页面,而低12位接着确定了页内偏移量。
   虚拟页号可用作页表的索引,以找到该虚拟页面所对应的页表项。由页表项可以找到页框号(如果有的话)。然后把页框号拼接到偏移量的高位端,以替换掉虚拟页号,形成送往内存的物理地址。

2.2页表项

一个典型的页表项如下:
这里写图片描述
页表项的结构是与机器密切相关的,但不同机器的页表项存储的信息都大致相同。
页表项中最重要的域是 页框号。其次是 “在/不在”位,这一位为1时表示该表项是有效的,可以使用;如果是0,则表示该表项对应的虚拟页现在不在内存中,访问该页面会引起缺页中断。 “保护”位指出一个页面允许什么类型的访问。最简单的形式是这个域只有一位,0表示读/写,1表示只读。一个更先进的方法是使用三位,各位分别对应是否启用读、写、执行该页面。 “修改”位和“访问”位用于记录页面的使用情况。这两位在操作系统重新分配页框和发生缺页中断选择淘汰的页时非常有用。 ““高速缓存禁止”位用于禁止该页面被告诉缓存。

2.3.加速分页过程

在任何分页式系统中,都需要考虑两个主要问题:
(1)虚拟地址到物理地址的映射必须非常快
使用“转换检测缓冲区(Translation Lookaside Buffer,TLB)解决。
(2)如果虚拟地址空间很大,页表也会很大
使用多级页表或倒排页表解决。

3、页面置换算法

操作系统中10种页面置换算法的总结
       当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。如果要换出的页面在内存中驻留期间已经被修改过,就必须把它写回磁盘以更新该页面在磁盘上的副本;如果该页面没有被修改过,那么它在磁盘上的副本已经是最新的,不需要回写。直接用调入的页面覆盖掉被淘汰的页面就可以了。
       当发生缺页中断时,虽然可以随机的选择一个页面来置换,但是如果每次都选择不常使用的页面会提升系统的性能。如果一个被频繁使用的页面被置换出内存,很可能它在很短时间内又要被调入内存,这会带来不必要的开销。所有需要一些有效的页面置换算法。
(1)最优页面置换算法

选择最长时间内不会被访问的页面丢掉。越久越好。但是理论上不能实现。

(2)最近未使用页面置换算法(NRU)

   找到最久没有使用的页面置换出去,页面被访问时设置R位,修改时设置M位,R位定期清0;

把页面分四类

0类.未被访问,未被修改的R=M=0

1类未被访问,被修改R=0,M=1

2类被访问,未被修改R=1,M=0

3类被访问,被修改R=1,M=1

系统从类类编号最小的非空类随机挑选一个置换。

(3)先进先出页面置换算法(FIFO)

  维持一个保存当前所有页面的链表,新使用的插在链表尾,从头部淘汰老旧页面,使得最久进入的排在头部。
(4)第二次机会页面置换算法
    改进版FIFO,淘汰旧页面时先从检查头部页面的R位,若为1,则说明此页面最近被使用过,置R=0,把它加到尾部去,重新设置其装入时间为当前时刻,继续搜寻,若为0,如果此页面被写过,把它写回磁盘再淘汰,若未被写,直接淘汰
(5)时钟页面置换算法
   维持一个保存所有页面的环形链表,一个指针指向最老页面,发生缺页中断时,检查指针指向页面,若R=0,则更新它,若R=1,清除R位,指针前移,继续搜索。
(6)最近最少使用页面置换算法LRU
找到最久没有使用过的置换之。需要特殊硬件实现(如利用一个n*n的矩阵)。
(7)最不常用算法NFU
   为每个页面维持一个初值0的计数器,每次时钟中断,由操作系统扫描所有页面,把计数器加上当前的R位更新,这样每个计数器的值大概反映了被访问的频繁程度。缺页中断时,置换计数器数值最小的页面。
(8)老化算法-改进的LRU
   在R位加进之前,先把计数器值右移一位,把R位加到计数器最左边,
特点:每次时钟滴答只能记下一位,因此如果两个页面在同一个时钟滴答期间被访问是不能分出的,而且由于计数器是有限位数,假设是8位,如果很多页面在8个时钟滴答都未被访问的话,就都是全零位无法区分,但实际情况是,若已经这么久没有被访问了,该页面一般也不是很重要了 。
(9)工作集页面置换算法
定义一个工作集:在过去t秒内被访问的页面的集合。

扫描所有页面,若R==1,说明在这个时钟滴答被访问了,它应该是工作集的一部分,把当前时间写入页表项的“上次使用时间“ 。若R==0,且生存时间(当前时间-上次使用时间)>t,置换它,如果<t,记住最小时间。

(10)工作集时钟页面置换算法

    维持一个以页框为元素的循环表,形成一个环,每个表项包括上次使用时间,R位M位

缺页中断时,首先检查指针指向的页面,若R位==1,则说明它最近被访问了,把R位置为0,指针指向下一个位置,若R==0,若它的生存时间>t且此页面干净,置换之。

如果不干净,继续往前走。(因为可能前方存在旧的又干净的页面)。

参考博客:
操作系统之分页分段介绍
操作系统篇-浅析分页机制
操作系统存储管理之分段存储
操作系统中10种页面置换算法的总结

  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值