通过代码实例了解页面置换算法原理

作者:七月在野,八月在宇 时间:2024-01-24 21:26:23 

页面置换算法:本质是为了让有限内存能满足无线进程。

先说明一下处理缺页错误的过程:

分页硬件在通过页表转换地址时会注意到无效位被设置,从而陷入操作系统,这种陷阱是因为操作系统未能将所需要的页面调入内存引起的。

处理缺页错误:

1、检查这个进程的内部表,确定该引用是否为有效的内存访问(可以理解为这个内存能被当前进程使用),如果无效那么直接终止进程;如果有效但是尚未调入页面,就将该页面调入内存。

2、然后从空闲帧链表上找到一个空闲帧。

3、调度磁盘将进程所需要的内存读入页帧中,

4、磁盘读取完成,修改页表,使空闲帧对应到该页号上。并且修改页表有效-无效位 为有效。

注意页表中的一些标志位:

修改位:如果有效为位1,表明被修改,那么替换页面时需要将内存写入磁盘中;如果为0,表明未被修改,那么使用页面替换算法直接释放

保护位:可以标记为只读,写。

有效-无效位:i:表示逻辑页号不对应物理页帧,为V表示有对应的物理页帧

页面替换算法:

FIFO:算法

操作系统总时替换出在内存中停留时间最久的页面,可以用一个指针来指向这个位置(开销很小,可以使用一个队列来实现,每次缺页时移出末尾的页面,再队列头添加新的页面,未发生缺页错误就不需要对队列进行操作)

LRU算法:操作系统总时替换在内存中最久没有使用的页面:我么可以使用链表来实现这个算法,表头表示的是最近被使用的页面,表尾表示最久没被使用的页面,每一次不管是否发生缺页,都需要对这个链表进行从新增删改查,来保证每一次的链表都是我们需要的(开销太大)

近似LRU算法:我们在页表中添加一个引用位clock,当clock为1时,不能移出,当clock为0时,表明可以移除


procedure t: {
 指针p:指向当前的页面
 p = 0;//指向初始位置
 boolean :标志位clock
 进程包含的所有页面组成的循环链表:linklist//当进程在运行时,链表存在,进程结束时,链表也消失
 while(进程运行){

if(p.clock == 1){
     p.clock = 0;
     p++;//指针指向下一个
   }
   if(p.clock == 0){
     删除p指向的页面并且在p处添加新的页面;
     p.clock = 1;
     p++;
   }
 }
}

近似LRU增强算法:将修改位和引用位合起来作为是否替换条件:当(修改位,引用位) = (0,0)时表明可以替换


procedure t: {
 指针p:指向当前的页面
 p = 0;//指向初始位置
 boolean :标志位clock
 boolean : 修改位m
 进程包含的所有页面组成的循环链表:linklist//当进程在运行时,链表存在,进程结束时,链表也消失
 while(进程运行){

if(p.(clock,m) == (0,0)){

删除p指向的页面并且在p处添加新的页面;
     p.(clock,m) = (1,0);
     p++;
   }
   if(p.(clock,m) == (0,1)){

p.(clock,m) = (0,0);
     p++;
   }
   if(p.(clock,m) == (1,0)){

p.(clock,m) = (0,0);
     p++;
   }
   if(p.(clock,m) == (1,1)){

p.(clock,m) = (0,1);
     p++;
   }
   if(修改页面){
     p.(clock,m) = (1,1);
     p++
   }
   if(读页面){
     p.(clock,m) = (1,0);
     p++;
   }
 }
}

页面缓冲算法:操作做系统保留一个空闲帧池。

当发生缺页错误时,所需要的页面就读取空闲帧,并且将替换的牺牲帧放入缓冲池,在调页空闲时期将缓冲池中的牺牲帧中的内容写入(如果页表上的修改位为1)磁盘中(减少了操作系统的调页时直接访问磁盘的过程,提高了调页效率).

第二种方法:将牺牲帧中的内容写入磁盘,但是不释放帧中的内容,因为进程有可能调用之前的页,这样就将缓冲池中的帧直接写入内存,减少了(从磁盘读取数据的操作)。

以上均为局部页面置换算法,都是在单个进程内部进行的页面替换操作,但是操作系统在运行过程中不同的进程可以并行并发执行,这样对页面的替换就不会仅仅局限于单个进程中

下面我们学习全局置换算法:我们规定一个工作集和一个常驻集。工作集表明当前程序需要访问的Δ个页面,常驻集表明操作系统正在使用的页面。

工作集:WS(Δ,t) = {}工作集不断移动,操作系统替换出不在工作集中的页面

通过代码实例了解页面置换算法原理

动态工作集页面替换算法:如下图,我们规定一个阈值windows size = 2,我们使用两次缺页中断的差值(表明两次中断之间有多少次没有中断)和阈值比较,如果比阈值大,那么将不再当前工作集的页面换出,并且重置工作集的大小,如果比阈值小,那么将缺的页换入工作集并且重置工作集的大小。

通过代码实例了解页面置换算法原理

来源:https://www.cnblogs.com/guosai1500581464/p/13112045.html

标签:页面,置换,算法
0
投稿

猜你喜欢

  • Web标准基础教程:CSS简写指南

    2010-04-02 12:47:00
  • 分享下GET和POST的真正区别

    2023-10-19 23:23:09
  • python实现简易猜数小游戏

    2022-08-08 09:51:55
  • 结合Python的SimpleHTTPServer源码来解析socket通信

    2021-09-05 23:30:27
  • PHP无限分类代码,支持数组格式化、直接输出菜单两种方式

    2024-05-13 09:24:51
  • c#连接sqlserver数据库、插入数据、从数据库获取时间示例

    2024-01-16 02:13:53
  • Python爬虫beautifulsoup4常用的解析方法总结

    2022-09-01 11:58:54
  • pytorch--之halfTensor的使用详解

    2021-08-18 14:44:08
  • Python3 json模块之编码解码方法讲解

    2021-07-15 17:29:15
  • CSS中expression的用法

    2008-09-11 14:18:00
  • Python 爬虫的原理

    2023-01-18 21:05:35
  • 全面解析JavaScript中“&&”和“||”操作符(总结篇)

    2024-04-10 16:16:28
  • Python装饰器decorator用法实例

    2023-02-06 23:26:43
  • MySQL Limit执行过程分析探索

    2024-01-14 05:44:31
  • 高效的MySQL分页

    2011-01-04 20:01:00
  • SQL Server 2005中插入XML数据方法

    2008-05-26 11:56:00
  • 教你利用python实现企业微信发送消息

    2023-09-06 11:20:55
  • vue eslint报错error "Component name "*****" should always be multi-word"解决

    2024-05-13 09:10:32
  • 详解vue项目中调用百度地图API使用方法

    2024-05-09 09:38:29
  • MySQL 逻辑备份与恢复测试的相关总结

    2024-01-19 14:19:20
  • asp之家 网络编程 m.aspxhome.com