操作系统笔记--页面置换算法

页面置换算法用于处理内存不足时的选择替换页面策略,包括最优、FIFO、LRU、时钟等多种算法。FIFO可能出现Belady现象,而LRU通常表现较好但成本高。工作集和常驻集模型基于程序局部性原理,帮助优化内存使用。全局置换算法如工作集页面置换算法动态调整内存分配,防止抖动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1--页面置换算法

2--局部页面置换算法

2-1--最优页面置换算法

2-2--先进先出算法

2-3--最近最久未使用算法

2-4--时钟页面置换算法

2-5--二次机会算法

2-6--最不常用算法

2-7--Belady现象

2-8--LRU、FIFO和Clock算法的比较

3--工作集和常驻集模型

4--全局置换算法

4-1--工作集页面置换算法

4-2--缺页率页面置换算法

4-3--抖动问题


1--页面置换算法

        当缺页中断发生,需要调入新的页面而内存已满时,根据页面置换算法来选择内存当中哪个物理页面被置换;

        衡量页面置换算法的优劣:尽可能地减少页面的换进换出次数(即缺页中断的次数);尽可能把未来不再使用的或短期内较少使用的页面换出;

2--局部页面置换算法

2-1--最优页面置换算法

        当一个缺页中断发生时,对于保存在内存当中的每一个逻辑页面,计算其下一次被访问的时间,选择时间最长的页面作为置换页面;

        最优页面置换算法是一种理想情况,在实际系统中无法实现,因为操作系统无法计算每一个页面下一次被访问的时间;

2-2--先进先出算法

        先进先出算法(FIFO)选择在内存中驻留时间最长的页面进行替换;操作系统维护一个链表,记录了位于内存当中的所有逻辑页面,其中链首页面的驻留时间最长,链尾页面的驻留时间最短;当发生缺页中断时,将链首页面淘汰出局,并把新的页面添加到链尾中;

        一般来说,先进先出算法的性能较差,调出的页面可能是经常要访问的页面,同时会导致Belady现象(即导致后续更多的缺页中断);

2-3--最近最久未使用算法

        最近最久未使用算法(Least Recently Used,LRU)在发生缺页中断时,会选择最久未使用的那个页面进行替换;

        最近最久未使用算法是对最优置换算法的一个近似,其依据程序的局部性原理,即在短时间内某些页面被频繁访问,那么在未来的一小段时间内具有极大可能地被频繁访问;反之,某些页面长时间未被访问,那么它们还可能会长时间地得不到访问;

        LRU 算法需要记录各个页面使用时间的先后顺序,其开销比较大,具体实现有以下两种方法:

        ① 系统维护一个页面链表,最近使用的页面作为首结点,最久未使用的页面作为尾结点;每一次访问内存时,找到相应的页面,从页面聊表的当前位置取下再将其移动到首位置;当发生缺页中断时,替换页面链表的尾结点;

        ② 系统设置一个活动页面栈,当访问某页时将该页号压入栈顶,并考察栈内是否有与此页面相同的页号,若有则抽出置于栈顶;当发生缺页中断时,替换处于栈底的页面;

2-4--时钟页面置换算法

        Clock 页面置换算法是 LRU 算法的近似,也是对 FIFO 算法的改进,其需要使用页表项当中的访问位,当一个页面被装入内存时将访问位初始化为0,当页面被访问(读/写)时将访问位置为1;

        将各个页面组织成环形链表(类似于钟表面),把指针指向最先进来的页面;当发生缺页中断时,首先考察指针指向的页面,若其访问位为0,则进行替换;若访问位为1,则首先将访问位置为0,再将指针往下移动一格,直至遇到访问位为0的页面进行替换;

2-5--二次机会算法

        二次机会法(Enhanced Clock algorithm)是对时钟页面置换算法的一个改进,其有两个类似于Clock算法访问位的 bit,分别称为 used bit 和 dirty bit,对应读和写;当一个页面的 used bit 和 dirty bit 都为0时才会被替换,即对于一个 used bit 和 dirty bit都为1的页面来说,其至少需要循环两次才能被替换;

        当页面被写入时,dirty bit 和 used bit 将置 1;当页面被读取时,只有used bit才会置为 1;二次机会法可以尽可能地保留被频繁写入的页面;

2-6--最不常用算法

        最不常用算法(Least Frequently Used,LFU)在缺页中断发生时,会选择访问次数最少的页面进行换出,其通过对每一个页面设置一个访问计数器;当一个页面被访问时,该页面的访问计数器会加1;当发生缺页中断时,会替换计数值最小的那个页面;

        最不常用算法可能存在的问题是:一个页面在进程开始之初被频繁使用,在之后的程序中不被使用,但其访问计数值极大;解决这个问题的一个方法是:定时地把访问计数器的寄存器右移一位,以减少时间的影响;

2-7--Belady现象

        在采用 FIFO 算法时,随着分配物理页面的增加,有时会出现缺页率反而提高的异常现象;正常来说,随着分配物理页面的增加,缺页率应当是降低的;

2-8--LRU、FIFO和Clock算法的比较

        LRU 算法和 FIFO 算法本质上都是先进先出的思路,LRU 算法针对的是页面最近访问时间进行排序(每次访问页面都会动态调整页面的先后顺序),而 FIFO 算法针对页面进入内存的时间进行排序,其先后顺序是固定的;当一个页面进入内存后没有被访问,则其最近访问时间与进入内存时间相等;当内存中所有的页面均未被访问时,LRU 算法会退化为 FIFO 算法;

        LRU 算法性能较好,但系统的开销较大;FIFO 算法系统开销较小,但可能会发生Belady 现象;因此折衷的算法是 Clock 算法;

3--工作集和常驻集模型

        各种页面置换算法起作用的前提是:程序的局部性原理;

        ​​​​​​​工作集:一个进程当前正在使用的逻辑页面集合;

        常驻集:当前时刻进程实际驻留在内存当中的页面集合;

4--全局置换算法

4-1--工作集页面置换算法

        工作集页面置换算法:随着程序的执行,工作集窗口不断移动;当一个页不处于工作集窗口时,会把该页从内存中换出;

        并不是只在发生缺页中断时,工作集页面置换算法才会把页换出至外存中;

        工作集页面置换算法可以有效保留最近访问的页,提前换出内存中的物理页,可以为其它程序提供更多的内存空间,从而达到动态分配内存空间的目的;但工作集页面置换算法会增加缺页中断;

4-2--缺页率页面置换算法

        缺页率页面置换算法的工作集窗口是变化的,当缺页率增加时会增大工作集窗口,将更多的页面保留在内存中(更多的页面在窗口内,则页面不会被换出);当缺页率减小时说明提供的物理页面数充足,可以适当减小工作集窗口;

        ​​​​​​​缺页率 = 缺页次数 / 内存访问次数

4-3--抖动问题

        当分配给一个进程的物理页面太少时,进程会出现许多缺页中断,操作系统需要频繁地在内存和外存之间换入换出替换页面,导致程序的执行停顿,进程的运行速度缓慢,这种状态称为抖动;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值