实验4 页面置换算法
页面置换算法实验报告

页面置换算法实验报告
一、实验内容
本次实验主要围绕页面置换算法进行,以实验课本的实例介绍,采用FIFO页面置换算法对后面提到的参数进行置换,最终得出页面置换的结果和比较所得结果。
二、实验步骤
(一) 熟悉FIFO算法
首先是要了解FIFO页面置换算法,FIFO全称(First In First Out),按页面进入内存的顺序来替换相应内存页面,先进先出,将先进入内存的页面先替换出去。
(二) 阅读实验课本
在阅读实验课本之前要先熟悉实验书上所介绍的FIFO算法,然后在实验书上找出需要做的实验,并对实验环境和表格进行观察,掌握实验的基本内容。
(三) 开始页面置换
在开始实验之前,熟悉实验环境,根据实验书上的参数,首先模拟进程分配内存,根据FIFO算法去进行计算,根据上表中的参数去比较,最后得出最终结果。
(四) 在本次实验的补充
这次实验中,可以把FIFO的概念应用到实际应用中,也可以模拟不同情况,例如改变页面的大小,观察不同页面置换算法的结果,实验出最合适的结果。
三、实验结论
本次实验是为了了解FIFO页面置换算法,实验出最终的结果,最后得出页面置换的结果及比较结果。
页面置换算法实验(内含完整代码)

实验二存储管理一、实验目的通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
二、实验内容基于一个虚拟存储区和内存工作区,设计下述算法并计算访问命中率。
1、最佳淘汰算法(OPT)2、先进先出的算法(FIFO)3、最近最久未使用算法(LRU)4、简单时钟(钟表)算法(CLOCK)命中率=1-页面失效次数/页地址流(序列)长度三、实验原理简述UNIX中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。
当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。
这种页面调入方式叫请求调页。
为实现请求调页,核心配置了四种数据结构:页表、页帧(框)号、访问位、修改位、有效位、保护位等。
当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。
如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。
利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。
整个页面的调入过程对用户是透明的。
四、算法描述本实验的程序设计基本上按照实验内容进行。
即使用srand( )和rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
(1)通过随机数产生一个指令序列,共320条指令。
指令的地址按下述原则生成:A:50%的指令是顺序执行的B:25%的指令是均匀分布在前地址部分C:25%的指令是均匀分布在后地址部分具体的实施方法是:A:在[0,319]的指令地址之间随机选取一起点mB:顺序执行一条指令,即执行地址为m+1的指令C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’D:顺序执行一条指令,其地址为m’+1E:在后地址[m’+2,319]中随机选取一条指令并执行F:重复步骤A-E,直到320次指令(2)将指令序列变换为页地址流设:页面大小为1K;用户内存(页帧)容量为4页~32页;用户虚存容量为32K。
页面置换算法 实验报告(DOC)

综合性实验报告一、实验目的1.学习常见的4种页面置换算法:最佳置换算法(OPT),先进先出页面置换算法(FIFO),最近最久未使用页面算法(LRU),最少使用置换算法(LFU)。
2.编写函数并计算输出上述各种算法的命中率。
二、总体设计(设计原理、设计方案及流程等)设计原理:OPT页面置换算法OPT所选择被淘汰的页面是已调入内存,且在以后永不使用的,或是在最长时间内不再被访问的页面。
因此如何找出这样的页面是该算法的关键。
可为每个页面设置一个步长变量,其初值为一足够大的数,对于不在内存的页面,将其值重置为零,对于位于内存的页面,其值重置为当前访问页面与之后首次出现该页面时两者之间的距离,因此该值越大表示该页是在最长时间内不再被访问的页面,可以选择其作为换出页面。
FIFO页面置换算法FIFO总是选择最先进入内存的页面予以淘汰,因此可设置一个先进先出的忙页帧队列,新调入内存的页面挂在该队列的尾部,而当无空闲页帧时,可从该队列首部取下一个页帧作为空闲页帧,进而调入所需页面。
LRU页面置换算法LRU是根据页面调入内存后的使用情况进行决策的,它利用“最近的过去”作为“最近的将来”的近似,选择最近最久未使用的页面予以淘汰。
该算法主要借助于页面结构中的访问时间time来实现,time记录了一个页面上次的访问时间,因此,当须淘汰一个页面时,选择处于内存的页面中其time值最小的页面,即最近最久未使用的页面予以淘汰。
LFU页面置换算法LFU要求为每个页面配置一个计数器(即页面结构中的counter),一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘汰。
设计流程:1.通过随机数产生一个指令序列,共320条指令。
2.指令序列变换成页地址流3.计算并输出下述各种算法在不同内存容量下的命中率。
4.在主函数中生成要求的指令序列,并将其转换成页地址流;在不同的内存容量下调用上述函数使其计算并输出相应的命中率。
【精品】页面置换算法实验报告

【精品】页面置换算法实验报告一、实验目的了解操作系统中的页面置换算法,并实现FIFO、LRU和Clock算法。
二、实验原理页面置换算法是操作系统中用到的一种算法,其作用是在内存不够用时,选择牺牲已经在内存中的一些页,腾出更多的空间给新的内容。
本次实验主要实现了FIFO、LRU和Clock算法。
1、FIFO算法FIFO算法是最简单的页面置换算法,它采用先进先出的原则,即最先进入内存的页面应该最早被替换出去。
该算法的实现非常简单,只需要维护一个队列即可。
当需要置换页面时,选择队列的第一个页面进行替换即可。
2、LRU算法LRU算法是Least Recently Used的缩写,即最近最少使用算法。
该算法的核心思想是选择最久没有被使用的页面进行替换。
为了实现该算法,需要维护记录页面使用时间的链表、栈或队列等结构。
3、Clock算法Clock算法也叫做二次机会算法,是一种改良的FIFO算法。
它是基于FIFO算法的思想,并且每个页面都设置了一个使用位(use bit),用于记录该页面是否被使用过。
当需要置换一个页面时,检查该页面的使用位,如果该页面的使用位为1,则将该页面的使用位设置为0并移到队列的末尾,表示该页面有“二次机会”继续待在内存中;如果该页面的使用位为0,则选择该页面进行替换。
三、实验过程本次实验采用Python语言实现页面置换算法,并使用样例进行测试。
1、FIFO算法实现FIFO算法的实现非常简单,只需要用一个队列来维护已经在内存中的页面,当需要置换页面时,选择队列的第一个元素即可。
代码如下:```pythonfrom collections import dequeclass FIFO:def __init__(self, frame_num):self.frame_num = frame_numself.frames = deque(maxlen=frame_num)def access(self, page):if page in self.frames:return Falseif len(self.frames) >= self.frame_num:self.frames.popleft()self.frames.append(page)return True```2、LRU算法实现LRU算法的实现需要维护一个记录页面使用时间的链表或队列。
页面置换算法实验报告

页面置换算法实验报告页面置换算法实验报告一、实验目得: 设计与实现最佳置换算法、随机置换算法、先进先出置换算法、最近最久未使用置换算法、简单 Clock 置换算法及改进型 Clock 置换算法;通过支持页面访问序列随机发生实现有关算法得测试及性能比较、二、实验内容: 虚拟内存页面总数为 N,页号从 0 到N—1 物理内存由 M 个物理块组成页面访问序列串就是一个整数序列,整数得取值范围为 0 到 N - 1、页面访问序列串中得每个元素 p 表示对页面 p 得一次访问页表用整数数组或结构数组来表示符合局部访问特性得随机生成算法 1.确定虚拟内存得尺寸N,工作集得起始位置 p,工作集中包含得页数e,工作集移动率m(每处理 m 个页面访问则将起始位置 p +1),以及一个范围在 0 与1之间得值 t; 2.生成m个取值范围在 p与p + e 间得随机数,并记录到页面访问序列串中; 3.生成一个随机数 r,0 ≤ r ≤ 1; 4.如果 r 〈 t,则为 p 生成一个新值,否则 p = (p +1) mod N; 5.如果想继续加大页面访问序列串得长度,请返回第 2 步,否则结束。
三、实验环境: 操作系统:Windows 7 软件:VC++6.0四、实验设计: 本实验包含六种算法,基本内容相差不太,在实现方面并没有用统一得数据结构实现,而就是根据不同算法得特点用不同得数据结构来实现: 1、最佳置换与随机置换所需操作不多,用整数数组模拟内存实现; 2、先进先出置换与最近最久未使用置换具有队列得特性,故用队列模拟内存来实现; 3、CLOCK 置换与改进得 CLOCK置换具有循环队列得特性,故用循环队列模拟内存实现; 4、所有算法都就是采用整数数组来模拟页面访问序列。
五、数据结构设计://页面访问序列数组: intref[ref_size]; //内存数组: int phy[phy_size]; //队列数据结构定义: typedef struct QNode// 构结据数列队义定ﻩ{;atad tniﻩ struct QNode _ne_t; }QNode,_QueuePtr; typedef struct {QueuePtr front; ﻩ//头指针ﻩ //尾指针}LinkQueue; //定;raer rtPeueuQﻩ义链表数据结构 typedef struct LNode //定义循环链表数据结构{int data;int flag; ﻩ//访问位int modify; ﻩ // 位改修ﻩ ;t_en*edoNL tcurtsﻩ}LNode,*LinkList; 六、主要函数说明:1、 void set_rand_num// ;列数机随得性特部局有具生产ﻩ2、 int E_change_LNode(LinkList &;L,int e,int i)//将链表L中序号为 i 得结点替换为内容为 e 得结点;3、bool Search_LinkList(LinkList &L,int e,int&;i)//找到链表L中内容为e得结点,并用 i 返回其位置,i=1 表示第一个非头结点,依次类推;4、 void Search_LL_Flag(LinkList&L,int &i)//用 i 返回第一个 flag 为 0 得结点得位置,i=1 表示第一个非头结点,以此类推;5、 void Set_LL_Flag(LinkList &;L,int i) //设置链表L中得序号为i得结点得flag标志为 1;6、 int Search_LL_ModifyClock(LinkList &L,int &;modify_num)//找到改进得 CLOCK算法所需要淘汰得页,用modify_num 返回其位置; 此函数根据书上给得思路,第一遍扫描A=0且 M=0得页面予以淘汰,若失败,则进行第二轮扫描 A=0且 M=1得页面,第二轮扫描时将所有访问过得页面得访问位A置 0;若失败则重复上述两部;7、void Set_LL_modify(LinkList &L,int i) //设置链表 L 中得序号为 i得结点得modify 标志为 1; 8、bool SearchQueue(LinkQueue &Q,int e,int &i)//点结中Q列队找寻ﻩdata 域等于e得结点,并用 i 返回其在 Q 中得位置; 9、int getnum(int a,int b) ﻩﻩ //用b返回元素a在被引用数列中得下一个位置 10、void ORA //实现最佳置换算法,包括判断页面就是否在内存中、页面进内存、输出内存状态等内容; 11、void RANDﻩ//随机置换算法 12、void FIFO //ﻩ法算出先进先ﻩ13、void LRUﻩﻩ //最近最久未使用算法实现最近最久未使用算法得思想就是:判断待进入内存得页面,如果与内存中得第一个页面相同,则将它移到最后一个,即标志为最近使用得页;如果与内存中得第二个页面相同,则将它删除,并在队列尾部添加相同元素,即标志为最近使用得页; 、41/)(KCOLC diovﻩ/法算 KCOLC 现15、void Modified_Clock //实现改进得 CLOCK 实ﻩﻩ算法 16、intmain//主函数,调用实现各算法得6个主要函数,并输出各算法得缺页率。
操作系统实验 页面置换算法模拟

实验四页面置换算法模拟一、实验内容简要描述开发语言及实现平台或实验环境C++/JA V ATurbo C / Microsoft Visual Studio 6.0 / Microsoft Visual Studio .NET 2010实验目的(1)了解内存分页管理策略(2)掌握调页策略(3)掌握一般常用的调度算法(4)学会各种存储分配算法的实现方法。
(5)了解页面大小和内存实际容量对命中率的影响。
【实验内容】编程实现页面置换算法,最少实现两种算法,比较算法的优劣,并将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。
【实验要求】(1)采用页式分配存储方案,通过分别计算不同算法的命中率来比较算法的优劣,同时也考虑页面大小及内存实际容量对命中率的影响;(2)实现OPT 算法(最优置换算法) 、LRU 算法(Least Recently) 、FIFO 算法(First IN First Out)的模拟;(3)使用某种编程语言模拟页面置换算法。
二、报告主要内容1.设计思路A、设计页面走向、物理块数等初值。
B、编制程序,使用多种算法实现页面置换。
C、计算和比较缺页率。
最佳置换算法OPT(Optimal)它是由Belady于1966年提出的一种理论上的算法。
其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。
采用最佳置换算法,通常可保证获得最低的缺页率。
但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但是可以利用此算法来评价其它算法。
如果编写程序模拟该算法,可以提前设定页面访问次序,获知某个页面是否在未来不再被访问。
2.画流程图3.实验结果(输入、输出截图)程序运行结果4.主要代码#include "stdio.h"#include "stdlib.h"#include "math.h"#include "conio.h"#include "time.h"#define TRUE 1#define FALSE 0#define NULL 0#define total_instruction 20#define total_vp 10typedef struct{ int pn,pfn;}pv_type;pv_type pv[10];typedef struct pf_struct{ int pn,pfn;struct pf_struct *next;}pf_type;pf_type pf[20],*free_head,*busy_head,*busy_tail,*q; int page[total_instruction];int total_pf;int count;void initialiaze(){ int i;count=0;for(i=0;i<total_vp;i++){ pv[i].pn=i;pv[i].pfn=-1;}printf("请输入实页数目:");scanf("%d",&total_pf);for(i=0;i<=total_pf-1;i++){ pf[i].next=&pf[i+1];pf[i].pfn=i+1;pf[i].pn=-1;}pf[total_pf-1].next=NULL;free_head=&pf[0];printf("随机产生的页地址流为:\n");for(i=0;i<total_instruction;i++){ page[i]=rand()%10;printf("%2d",page[i]);}}void FIFO(){ int i,j;pf_type *p;q=busy_head=busy_tail=NULL;for(i=0;i<=total_instruction-1;i++){ printf("\n第%d次执行:",i+1);if(pv[page[i]].pfn==-1){ count+=1;printf("缺页,缺页次数count=%d,",count);if(free_head==NULL){printf("实页%d中的页面%d将被置换出去",busy_head->pfn,busy_head->pn);p=busy_head->next;pv[busy_head->pn].pfn=-1;free_head=busy_head;free_head->next=NULL;busy_head=p;}p=free_head->next;free_head->next=NULL;free_head->pn=page[i];pv[page[i]].pfn=free_head->pn;if(busy_tail==NULL)busy_head=busy_tail=free_head;else{ busy_tail->next=free_head;busy_tail=free_head;}free_head=p;}else printf("命中,缺页次数不变,仍为count=%d",count);printf("\npfn pn");for(j=0;j<=total_pf-1;j++){if(pf[j].pn!=-1)printf("\n%d%8d",pf[j].pfn,pf[j].pn);}}printf("\n先进先出算法的命中率为:%6.4f\n缺页总次数为%d\n",1-(float)count/20,count);}void main(){srand((unsigned)time(NULL));initialiaze();FIFO();三、实验心得(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验的体会及收获、对做好今后实验提出建设性建议等。
实验四页面置换算法代码

实验四页面置换算法模拟(2)一.题目要求:设计一个虚拟存储区和内存工作区,编程序演示下述算法的具体实现过程,并计算访问命中率:要求设计主界面以灵活选择某算法,且以下算法都要实现1)最佳置换算法(OPT):将以后永不使用的或许是在最长(未来)时间内不再被访问的页面换出。
2)先进先出算法(FIFO):淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
3)最近最久未使用算法(LRU):淘汰最近最久未被使用的页面。
4)最不经常使用算法(LFU).实验目的:1、用C语言编写OPT、FIFO、LRU,LFU四种置换算法2、熟悉内存分页管理策略。
3、了解页面置换的算法。
4、掌握一般常用的调度算法。
5、根据方案使算法得以模拟实现。
6、锻炼知识的运用能力和实践能力。
三.相关知识:1 .虚拟存储器的引入:局部性原理:程序在执行时在一较短时间内仅限于某个部分;相应的,它所访问的存储空间也局限于某个区域,它主要表现在以下两个方面:时间局限性和空间局限性。
2 .虚拟存储器的定义:虚拟存储器是只具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。
3 .虚拟存储器的实现方式:分页请求系统,它是在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页面形式虚拟存储系统。
请求分段系统,它是在分段系统的基础上,增加了请求调段及分段置换功能后,所形成的段式虚拟存储系统。
4 .页面分配:平均分配算法,是将系统中所有可供分配的物理块,平均分配给各个进程。
按比例分配算法,根据进程的大小按比例分配物理块。
考虑优先的分配算法,把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据个进程的优先权,适当的增加其相应份额后,分配给各进程。
5 .页面置换算法:常用的页面置换算法有OPT、FIFO、LRU、Clock、LFU、PBA等。
四.设计思想:选择置换算法,先输入所有页面号,为系统分配物理块,依次进行置换:OPT基本思想:是用一维数组page[pSIZE]存储页面号序列,memery[mSIZE]是存储装入物理块中的页面。
实验4 页面置换算法

实验4 页面置换算法1.实验目的:通过请求页式存储管理中页面置换算法的模拟设计,培养存储管理相关算法的实现能力。
2.实验要求:要求掌握页面置换算法、缺页中断、缺页率、命中率、Belady奇异现象等请求分页虚拟存储管理的概念。
要求了解不同页面置换算法的性能。
掌握FIFO、OPT、LRU页面置换算法的实现方法。
3.实验环境:硬件平台:个人计算机:Intel Pentium 4 CPU 1.2GHz,512MB RAM;软件:WindowsXP操作系统;Microsoft Visual C++6.0或以上版。
4.实验内容及步骤:使用FIFO算法、OPT算法、LRU算法之一设计程序,模拟请求页式虚拟存储管理中页面置换过程,计算访问命中率。
学习预备知识。
编写程序。
编辑、编译、运行和调试程序。
(4) 记录程序运行结果。
(5) 分析结果并总结。
5.代码实现-- LRU算法#include <stdio.h>int num,sum;int a[100],b[3],c[3];void fun(int a[]){int i,j,k,r;sum=0;b[0]=a[0],b[1]=a[1],b[2]=a[2];for(i=2;i<=3;i++)printf("分配给进程 %d 页帧缺页数:%d 缺页率:%.3lf\n",i,num-i,(double)(num-i)/num);for(i=3;i<num;i++){if(a[i]==b[0]||a[i]==b[1]||a[i]==b[2])sum++;else{int p=0;for(j=0;j<3;j++)c[j]=0;for(j=i-1;j>=0;j--){for(k=0;k<3;k++){if(a[j]==b[k]){if(c[k]!=1){c[k]=1;p++;}}}if(p==2)break;}for(r=0;r<3;r++)if(c[r]==0)b[r]=a[i];}printf("分配给进程 %d 页帧缺页数:%d 缺页率:%.3lf\n",i+1,num-sum,(double)(num-sum)/num);}printf("\n");printf("此访问串缺页数:%d\n",num-sum);printf("此访问串缺页率:%.3lf\n",(double)(num-sum)/num); }int main(){int i;printf(" 请输入访问串的个数:\n"); scanf("%d",&num);printf(" 请输入访问串:\n");for(i=0;i<num;i++)scanf("%d",&a[i]);printf("\n LRU算法 \n\n");fun(a);return 0; }6.实验结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验4 页面置换算法(2学时)
一、实验目的
通过实验加强对虚拟存储管理中页面置换算法的理解和掌握。
二、实验内容
编写程序实现虚拟存储管理中OPT,FIFO,LRU页面置换算法。
三、实验要求
1、任意给出一组页面访问顺序(如页面走向是1、
2、5、7、5、7、1、4、
3、5、6、
4、3、2、1、
5、2)。
2、分配给该作业一定的物理块(如3块、4块等)。
3、利用OPT,FIFO,LRU页面置换算法模拟页面置换过程并计算其缺页率。
4、每访问一个页面均需给出内存中的内容(内存中的页面号),若有淘汰还需给出淘汰的页面号。
5、通过给出特殊的页面访问顺序,分配不同的物理块,利用FIFO 算法计算其缺页率,进一步理解Belady现象。
6、(附加)实现CLOCK置换算法,修改位可在确定页面号时直接任意给出。
#include<iostream>
using namespace std;
#define M 40
int N;
struct Pro
{
int num,time;
};
int Input(int m,Pro p[M])
{
cout<<"请输入实际页调用次数:";
do
{
cin>>m;
if(m>M)cout<<"数目太多,请重试"<<endl;
else break;
}while(1);
cout<<endl<<"请输入各页面号"<<endl;
for(int i=0;i<m;i++)
{
cin>>p[i].num;
p[i].time=0;
}
return m;
}
void print(Pro *page1 ,int t)//打印当前的页面
{
Pro *page=new Pro[N];
page=page1;
for(int i=0;i<N;i++)cout<<page[i].num<<" ";
if(t>=0) cout<<"被淘汰页:"<<t;
cout<<endl;
}
int Search(int e,Pro *page1 )
{
Pro *page=new Pro[N];
page=page1;
for(int i=0;i<N;i++)if(e==page[i].num)return i;
return -1;
}
int Max(Pro *page1)
{
Pro *page=new Pro[N];
page=page1;
int e=page[0].time,i=0;
while(i<N)//找出离现在时间最长的页面
{
if(e<page[i].time)e=page[i].time;
i++;
}
for( i=0;i<N;i++)if(e==page[i].time)return i;
return -1;
}
int Compfu(Pro *page1,int i,int t,Pro p[M]) {
Pro *page=new Pro[N];
page=page1;
int count=0;
for(int j=i;j<M;j++)
{
if(page[t].num==p[j].num )break;
else count++;
}
return count;
}
int main()
{
cout<<"可用内存页面数"<<endl;
cin>>N;
Pro p[M];
Pro *page=new Pro[N];
char c;
int m=0,t=0;
float n=0;
m=Input(m,p);
do{
for(int i=0;i<N;i++)//初试化页面基本情况{
page[i].num=0;
page[i].time=2-i;
}
int j=0,count=1;
page[0].num=p[0].num;
int i=1,k=1;
while(i<N)
{
int flag=1;
for(j=0;j<i;j++)
if(p[k].num==page[i].num)
{n++;flag=0;break;}
if(flag==1){page[i].num=p[k].num;i++;}
count++;k++;
}
i=0;
cout<<"f:FIFO页面置换"<<endl;
cout<<"l:LRU页面置换"<<endl;
cout<<"o:OPT页面置换"<<endl;
cout<<"按其它键结束"<<endl;
cin>>c;
if(c=='f')//FIFO页面置换
{
n=0;
cout<<"页面置换情况: "<<endl;
while(i<m)
{
if(Search(p[i].num,page)>=0){
if(i>=N-1)
print(page, -1);
i++;//找到相同的页面
}
else
{
if(t==N)t=0;
else
{
n++;
int tt = page[t].num;
page[t].num=p[i].num;
print(page, tt);
t++;
i++;
}
}
}
cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl; }
if(c=='l')//LRU页面置换
{ n=0;
cout<<"页面置换情况: "<<endl;
while(i<m)
{
int k,tt;
k=t=Search(p[i].num,page);
if(t>=0)
{
page[t].time=0;
if(i>=N-1)
print(page, -1);
}
else
{
n++;
t=Max(page);
tt = page[t].num;
page[t].num=p[i].num;
page[t].time=0;
}
if(t==0){page[t+1].time++;page[t+2].time++;}
if(t==1){page[2].time++;page[0].time++;}
if(t==2){page[1].time++;page[0].time++;}
if(k==-1) {
print(page, tt);
}
i++;
}
cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl;
}
if(c=='o')//OPT页面置换
{
n=0;
while(i<m)
{
if(Search(p[i].num,page)>=0){
if(i>=N-1)
print(page, -1);
i++;
}
else
{
int temp=0,cn;
for(t=0;t<N;t++)
{
if(temp<Compfu(page,i,t,p))
{
temp=Compfu(page,i,t,p);
cn=t;
}
}
Pro t = page[cn];
page[cn]=p[i];
n++;
print(page, t.num);
i++;
}
}
cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl;
}
}while(c=='f'||c=='l'||c=='o');
return 0;
}。