第一篇:实验5 页面置换算法
实验5
页面置换算法
一、实验题目:页面置换算法(请求分页)
二、实验目的:
进一步理解父子进程之间的关系。
1)理解内存页面调度的机理。2)掌握页面置换算法的实现方法。3)通过实验比较不同调度算法的优劣。4)培养综合运用所学知识的能力。
页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。
三、实验内容及要求
这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。
程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存页面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存页面进行调度。要求:
1)每个子进程应能反映出页面置换的过程,并统计页面置换算法的命中或缺页情况。
设缺页的次数为diseffect。总的页面访问次数为total_instruction。缺页率 = disaffect/total_instruction 命中率 = 1-disaffect/total_instruction 2)将为进程分配的内存页面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
四、程序流程图
开始创建子进程1创建子进程2
结束 子进程1逻辑页面读完?N命中?N内存页面满?Y命中次数+1YY最先进入的进程退出内存页面N当前调入页面进入内存页面退出 2逻辑页面读完?N命中?N内存页面满?N当前调入页面进入内存页面Y被访问次数最少的进程退出内存页面Y命中次数+1,命中页面访问数+1Y退出
五、运行结果及其说明
FIFO:
LRU:
:
六、回答以下问题: ① 父进程、子进程之间的并发执行的过程
父进程与子进程之间的并发执行宏观并行,微观串行。从宏观来说,父进程创建子进程1,子进程1和父进程同时执行,直到父进程创建子进程2遇到wait()函数挂机为止,当子进程1结束父进程和子进程2并发执行到再次遇见wait()函数是挂起等待子进程2结束,到子进程2结束返回父进程父进程继续执行至结束。从微观来说,父进程先执行至创建子进程1,接下来父进程挂起执行子进程1知道子进程1结束回到父进程;父进程继续执行到创建子进程2再次挂起,执行子进程2,直到子进程2结束回到父进程继续执行至结束。
② 通过完成实验,根据你的体会,阐述虚拟存储器的原理。虚拟存储器实际上是用来解决作业大而内存小的问题,他通过页面置换算法来提供远大于内存地址空间的地址范围,针对不同的程序将不同的数据页面读取到虚拟存储器中用来实现。
③ 写出FIFO算法中出现Belady现象的内存页面访问序列。
4个内存页面数:
序列2 2 5 3 3 1 3 1 2 5 5 2 3个内存页面数:
序列2 1 3 2 1 4 3 1 3 1 5 5
7次命中,命中率为0.58 6次命中,命中率为0.5
七、程序源代码、文档注释及文字说明
#include
main(){ srand(time(0));int pid1, pid2, fd[2], Acess_Series[12], temp;float effect, rate = 0;char str1[100], str2[100];struct M_Frame {
int page_no;
char flag;};struct M_Frame one_frame[4];one_frame[0].page_no = 0;one_frame[1].page_no = 0;one_frame[2].page_no = 0;one_frame[3].page_no = 0;effect = 0;int i = 0;printf(“内存访问页面序列:”);for(;i<12;i++){
Acess_Series[i] = rand()% 5 + 1;
printf(“%d ”, Acess_Series[i]);} while((pid1 = fork())==-1);if(pid1 == 0){
int no = 0;
int pno = 0;
printf(“FIFO页面置换算法:n”);
for(;no<12;no++)
{
printf(“调入的页面号是%d ”, Acess_Series[no]);
int k = 0;
for(;k <= Frame;k++)
{
if(one_frame[k].page_no == Acess_Series[no]){ effect++;printf(“命中n”);break;}
if(one_frame[k].page_no == 0)
{
one_frame[k].page_no = Acess_Series[no];
printf(“未命中n”);
break;
}
if(k == Frame)
{
int j = 1;
for(;j <= Frame;j++)
{
one_frame[j1].page_no;one_frame[t1].page_no = one_frame[j].page_no;
}
one_frame[Frame].page_no = Acess_Series[no];
printf(“未命中n”);
}
}
printf(“内存情况为:%d |%d |%d |%dn”, one_frame[0].page_no, one_frame[1].page_no, one_frame[2].page_no, one_frame[3].page_no);
}
rate = effect / 12;
printf(“命中次数:%fn”, effect);
printf(“命中率:%fn”, rate);
}
wait(0);
exit(0);} }
第二篇:计算机操作系统实验4页面置换算法
实验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置换算法,修改位可在确定页面号时直接任意给出。
程序代码(java)
package wcm4;
import java.util.LinkedList;import java.util.Scanner;
public class Test {
/**
* @param args
*/ LinkedList ll=new LinkedList();int a;int leng;int[] all={1,2,5,7,5,7,1,4,3,5,6,4,3,2,1,5,2};//int[] free=new int[all.length];
Object o=new Integer(a);public static void main(String[] args){
public void begin(){ System.out.println(“请选择测试类型:”);System.out.println(“1 OPT;2 FiFO;3 LRU;4 CLOCK;5退出”);
} public void need(){ System.out.println(“请输入分配给该作业的物理块数:”);Scanner sc=new Scanner(System.in);leng=sc.nextInt();Scanner sc=new Scanner(System.in);int choose=sc.nextInt();while(choose!=5){
} switch(choose){ case 1:this.opt();break;case 2:this.fifo();break;case 3:this.lru();break;case 4:this.clock();break;} System.out.println(“请选择测试类型:”);System.out.println(“1 OPT;2 FiFO;3 LRU;4 CLOCK;5退出”);sc=new Scanner(System.in);choose=sc.nextInt();// TODO Auto-generated method stub Test t=new Test();t.begin();
}
}
public void fifo(){ ll=new LinkedList();this.need();
int a=0;for(int i=0;i o=all[i];if(!ll.contains(o)){ } if(ll.size() } ll.add(o);o=ll.poll();a++;else{ o=null;} this.print();} System.out.println(“FIFO的缺页率为:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length); } public void opt(){//最佳置换算法 //leng=0;ll=new LinkedList();this.need();int a=0;//int temp=0;//int[] b=new int[leng]; for(int i=0;i int[] b=new int[leng];o=all[i];if(!ll.contains(o)){ if(ll.size() ll.add(o); } o=null;} else{ for(int j=i;j Object o1=new Integer(all[j]); } for(int k=0;k } if(ll.get(k).equals(o1)){ } if(b[k]==0){ b[k]=j;//待替换的页在以后第一次出现的位置 } } if(b[leng-1]==0){ o=ll.set(leng-1, o);a++;} else{ int temp=0; } for(int m=0;m if(b[m]==0){ temp=m;break;} else if(b[m]>b[temp]){ } temp=m; } o=ll.set(temp, o);//替换以后离得最远的 a++;} else{ } o=null;this.print();} System.out.println(“OPT的缺页率为:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length); public void lru(){//最近最久未使用 } public void clock(){//简单clock ll=new LinkedList();this.need();int a=0;int[] b=new int[leng];for(int i=0;i o=all[i];if(!ll.contains(o)){ if(ll.size() o=all[i];if(!ll.contains(o)){ if(ll.size() } ll.add(o);o=ll.poll();a++;} else{ ll.add(o);ll.remove(o);o=null;} this.print();} System.out.println(“OPT的缺页率为:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length); } } else{ for(int j=0;j<=ll.size();j++){ if(b[j%ll.size()]==0){ } } } else{ int temp1=j%ll.size(); } o=ll.set(temp1, o); b[temp1]=0;//改变该位的标记位 break; b[j%ll.size()]=1;a++;} else{ int temp=ll.indexOf(o);//找到该位 b[temp]=0;o=null;} this.print();System.out.println(“标记位为:”);for(int k=0;k public void print(){ Object[] op=ll.toArray();for(int i=0;i ”);System.out.println(o);//System.out.println();System.out.print(op[i]);} } “计算机操作系统”课程设计大作业 一、题目: 页面置换算法模拟实验 二、目的 分别采用最佳(Optimal)置换算法、先进先出(FIFO)页面置换算法和最近最少使用(LRU)置换算法对用户输入的页面号请求序列进行淘汰和置换,从而加深对页面置换算法的理解。 三、内容和要求 请用C/C++语言编一个页面置换算法模拟程序。用户通过键盘输入分配的物理内存总块数,再输入用户逻辑页面号请求序列,然后分别采用最佳(Optimal)置换算法、先进先出(FIFO)页面置换算法和最近最少使用(LRU)置换算法三种算法对页面请求序列进行转换,最后按照课本P150页图4-26的置换图格式输出每次页面请求后各物理块内存放的虚页号,并算出每种算法的缺页次数。最后评价三种页面置换算法的优缺点。 三种页面置换算法的思想可参考教材P149-P152页。 假设页面号请求序列为4、3、2、1、4、3、5、4、3、2、1、5,当分配给某进程的物理块数分别为3块和4块时,试用自己编写的模拟程序进行页面转换并输出置换图和缺页次数。 四、提交内容 本大作业每个人必须单独完成,大作业以WORD附件形式提交。最后需提交的内容包括:算法算法思路及流程图、数据结构说明、源程序(关键代码需要注释说明)、运行结果截图、心得体会及总结。 大作业严禁抄袭。发现抄袭一律以不及格论。 请大家严格按照大作业题目来编写程序,不要上交以前布置的大作业。如果提交的大作业题目与本文档要求不符,成绩一律为不及格。 请大家按时在网院网上系统里提交大作业,过了规定时间将无法再补交大作业。 页面置换算法模拟实验 算法算法思路 模拟FIFOOPTLRU这3种页面置换算法,先分配所需的内存空间,在根据已知的序列,分别根据不同的页面算法去访问已知序列,得出不同内存空间的置换算法的缺页数量。总体流程图 开始输入内存数执行页面置换FIFOLRUOPT显示结果结束 数据结构说明 源程序(关键代码需要注释说明)FIFO关键源码 LRU关键源码 OPT关键源码 程序源码 #include int bno;//定义块号 int time;// 定义最近使用 int status;//定义命中状态 int order;//定义优先级 }; int list[12]={4,3,2,1,4,2,5,2,3,2,1,5};// 已知序列 // 输出方法 void output(int *a ,int n){ for(int i=0;i cout<<*a<<'t'; a++;} cout<<'n';} void fifo(int *list,int mem_num){ page p[N];// 定义记录数组 int flag;int mem[M];// 定义内存 int index =0;// 默认下标 int lack=0;// 初始化内存 for(int i=0;i mem[i]=0;} // 遍历序列 for(i=0;i flag=0;// 设置默认命中 0 for(int j=0;j if(list[i]==mem[j]){ // 检测序列与已知内存值,命中返回flag flag=1; break; } } if(flag==1){ // 判断是否命中,则对 p 赋值 p[i].bno = j+1; p[i].pno = list[i]; p[i].status =1; }else{ p[i].pno = list[i]; p[i].status = 0; mem[index] = list[i]; p[i].bno = index+1;// 赋予 页号 index =(index+1)%mem_num;// 每次取余 lack++; } } cout<<“FIFO算法:n”;cout<<“---**n”;cout<<“缺页次数:”<<'t'< cout<<“-----**n”;cout<<“序列号n”; cout<<“-----**n”;for(i=0;i cout<<“-----**n”;} for(i=mem_num;i } struct mem{ int order;//内存优先级 主要用于识别是否不常用 int pno;// 内存页号 int time;// 记录是否最近使用 }; void lru(int *list,int mem_num){ page p[N];// 定义记录数组 int flag;mem m[M];// 定义内存 int index =0;// 默认下标 int lack=0;int temp;int max=0;// 内存赋值 for(int i=0;i m[i].pno=0; //默认初始优先级 0 m[i].order = 0;} for(i=0;i flag=0; for(int j=0;j if(list[i]==m[j].pno){ flag=1; index=j; //m[j].order++; p[i].order =m[j].order; break; } } if(flag==1){ //命中后,p[i].bno = index+1; p[i].pno = list[i]; p[i].status = 1; p[i].order--; temp = p[i].order; for(j=0;j if(p[j].order temp=p[j].order; index = p[j].bno; } } }else{ p[i].status=0; p[i].pno = list[i]; m[index].pno = list[i]; m[index].order = p[i].order; p[i].bno = index+1; for(j=0;j if(m[j].order>max){ index = j; } } index =(index+1)%mem_num;// 每次取余有效的下标 //max++; lack++; } } cout<<“LRU算法:n”;cout<<“---**n”;cout<<“缺页次数:”<<'t'< cout<<“-----**n”;cout<<“序列号n”; cout<<“-----**n”;for(i=0;i cout<<“-----**n”;} for(i=mem_num;i mem m[M];int flag=0;int index = 0;//下标 int max = N;int lack=0;for(int i=0;i m[i].pno=0; m[i].time = 0;//设置内存使用频率 } for(i=0;i flag=0; for(int j=0;j if(list[i]==m[j].pno){ flag=1; index = j; break; } } if(flag==1){ p[i].status =1; p[i].bno = index+1; p[i].pno = list[i]; for(j=0;j for(int g=i;g if(m[j].pno==list[g]){ m[j].time = N-g;//获取到 最近使用 p[i].time = m[j].time; index = j; } } } }else{ p[i].status =0; p[i].pno = list[i]; m[index].pno = list[i]; m[index].time = N;//设置默认不使用 p[i].bno =index+1; for(j=0;j if(m[j].time>max){ index = j; } } index =(index+1)%mem_num; lack++; } } cout<<“OPT算法:n”;cout<<“---**n”;cout<<“缺页次数:”<<'t'< cout<<“-----**n”;cout<<“序列号n”; cout<<“-----**n”;for(i=0;i cout<<“-----**n”;} for(i=mem_num;i void main(){ int m;cout << “===========================n”;cout << “请输入内存大小(3/4)n”;cin >> m;cout << “===========================n”;opt(list,m);fifo(list,m);lru(list,m); } 运行结果截图 FIFO、LRU、OPT运行截图(开辟3个内存空间): FIFO、LRU、OPT运行截图(开辟4个内存空间): 心得体会及总结: 在开始做题目的时候,需要了解什么是FIOFOLRUOPT这3个页面置换的知识点,同时参考了网络上许多实现过程技巧,并在在纸上面简单画出页面如何记录如何与内存置换,这样子比较方便写出算法。由于这次设计的时间比较仓促,其中不免会有些纰漏,比如在程序的实现上还不够严谨,出错处理不够完善等多方面问题,这些都有进一步改善。同时,在这次编写3个页面算法的过程中,我学到了很多东西,无论在理论上还是实践中,都得到不少的提高,这对以后的工作中会有一定的帮助。 《操作系统--页面置换算法》 实验报告 姓 名: 范学升 学 号:1001050903 班 级:电科10-1班 专 业:电子信息科学与技术 一、实验目的 1.通过模拟实现几种基本页面置换的算法,了解虚拟存储技术的特点。 2.掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想,并至少用三种算法来模拟实现。 3.通过对几种置换算法页面的比较,来对比他们的优缺点,并通过比较更换频率来对比它们的效率。 二、实验内容: 设计一个虚拟存储区和内存工作区,并使用下述算法来模拟实现页面的置换: 1.先进先出的算法(FIFO)2.最近最久未使用算法(LRU)3.最佳置换算法(OPT) 三、实验分析 在进程运行过程中,若其所访问的页面不存在内存而需要把它们调入内存,但内存已无空闲时,为了保证该进程能够正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。但应调出哪个页面,需根据一定的算法来确定,算法的好坏,直接影响到系统的性能。 一个好的页面置换算法,应该有较低的页面更换频率。 假设分给一作业的物理块数为3,页面数为20个。页面号为(20个): 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1 1.先进先出(FIFO)置换算法的思路 该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按照先后次序连接成一个队列,并设置一个替换指针,使它总指向最老的页面。 2.最近久未使用(LRU)置换算法的思路 最近久未使用置换算法的替换规则,是根据页面调入内存后的使用情况来进行决策的。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当需淘汰一个页面的时候选择现有页面中其时间值最大的进 行淘汰。 3.最佳(OPT)置换算法的思路 其所选择的被淘汰的页面,奖是以后不使用的,或者是在未来时间内不再被访问的页面,采用最佳算法,通常可保证获得最低的缺页率。 4.数据结构 struct pageInfor { int content;//页面号 int timer;//被访问标记 }; class PRA { public: PRA(void);int findSpace(void);//查找是否有空闲内存 int findExist(int curpage);//查找内存中是否有该页面 int findReplace(void);//查找应予置换的页面 void display(void);//显示 void FIFO(void);//FIFO算法 void LRU(void);//LRU算法 void BlockClear(void);//BLOCK清空,以便用另一种方法重新演示 pageInfor * block;//物理块 pageInfor * page;//页面号串 private: }; 5.FIFO页面置换算法 当需要访问一个新的页面时,首先调用findExist(i)函数来查看物理块中是否就有这个页面,若要查看的页面物理块中就有,则调用display函数直接显示,不需要替换页面;如果要查看的页面物理块中没有,就需要寻找空闲物理块放入,若存在有空闲物理块,则将页面放入;若没有空闲物理块,则调用findReplace函数替换页面。并将物理块中所有页面timer++。 6.LRU页面置换算法 当需要访问一个新的页面,首先调用findExist(i)函数查看物理块中是否就有这个页面。 7.OPT页面置换算法 当需要访问一个新的页面,首先调用findExist(i)函数来查看物理块中是否有这个页面。 8.寻找置换页面函数findReplace比较三个物理块中的时间标记timer,找到时间最久的。 四、源程序结构分析 1. 程序结构 程序共有以下九个部分: int findSpace(void);//查找是否有空闲内存 int findExist(int curpage);//查找内存中是否有该页面 int findReplace(void);//查找应予置换的页面 void display(void);//显示 void FIFO(void);//FIFO算法 void LRU(void);//LRU算法 void OPT(void);//OPT算法; void BlockClear(void);//BLOCK清空,以便用另一种方法重新演示 int main() //主程序 五、实验结果 1运行后的初始界面 opt算法 3.FIFO算法 4LRU算法 计算机工程学院 实验报告书 课程名:《 操作系统原理A 》 题 目: 虚拟存储器管理 页面置换算法模拟实验 班 级: 学 号: 姓 名: 评语: 成绩: 指导教师: 批阅时间: ****年**月**日 一、实验目的与要求 1.目的: 请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。 2.要求: 本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。 二、实验说明 1.设计中虚页和实页的表示 本设计利用C语言的结构体来描述虚页和实页的结构。 pn pfn time pn pfn next 虚页结构 实页结构 在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。 在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。 2.关于缺页次数的统计 为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。最终命中率=count/20*100%。 3.LRU算法中“最近最久未用”页面的确定 为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值,表示该虚页的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实页的虚页中找出time值为最小的虚页就是“最近最久未用”的虚页面,应该将它置换出去。 4.算法中实页的组织 因为能分配的实页数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实页。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实页,首指针为free_head,初始时n个实页都处于free链表中;busy链表用于组织已分配出去的实页,首指针为busy_head,尾指针为busy_tail,初始值都为null。当所要访问的一个虚页不在实页中时,将产生缺页中断。此时若free链表不为空,就取下链表首指针所指的实页,并分配给该虚页。若free链表为空,则说明n个实页已全部分配出去,此时应进行页面置换:对于FIFO算法要将busy_head 所指的实页从busy链表中取下,分配给该虚页,然后再将该实页插入到busy链表尾部;对于LRU算法则要从所有已分配实页的虚页中找出time值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。 三、程序流程图 四、主要程序清单 #include #include /*全局变量*/ int mSIZE; /*物理块数*/ int pSIZE; /*页面号引用串个数*/ static int memery[10]={0}; /*物理块中的页号*/ static int page[100]={0}; /*页面号引用串*/ static int temp[100][10]={0}; /*辅助数组*/ /*置换算法函数*/ void FIFO(); void LRU(); void OPT(); /*辅助函数*/ void print(unsigned int t); void designBy(); void download(); void mDelay(unsigned int Delay); /*主函数*/ void main() { int i,k,code; printf(“请输入物理块的个数(M<=10):“); scanf(“%d“,&mSIZE); printf(“请输入页面号引用串的个数(P<=100):“); scanf(“%d“,&pSIZE); puts(“请依次输入页面号引用串(连续输入,无需隔开):“); for(i=0;i scanf(“%1d“,&page[i]); download(); do { puts(“输入的页面号引用串为:“); for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } } printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“* 请选择页面置换算法:\t\t\t *\n“); printf(“* -----------------------------------------*\n“); printf(“* 1.先进先出(FIFO) 2.最近最久未使用(LRU) *\n“); printf(“* 3.退出 *\n“); printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“请选择操作:[ ]\b\b“); scanf(“%d“,&code); switch(code) { case 1: FIFO(); break; case 2: LRU(); break; case 3: OPT(); break; case 4: system(“cls“); //system(“color 0A“); exit(0); default: printf(“输入错误,请重新输入:“); } printf(“按任意键重新选择置换算法:>>>“); getchar(); } while (code!=4); getchar(); } /*载入数据*/ void download() { printf(“\nFinish.\n载入成功!“); } /*设置延迟*/ void mDelay(unsigned int Delay) { unsigned int i; for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(“ \b“); } } } /*显示设计者信息*/ void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } for(j=0;j { for(i=20*k;(i if(i>=j) printf(“ |%d|“,temp[i][j]); else printf(“ | |“); } for(i=mSIZE+20*k;(i { for(flag=0,l=0;l if(temp[i][l]==temp[i-1][l]) flag++; if(flag==mSIZE)/*页面在物理块中*/ printf(“ “); else printf(“ |%d|“,temp[i][j]); } /*每行显示20个*/ if(i%20==0) continue; printf(“\n“); } } printf(“----------------------------------------\n“); printf(“缺页次数:%d\t\t“,t+mSIZE); printf(“缺页率:%d/%d\n“,t+mSIZE,pSIZE); printf(“置换次数:%d\t\t“,t); printf(“访问命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE); printf(“----------------------------------------\n“); } /*计算过程延迟*/ void compute() { int i; printf(“正在进行相关计算,请稍候“); for(i=0;i++<30;printf(“\b“)); for(i=0;i++<30;printf(“ “)); for(i=0;i++<30;printf(“\b“)); } /*先进先出页面置换算法*/ void FIFO() { int memery[10]={0}; int time[10]={0}; /*记录进入物理块的时间*/ int i,j,k,m; int max=0; /*记录换出页*/ int count=0; /*记录置换次数*/ /*前mSIZE个数直接放入*/ for(i=0;i { memery[i]=page[i]; time[i]=i; for(j=0;j temp[i][j]=memery[j]; } for(i=mSIZE;i { /*判断新页面号是否在物理块中*/ for(j=0,k=0;j { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*如果不在物理块中*/ { count++; /*计算换出页*/ max=time[0]第三篇:页面置换算法模拟
第四篇:页面置换算法实验报告(精选)
第五篇:计算机操作系统实验三页面置换算法模拟实验