操作系统虚拟内存中的四种典型页替换算法(OPT,LRU,FIFO,Clock)

由于程序可能会远大于内存,需要引入虚拟内存。基本思想是:每个程序都拥有自己的地址空间,这个空间被分割成很多块,每一块称作为一个页面,每一页有连续的地址范围,这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射,而当程序引用到一部分不在内存的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。如果一个页面没有映射,内存管理单元注意到它没有映射时,使CPU陷入到操作系统,这个陷阱称为缺页中断。

【转载】关于操作系统页面替换算法http://blog.csdn.NET/wanghao109/article/details/13003479

页面置换:在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断(page
fault)。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。

典型的置换算法有四种,如下所示:

OPT:最佳替换算法(optional replacement)。替换下次访问距当前时间最长的页。opt算法需要知道操作系统将来的事件,显然不可能实现,只作为一种衡量其他算法的标准。

分析:(F表示页帧最初填满时出现page fault)

a.需要页面2,内存中还有空闲位置,直接加入页面2

b.需要页面3,内存中还有空闲位置,直接加入页面3

c.需要页面2,内存中已经存在页面2,不加入任何页面

d.需要页面1,内存中还有空闲位置,直接加入页面1

e.需要页面5,页面2距离下次访问之间的距离为1,页面3距离下次访问距离为3,页面1没有下次访问(距离为无穷             大),所以替换掉页面1

f.需要页面2,内存中已经存在页面2,不加入任何页面

g.需要页面4,页面2,3,5距离下次访问的距离依次是3,2,1,所以替换掉页面2

h.需要页面5,内存中存在页面5,不改变

i.需要页面3,内存中存在页面3,不改变

j.需要页面2,页面4,3,5距离下次访问的距离依次是无穷大,无穷大,1,此时按照先后顺序替换掉页面4

k.需要页面5,内存中存在页面5,不改变

L.需要页面2,内存中存在页面2,不改变

LRU:最近最少使用(Least Recently Used).替换上次使用距离当前最远的页。根据局部性原理:替换最近最不可能 访问到的页。性能最接近OPT,但难以实现。可以维护一个关于访问页的栈或者给每个页添加最后访问的时间标签,但开销都很大。

分析:(F表示页帧最初填满时出现page fault)

a.需要页面2,内存中还有空闲位置,直接加入页面2

b.需要页面3,内存中还有空闲位置,直接加入页面3

c.需要页面2,内存中已经存在页面2,不加入任何页面,这里重置了2的最近历史访问记录

d.需要页面1,内存中还有空闲位置,直接加入页面1

e.需要页面5,页面2,3,1距离最近一次历史访问的距离依次为2,3,1(步骤c中重置了2的访问记录).所以替换掉页        面3.

f.需要页面2,内存中已经存在页面2,不加入任何页面,重置页面2的访问记录

g.需要页面4,页面2,5,1距离最近一次历史访问的距离依次是1,2,3,所以替换掉页面1

h.需要页面5,内存中存在页面5,不改变,重置页面5的访问记录

i.需要页面3,页面2,5,4距离最近一次历史访问的距离依次为3,1,2,所以替换掉页面2

j.需要页面2,页面3,5,4距离最近一次历史访问的距离依次为1,2,3,所以替换掉页面4

k.需要页面5,内存中存在页面5,不改变

L.需要页面2,内存中存在页面2,不改变

FIFO:先进先出(First In First Out),将页面看做一个循环缓冲区,按循环方式替换。这是实现最为简单的算法,隐含的逻辑是替换驻留在内存时间最长的页。但由于一部分程序或数据在整个程序的生命周期中使用频率很高,所以会导致反复的换入换出。

分析:

策略极为简单,如果内存中有空闲位置,则直接替换。否则,可以先想象有一个指针,开始指向第一个位置,没发生替换则指针位置不变,每次需要替换时替换指针所指的位置,然后将指针向后移动一位(若指针位于最后,则移动到内存第一个位置)。

Clock:时钟替换算法(Clock),给每个页帧关联一个使用位。当该页第一次装入内存或者被重新访问到时,将使用位置为1。每次需要替换时,查找使用位被置为0的第一个帧进行替换。在扫描过程中,如果碰到使用位为1的帧,将使用位置为0,在继续扫描。如果所谓帧的使用位都为0,则替换第一个帧。

分析:(表示说明:页面:“2(1)”表示页面2的使用位为1。"p(n)"表示扫描指针指向第n个的位置)

首先扫描指针p指向第一个帧位置p(1),每次发生替换(或者内存中有空闲位置时进行的替换),指针加1。

a.需要页面2,内存中还有空闲位置,直接加入页面2,得到2(1),p(2).

b.需要页面3,内存中还有空闲位置,直接加入页面3,得到2(1),3(1),p(3).

c.需要页面2,内存中已经存在页面2,不加入任何页面,且这不是页面2的第一次放置,得到2(1),3(1),p(3).

d.需要页面1,直接加入页面1,得到2(1),3(1),1(1),p(1)

e.需要页面5,第一轮扫描将2,3,1的使用位都置为0,然后替换掉页面2,得到5(1),3(0),1(0),p(2)

f.需要页面2,扫描到页面3的使用位为0,所以替换页面3,得到5(1),2(1),1(0),p(3)

g.需要页面4,扫描到页面1的使用位为0,所以替换页面1,得到5(1),2(1),4(1),p(1)

h.需要页面5,内存中存在页面5,不改变,得到5(1),2(1),4(1),p(1)

i.需要页面3,第一轮扫描将5,2,4的使用位都置为0,然后替换到页面5,得到3(1),2(0),4(0),p(2)

j.需要页面2,扫描到页面2的使用位为0,由于2被重新访问,所以将2的使用位置为1,得到3(1),2(1),4(0),p(2),注       意此时由于未发生页错误,p指针不加1.只是重置了使用位(记住:每次新加入的页使用位都为1)

k.需要页面5,第一轮扫描将2的使用位置为0,替换掉页面4,得到3(1),2(0),5(1),p(1)

L.需要页面2,重置页面2的使用位为1,指针p不变,得到3(1),2(1),5(1),p(1)

总结:

1.内存中不存在页面n,而内存中有空闲位置时,直接加入页面n(1),p加1

2.内存中不存在页面n,且内存中没有空闲位置时,发生替换n(1), p加1

3.内存中存在页面n,,p不变,将页面n重置为n(1)(不管页面n之前使用位为1或0)

改进后的时钟算法:设置使用位u,修改位m

1.最近未被访问,未被修改(u=0,m=0)

2.最近被访问,未被修改(u=1,m=0)

3.最近未被访问,被修改(u=0,m=1)

4.最近被访问,被修改(u=1,m=1)

a.从指针当前位置开始扫描,不修改使用位,对找到的第一个(u=0,m=0)进行替换

b.如果a失败,找到第一个(u=0,m=1)进行替换,扫描过程中,将使用位u置为0

c,如果b失败,此时指针回到起始位置,且所有帧的使用位为0,重复步骤a,如果有必要,重复步骤b,直到找到为止

时间: 2024-10-10 01:28:10

操作系统虚拟内存中的四种典型页替换算法(OPT,LRU,FIFO,Clock)的相关文章

操作系统页面置换算法(opt,lru,fifo,clock)实现

#include <iostream> #include<map> #include<set> #include <algorithm> #include<cstdio> #include<cstring> #include<cmath> #define N 200 using namespace std; int page[N];//页面引用号 int block[N];//物理块,内存 int dist[N][N];/

Activity中的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Android总Activity的启动模式分为四种: [html] view plaincopy Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standard" 

C++中的四种转型操作符

在详细介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点: ①它几乎允许将任何类型转换为任何其他类型,这是十分拙劣的.如果每次转型都能够更精确地指明意图,则更好. ②旧式转型难以辨识.旧式转型的语法结构是由一对小括号加上一个对象名称组成,而小括号和对象名称在C++的任何地方都有可能被使用. 为解决C旧式转型的缺点,C++导入了4个新的转型操作符:static_cast.const_cast.dynamic_cast.reinterpret_cast.下面我来一一分析这四种转型操作符.

JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用)的作用.同时我们还将介绍ReferenceQueue和WeakHashMap的功能和使用示例. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. JAVA中的四种引用 四种引用中,软引用.若引用.虚引用都需要相关类来创建.创建的时候

Hibernate的四种典型例子(增删改查)

Hibernate的四种典型例子(增删改查)  //查询  // Session session=HibernateSessionFactory.getSession();  // session.beginTransaction();  // Query q=session.createQuery("from Info where id=:id");  // q.setInteger("id", 1);  // List l=q.list();  // Info

java中的四种单例实现方式

在java中,单例设计模式是非常常见的设计模式,对单例设计模式的概念,不做过多的介绍,下面将逐一介绍四种单例设计模式: 1.第一种单例设计模式 1.1 代码实现 package com.singleton.one; /**  * 第一种单例设计模式  * @author Administrator  *  */ public class SingleTonOne { // 实例化 private static SingleTonOne instance = new SingleTonOne();

对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

对称加密和分组加密中的四种模式(ECB.CBC.CFB.OFB) 一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码:   四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1.简单: 2.有利于并行计算: 3.误差不会被传送: 缺点: 1.不能隐藏明文的模式: 2.可能对明文进行主动攻击: 3.2 CBC模式: 优点: 1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL.IPSec的标准.

Spring(七)Spring中的四种增强和顾问

Spring中的四种增强有那四种? 前置增强    后置增强  环绕增强  异常增强 先编写接口和实体类  ISomeService和SomeServiceImpl package demo10; /** * Created by mycom on 2018/3/8. */ public interface ISomeService { public void doSome(); } package demo10; /** * Created by mycom on 2018/3/8. */ p

MySQL数据库中的四种隔离级别

原文:MySQL数据库中的四种隔离级别 事务的隔离性比想象的要复杂,在 SQL 标准中定义了四种级别的隔离级别.通常而言,较低级别的隔离通常可以执行更高的并发,系统的开销也更低 READ UNCOMMITTED 该级别为未提交读.在该级别中,事务中的修改即使没有提交,对其他事务也都是可见的.事务可以读取未提交的数据,这也被称为脏读.这个级别会导致很多的问题,从性能上来说,它不会比其他级别好太多,但缺乏其他级别的很多好处.除非真的有非常必要的理由,在实际应用中一般很少使用. READ COMMIT