操作系统哲学原理(13)内存原理-页面更换算法

说明:该系类文章更多的是从从哲学视角看 操作系统 这门学科。同时也是 操作系统的学习笔记总结。因为博主 这些年主要是以研究安卓系统和 嵌入式Linux为主,因此这个系类文章也是这两个领域不可或缺的基石之一,尤其是对操作系统感兴趣的伙伴可特别关注。


13 页面更换算法

当一个页面不再有用时,需要用一个新的页面来替换。当然,不是因为一个页面过时而找一个新页面来替换,而是因为需要使用新的页面而找一个过时的页面作为替换品。

13.1 页面需要更换

分页系统虽然克服了很多缺点,但是这个代价就是页面的更换。分页系统与交换系统的比较如下:

  • 在交换系统下,一个程序作为一个整体加载到内存。因此,运行时再从磁盘上加载任何东西。
  • 在分页系统下,一个程序的所有页面并不一定都在内存中,在执行的过程中就可能发生页面不在内存的情况,而这时需要产生缺页中断,将磁盘里的数据加载到内存里。
  • 对于分页系统,关键问题就是发生缺页中断的时候,选择换掉哪个页面合适。

13.2 页面更换的目标

页面更换的目标只有一个:降低随后发生缺页中断的次数和概率(即选择一个随后相当长时间内不会被访问的页面,最好是再也不访问,这样就会变相地加快缺页中断的速度)。为了达到这个目的,人们设计出了各种各样的算法,从哲学的角度看,归纳为两种:

@1 公平算法(对所有页面一视同仁),主要包括下面四种:

  • 随机算法。
  • 先来先出(FIFO)算法。
  • 第二次机会算法。
  • 时钟算法。

@2 非公平算法(页面独特性将会被考虑),包括如下五种:

  • 最优算法。
  • NRU算法。
  • LRU算法。
  • 工作集算法。
  • 工作集时钟算法。(一种混合算法,它既想保持公平,又含有区别对待的考虑)

13.3 随机更换算法

在需要替换页面的时候,产生一个随机页面号,而替换与该页面号对应的物理页面。随机选页所选出的被替换的页面不太可能是随后相当长时间不会被访问的页面。也就是说,这种算法难以保证随后的缺页中断次数最小化。事实上,这种算法的效果相当差。

13.4 先进先出算法(FIFO)

FIFO(先进先出)是人类的天性,人人都能想到的算法。FIFO的机制就是使用链表将所有在内存的页面按照时间的早晚链接起来,然后每次置换链表头的页面就好了,新加的页面挂在链表尾部,实现如图所示:

图1 按照内存进入早晚时间构建的页面链表

FIFO的优点是容易实现,但是这个公平的方式容易降低效率(如果先加进来的页面被经常访问就不好了,效率将降低很多)

13.5 第二次机会算法

FIFO只考虑进人内存的时间,不关心一个页面被访问的频率,从而有可能造成一个经常被访问的页面替换掉而造成效率低下。我们对FIFO改进的方向就是考虑一个页面是否是经常被访问的页面,即页面访问的频率。改进的手段就是在使用FIFO更换一个页面时,看一下该页面最近是否被访问过:

  • 如果没有被访问过,则替换该页面(一般设置访问位为0)
  • 如果该页面最近被访问过(通过检查其访问位的值是否为1),则不替换该页面,而是将该页 面挂到链表末端,并将该页面进人内存的时间设置为当前时间,并将其访问位清零。

这样,对于最近被访问过的页面来说,相当于给了它第二次机会。(访问位设置为1)

对于图1,A页面最近被访问过,即其访问位R的值为l,则使用第二次机会算法后,链表的格局如图所示:

图2 第二次机会算法下,链表格局的变化

13.6 时钟算法

@1 第二次机会算法的优点与缺陷:

优点:

  • 容易实现

缺陷:

  • 每次给予一个页面第二次机会时,将其移动到链表末尾需要耗费时间。
  • 页面的访问位只在页面替换的时候进行扫描时才可能清零。(这将导致其时间局域性体现的不好,因为访问位为1的页面可能是很久以前访问的)

@2 为了改善第二次机会算法,想出了时钟算法。时钟算法逻辑如下:

do{
    我们把页面排成一个时钟的形状。该时钟有一个针臂。每次需要更换页面时,我们从针臂所指的页面开始检查。
        如果当前页面的访问位为0,即从下次检查到这次,该页面没有被访问过,将该页面替换。
        如果当前页面被访问过,那就将其访问位清零.并顺时针移动指针到下一个页面。
}while(找不到一个访问位为0的页面);

@3 第二次机会算法与此类似,但是它们是不同的:

  • 它们的数据结构不一样,第二次机会使用的是链表,需要使用额外的内存。 时钟算法使用的索引(整数指针),可以直接使用页表。(这不需要额外的空间。但更大的好处是页面的访问位会定期自动清零,这样将使得时钟算法的时间分辩粒度较第二次机会算法高,从而取得更好的页面替换效果)
  • 时钟算法的根本也就是第二次机会算法,其缺点和第二次机会一样:过于公平,没有考虑到不同页面调用的频率的不同。

13.7 最优更换算法

公平的方式使得没有页面获得特殊待遇,也就使得系统的效率受到了不同的影响;这是因为个体对整个系统的贡献没有被区别对待,造成贡献大和贡献小的待遇一样。对页面个体的特性考虑,依据其在程序中的不同作用而在选择页面时给予不同的待遇。这样就形成了非公平算法,在非公平算法里面,判定一个算法的优劣主要是看是否接近这样一个标准:替换算法选择一个再也不会被访问的页面进行替换;如果不存在这样的页面,则至少选择一个在随后最长的时间内不会被访问的页面。

13.8 NRU算法

@1 在第二次机会算法上进行改进:

第二次机会选择的是最先进入内存几访问位为零的页面来进行替换。 改进的办法就是选择一个最近没有被访问的页面来替换,但在所有的最近没有使用的页面里,不是按照最FIFO来划分,而是按照各个页面的修改位和访问位的组合来进行划分。这种算法就称为最近未使用算法(Not Recently Used,NRU)。根据时空局域性的原理,一个最近没有被访问的页面在随后的时间里一般也不会被访问,而NRU的算法的实现方式就是利用页面的访问位和修改位。访问位和修改位的概念如下:

  • 当对页面进行读/写操作时:访问位设置为1(定期清零)。
  • 当对页面进行写操作时,修改位设置为1(页面换出时,要用它判断页面是否需要写回磁盘,不清零)。

@2 根据访问位和修改位的状态来分:可以分成4种页面类型如下表:

图3 按照访问位和修改位的取值将页面划分为4大类

说明:对于第二种情况,没有被访问过,却被修改过的说明:访问位会定期清零,但是修改位不会。

有了这个分类之后,需要做的就是按照4类页面的顺序寻找可以替换的页面。按照1-2-3-4的类型选择顺序来替换页面,符合NRU的算法目标,但是算法总会终结。(如果所有页面都被访问和修改过,那也只能从中替换掉一个页面)

13.9 LRU算法

LRU算法是对NRU算法的一种改进,LRU(Least Recently Used)不仅考虑最近是否使用过,还要考虑最近使用的频率。(这时的理念还是利用过去的数据来预测未来,即时空域)。从LRU的定义可以看出,LRU算法的实现必须以某种方式记录每个页面被访问的次数。而这是个相当大的工作量。最简单的办法就是在页表的记录项里增加一个计数域,一个页面被访问一次,这个计数器的值就增加1。这样,当需要更换页面时,只需找到计数域里面取值最小的页面替换即可,该页面即是最近最少使用的页面。

LRU的两种实现算法:

  • 计算机采取定期清零的操作来将时间段限制在我们规定的“最近”。在这个“最近”里面,计数器最小值的页面就理解为最近也就是最少使用的页面了。而事实证明,这种方法和真实最优情形很接近。
  • 另一种简单实现方式是用一个链表将所有页面链接起来,最近被使用的页面在链表头,最近未被使用的放在链表尾。在每次页面访问时对这个链表进行更新,使其保持最近被使用的页面在链表头。

两种算法实现方法都存在着明显的缺点:

  • 每次内存访问对链表进行更新的效率十分低下,因为这需要考虑不同页面之间的关系。
  • 使用计数器在每次访问内存时只需修改一个页面的数据即可,但需要使用计数器的个数却与虚拟页面一样多,因此空间成本巨大。
  • 在遴选页面替换时,需要比较所有页面计数器的取值,因此时间成本也很大。

13.9.1 使用矩阵实现LRU算法

@1 矩阵算法就是使用一个矩阵来记录页面的使用频率和时间的方法。该矩阵为n*n维,n是相关程序当前驻内存的页面数。在一开始矩阵的数值为0,每次一个页面被访问时,假设第k个虚拟页面被访问时,进行如下操作:

  • 将第k行的行值全部设置为1(保证该页面对应的行值为最大之一,即该行1的个数最多)。
  • 将第k列的列值全部设置为0(保证该页面对应的行值为唯一的最大,即其他行1的个数没有这行多)。

@2 矩阵算法的优点:

  • 很快判断哪个矩阵值最小,速度快。
  • 使用矩阵实现LRU的成本比使用技术域要低,因为矩阵需要的是内存中的实际页面数,因此要小多了。

@3 矩阵算法的缺点:

  • 矩阵真用的空间太大,毕竟是页面数的平方。
  • 不能体现长时间访问次数的积累。

13.9.2 使用移位寄存器实现LRU算法

@1 通过给存放在内存的额页面配备一个移位寄存器。该寄存器用来记录该页面被访问频率和最近的属性。所有移位寄存器的初值皆为0;在规定长度的周期内,将移位寄存器的值向右移动一位,并将对应页面的访问位的值加到该移位寄存器的最左位。

@2 与矩阵算法相比,移位寄存器的优势:

  • 在硬件上节省了空间(矩阵算法需要n*n的空间,而移位寄存器需要n*L的空间)。
  • 节省时间(页面访问需要更新矩阵,而移位寄存器算法不需要每次都更新,而是在规定的时间范围内统计一次)。

@3 移位寄存器的缺陷:

  • 更新周期灵活付出的代价就是记录的精确性不如矩阵算法;而且有时会发生错误,即选出的页面可能不是最近最少使用的页面。
  • 移位寄存器的造价高,导致成本急剧上升。

13.10 工作集算法

@1 LRU算法虽然很好,但是由于实现成本太高,并且付出时间代价太大,因此一般的商用操作系统并没与采纳LRU的页面更换算法。

@2 LRU成本高的原因:我们想要分辨出不同页面里面,哪个页面是最近最少使用的;需要对每个页面保持记录,并在每次页面访问时/周期性地对这些记录进行更新,从而造成时间空间成本上升。(实际上是不肯能精确的确定哪个页面是最少使用的)

@3 实际上我们需要的是选出的页面是不太可能马上又使用的页面,这种少量的信息就是所谓的工作集信息。工作集概念来源于程序访问的时空局域性,即一段时间内程序访问的页面将局限在一组页面集合上,工作集与最近访问次数的关系如下:

图4 工作集与最近访问次数的关系

说明:其中,t为时间,w为工作集的大小,即在时间t时k次访问所涉及到的页面数量。该算法的目标就是维持当前的工作集页面在物理内存里;每次页面更换时找到一个不属于当前工作集的页面替换即可。(不需要考虑访问的频率和离当前时间谁近谁远;寻找页面时也只需要分为两类:当前工作集页面与非当前工作集页面;从而降低算法复杂性)工作集算法如下:

@4 在页面的每个记录增加一项信息用来记录该页面最后一次被访问的时间(不鄙视真实时间,一个安规律递增的虚拟时间即可;同时设置一个时间T),如果一个页面的最后一次访问在(当前时间-T)之前,则视为在工作集外;否则在工作集内。每次替换页面时,扫描所有的页面记录,操作如下:

loop:{
如果页面的访问位是1,则将该页面的最后一次访问时间设为当前时间,并且将访问位清零。
如果页面的访问位是0,则查看其访问时间是否在(当前时间-T)之前。
    如果在,该页面将是被替换页面,算法结束。
    如果不在,记录当前所有被扫描过的页面的最后访问时间里的最小值。
    扫描下一个页面。
}goto loop;

@5 该算法如图所示:

注意:该算法只扫描一遍页表,如果所有页面的访问位都是1,则表示分配给该程序的内存不够;最好的解决办法不是替换页面,而是给程序增加一个物理页面。

@6 T值的确定:在某个时间段内访问页面的个数基本固定不变;这需要测试来决定。

@7 工作集算法的优点:只需要页表的每个记录增加一个虚拟时间即可,时间成本低。

13.11 工作集时钟算法

  • 工作集算法的缺点:每次扫描页面进行替换时,有可能需要扫描整个页表(由于扫描的页面并不都是在内存里,因此扫描的大部分时间将是无用功)。
  • 对其进行的改进:把工作集算法与时钟算法结合起来;将页面扫描顺序按照时钟算法结合起来;每次替换页面时,从指针指向的页面开始扫描,从而达到公平状态 ,按照时钟组织的页面只是在内存里,在内存外的页面不放在时钟圈里,从而提高实现效率。由于工作集时钟算法在空间和时间上以及成本的优势,因而被大多数商业操作系统采纳。

13.12 页面替换策略

任何算法都可以用到数据集上。算法应用的对象可以分为全局和局部两类,从而形成两类替换策略:全局策略和局部策略。 全局策略:算法应用的对象是物理内存里的所有页面(包括其他进程的页面),因此这种策略会影响其他进程内存的使用;系统的总页面缺失率低,但是程序运行不稳定。(因为一个进程在内存的页面使用不仅取决于该进程,还取决于其他进程的页面走向,所以无法控制自己的缺页率)

局部策略:算法应用的对象是当前进程的所有页面,这种策略不会影响其他进程内存的使用;更加公平,程序运行更加稳定,但是不能充分地利用系统的整体资源,可能造成不同进程之间在页面使用上的不平衡。(即有的进程有页面富余,而有的进程却频繁缺页)

13.12.1 固定与可变驻留集

页面替换策略决定了一个进程在内存所占页面的数量是否固定。

  • 局部策略:进程驻留的页面数是固定的(因为选择的是本进程的页面进行替换)。
  • 全局策略:进程驻留的页面数是可变的(因为动态地改变了一个进程所占物理页面数)。

即:

  • 凡是支持固定驻留集的页面替换策略算法只能用于局部替换策略。
  • 凡是支持可变驻留集的页面替换策略算法只能用于全局替换策略。    

13.12.2 初始页面数确定

为每个进程分配内存块数的算法有4种:

  • 均分法:将内存空间在多个进程间平均分配。
  • 比例法:根据程序大小按比例给每个进程分配内存空间。
  • 优先权法:将优先级考虑进来,从而加速高优先级进程的执行。
  • 请求分页:进程初始化时不分配页面,在需要使用页面的时候再一个页面一个页面的增加,当进程的缺页率降低到一定程度,页数将不再增加。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值