第7次 常用页面置换算法模拟实验
- 格式:doc
- 大小:511.00 KB
- 文档页数:16
实验7页面置换算法的模拟实现三、实验内容与步骤1、定义相关数据#define InitPysiBlocks 4#define MaxPages 16:unsigned int PysicalBlocks[InitPysiBlocks] = { 0 };unsigned int PageSequence[30] = { 1,2,3,6,4,7,3,2,1,4,7,5,6,5,2,1};2、按照教材中FIFO、LRU算法描述进行算法设计unsigned FIFO(unsigned *py,unsigned *pg)unsigned LRU(unsigned *py,unsigned *pg)3、查看运行结果是否与手工计算一致。
四、实验材料的提交与成绩评定1.代码:#include<iostream>usingnamespace std;#define InitPysiBlocks 4#define MaxPages 16unsignedint PysicalBlocks[InitPysiBlocks] = { 0 };unsignedint PageSequence[30] = { 1,2,3,6,4,7,3,2,1,4,7,5,6,5,2,1 };//FIFO算法unsigned FIFO(unsigned *py, unsigned *pg){//初始化填满数据for (int i = 0; i <InitPysiBlocks; i++){py[i] = pg[i];}cout <<"FIFO置换过程如下:"<< endl;cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;//判断新获取数据进来的时间int time[4] = { 3,2,1,0 };//开始检测for (int i = 4; i <MaxPages; i++){for (int j = 0; j <InitPysiBlocks; j++){//如果新获取的已存在,直接输出if (py[0] == pg[i] || py[1] == pg[i] || py[2] == pg[i] || py[3] == pg[i]){cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;break;}else{for (int k = 0; k < 4; k++){if (time[k] == 3){time[k] = 0;py[k] = pg[i];}else{time[k]++;}}cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;break;}}}cout <<"置换结束"<< endl;return 0;}//LRU算法//LRU辅助函数:返回除某一排下标后数组中最大元素下标int Max(unsigned *py, int te){int max = 0;int index = -1;for (int i = 0; i <InitPysiBlocks; i++){if (i == te){continue;}else{if (py[i] > max){max = py[i];index = i;}else{continue;}}}return index;}unsigned LRU(unsigned *py, unsigned *pg){//初始化填满数据for (int i = 0; i <InitPysiBlocks; i++){py[i] = pg[i];}cout <<"LRU置换过程如下:"<< endl;cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;//判断新获取数据进来的时间unsigned time[4] = { 3,2,1,0 };//统计命中次数int count[4] = { 0 };//开始检测for (int i = InitPysiBlocks; i < 16; i++){for (int j = 0; j <InitPysiBlocks; j++){//如果新获取的已存在,直接输出,并将对应的命中变为1if (py[0] == pg[i] || py[1] == pg[i] || py[2] == pg[i] || py[3] == pg[i]){cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;if (py[0] == pg[i]){count[0] = 1;}elseif (py[1] == pg[i]){count[1] = 1;}elseif (py[2] == pg[i]){count[2] = 1;}elseif (py[3] == pg[i]){count[3] = 1;}else{count[4] = { 0 };}break;}else{if (count[0] == 1){//返回数组中最大值int temp = Max(time, 0);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[0] = 0;}elseif (count[1] == 1){//返回数组中最大值int temp = Max(time, 1);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[1] = 0;}elseif (count[2] == 1){//返回数组中最大值int temp = Max(time, 2);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[2] = 0;}elseif (count[3] == 1){//返回数组中最大值int temp = Max(time, 3);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[3] = 0;}else{//返回数组中最大值int temp = Max(time, -1);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;}cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;break;}}}cout <<"置换结束"<< endl;return 0;}int main(){FIFO(PysicalBlocks, PageSequence);LRU(PysicalBlocks, PageSequence);return 0;}2.运行截图:运行结果与手工计算结果一致。
页面置换算法的模拟实现及命中率对比实验报告一、问题描述课程设计目的(1)、通过请求页式管理方式中页面置换算法的模拟设计,了解虚拟存储术的特点,掌握请求页式存储管理中的页面置换算法。
(2)、课程设计内容模拟实现OPT(最佳置换)、FIFO和LRU算法,并计算命中率。
(3)、课程设计要求:a)首先用随机数生成函数产生“指令”序列,然后将指令序列变换成相应的页地址流,再计算不同算法下的命中率。
b)通过随机数产生一个指令序列,共产生400条。
其中50%的指令是顺序执行的(灵位50%就是非顺序),且25%的指令分布在前半部分地址空间,25%的指令分布在后半部分地址空间。
c)将指令地址流变换成页地址流d)循环运行,使用户内存容量从4到40,。
计算每个内存容量下不同页面置换算法的命中率。
二、概要设计1.程序的数据结构:#define total_instruction 100 /*指令流长*/#define M 100 /*实际页数*/#define N 5 //可用页面数struct Pro{int num,time;};int a[total_instruction];int page[N];2.程序的主函数:int main(){Pro p[total_instruction];Pro *page=new Pro[N];char c;int t=0,i;float n=0;Input(p);do{for( i=0;i<N;i++)//初试化页面基本情况{page[i].num=-1;page[i].time=2-i;}printf("系统产生的随机数为:");for(int e=0;e<M;e++)cout<<p[e].num<<" ";cout<<endl;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< total_instruction){if(Search(p[i].num,page)>=0)i++;//找到相同的页面else{if(t==N)t=0;else{n++;//page[t].num=p[i].num;print(page);t++;}}}cout<<"缺页次数:"<<n<<" 命中率:"<<1-n/total_instruction<<endl; }if(c=='l')//LRU页面置换{n=0;cout<<"页面置换情况: "<<endl;while(i<total_instruction){int k;k=t=Search(p[i].num,page);if(t>=0)page[t].time=0;else{n++;t=Max(page);page[t].num=p[i].num;page[t].time=0;}for(int j=0;j<N;j++){if(j!=t)page[j].time++;}/*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);i++;}cout<<"缺页次数:"<<n<<" 命中率:"<<1-n/total_instruction<<endl; }if(c=='o')//OPT页面置换{n=0;while(i<total_instruction){if(Search(p[i].num,page)>=0)i++;else{if(page[N-1].num==-1){for(int g=0;g<N;g++)if(page[g].num==-1){page[g].num=p[i].num;i++;n++;print(page);break;}}else{int temp=-1,cn;for(t=0;t<N;t++){if(temp<Compfu(page,i,t,p)){temp=Compfu(page,i,t,p);cn=t;}}page[cn]=p[i];n++;print(page);i++;}}}cout<<"缺页次数:"<<n<<" 命中率:"<<1-n/total_instruction<<endl;}}while(c=='f'||c=='l'||c=='o');return 0;}三、详细设计程序代码如下:#include<stdlib.h>#include<iostream>#include<time.h>#include<stdio.h>using namespace std;#define total_instruction 100 /*指令流长*/#define M 100 /*实际页数*/#define N 5 //可用页面数struct Pro{int num,time;};int a[total_instruction];int page[N];void Input(Pro p[total_instruction]){int m,i,m1,m2;srand( (unsigned int )time(NULL));m=rand( )%400; //for(i=0;i<total_instruction;) /*产生指令队列*/{if(m<0||m>399){printf("When i==%d,Error,m==%d\n",i,m);exit(0);}a[i]=m; /*任选一指令访问点m*/ a[i+1]=a[i]+1;a[i+2]=a[i]+2; /*顺序执行两条指令*/int m1=rand( )%m; /*执行前地址指令m1 */a[i+3]=m1;a[i+4]=m1+1;a[i+5]=m1 + 2;/*顺序执行两条指令*/// s=(158-a[i+5])*rand( )/32767/32767/2+a[i+5]+2;m2 = rand()%(157-m1)+m1+3;a[i+6]=m2;if( (m2+2) > 159 ){a[i+7] = m2+1;i +=8;}else{a[i+7] = m2+1;a[i+8] = m2+2;i = i+9;}m = rand()%m2;}for (i=0;i<total_instruction;i++) /*将指令序列变换成页地址流*/ {p[i].num=a[i]/10;p[i].time = 0;}}void print(Pro *page1)//打印当前的页面{Pro *page=new Pro[N];page=page1;for(int i=0;i<N;i++)printf("%-4d",page[i].num);//cout<<page[i].num<<" ";cout<<endl;//free(page);}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(){Pro p[total_instruction];Pro *page=new Pro[N];char c;int t=0,i;float n=0;Input(p);do{for( i=0;i<N;i++)//初试化页面基本情况{page[i].num=-1;page[i].time=2-i;}printf("系统产生的随机数为:");for(int e=0;e<M;e++)cout<<p[e].num<<" ";cout<<endl;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< total_instruction){if(Search(p[i].num,page)>=0)i++;//找到相同的页面else{if(t==N)t=0;else{n++;//page[t].num=p[i].num;print(page);t++;}}}cout<<"缺页次数:"<<n<<" 命中率:"<<1-n/total_instruction<<endl”}if(c=='l')//LRU页面置换{n=0;cout<<"页面置换情况: "<<endl;while(i<total_instruction){int k;k=t=Search(p[i].num,page);if(t>=0)page[t].time=0;else{n++;t=Max(page);page[t].num=p[i].num;page[t].time=0;}for(int j=0;j<N;j++){if(j!=t)page[j].time++;}/*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);i++;}cout<<"缺页次数:"<<n<<" 命中率:"<<1-n/total_instruction<<endl;}if(c=='o')//OPT页面置换{n=0;while(i<total_instruction){if(Search(p[i].num,page)>=0)i++;else{if(page[N-1].num==-1){for(int g=0;g<N;g++)if(page[g].num==-1){page[g].num=p[i].num;i++;n++;print(page);break;}}else{int temp=-1,cn;for(t=0;t<N;t++){if(temp<Compfu(page,i,t,p)){temp=Compfu(page,i,t,p);cn=t;}}page[cn]=p[i];n++;print(page);i++;}}}cout<<"缺页次数:"<<n<<" 命中率:"<<1-n/total_instruction<<endl; }}while(c=='f'||c=='l'||c=='o');return 0;}四、调试与分析程序的主界面:这里测试用的数据是M=40,N=5,三种算法置换结果如以下的图:FIFO算法:LRU算法:OPT算法:多运行几次,产生不同的随机数组,查看对比结果。
【精品】页面置换算法实验报告一、实验目的了解操作系统中的页面置换算法,并实现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算法的实现需要维护一个记录页面使用时间的链表或队列。
《操作系统原理》课程设计任务书题目:常用页面置换算法模拟实验学生姓名:学号:班级:计算机科学与技术(2)班题目类型:软件工程(R)指导教师:一、设计目的学生通过该题目的设计过程,可以初步掌握操作系统中有关文件系统的原理、软件开发方法并提高解决实际问题的能力。
二、设计任务设计一个虚拟存储区和内存工作区,并使用最佳淘汰算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)计算访问命中率。
(命中率=1-页面失效次数/页地址流长度)三、设计要求1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。
2、设计合适的测试用例,对得到的运行结果要有分析。
3、设计中遇到的问题,设计的心得体会。
4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。
5、光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级名命名的文件夹下,刻录成5寸光盘,并复制四份(共五张内容相同的光盘),放在一个专门的资料袋中。
四、提交的成果1、设计任务书一本(学校统一格式)2、设计说明书一份,内容包括:1)中文摘要100字;关键词3-5个;2)设计思想;3)各模块的伪码算法;4)函数的调用关系图;5)测试结果;6)涉及总结;7)参考文献、致谢等。
五、各阶段时间安排(共2周)周次日期内容地点完成情况第1周星期一~二教师讲解课设要求查找参考资料教室2D302图书馆星期三~五检查总体及各模块流程图教室2D302第2周星期一~二检查源程序调试情况及文档排版教室2C417星期三~五检查程序,答辩教室2C417指导教师签字:______________日期:2011年12月30日摘要在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。
当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
操作系统课程实验报告3、步骤说明(1)初始化void init(){//初始化int i;for (i = 0; i < page_frame_number; i++){ page_table[i].page_id = -1;page_table[i].load_time = -1;page_table[i].last_visit_time = -1;}}(2)选择算法,输入插入页面号。
进入判断函数int judge(){//判断页框是否满,或者页框里面是否已存在页面int i;for (i = 0; i < page_frame_number; i++){if (page_table[i].page_id == -1 || page_table[i].page_id == page_id)return i;}return -2;}之后根据返回数的不同决定了不同类型返回-2则说明页框满且页框里面没有存在要插入的页面。
返回-1则说明页框未满返回其它数则说明页框里存在相同的页面(3)//当没有空页框,并且页面本身也没有存在,则执行一下代码qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp);//按照装入时间从小到大排序page_table[0].page_id = page_id;page_table[0].load_time = counter;page_table[0].last_visit_time = counter;page_interrupt_number++;将页框号为0的页面置换成最新插入的页面。
int cmp(const void *p, const void *q){//按照装入时间从小到大排序int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;if (c > 0)return 1;elsereturn -1;}排序函数,将页面按装入时间从小到大排序(4)//如果页面未满,则将页面替换在空页框里if (page_table[j].page_id == -1){page_table[j].page_id = page_id;page_table[j].load_time = counter;page_table[j].last_visit_time = counter;page_interrupt_number++;则将页面替换在页框号最小的空页框里(5)//如果页面本身存在页框中,则执行一下代码page_table[j].last_visit_time = counter;则更新页面的最近访问时间(6)qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp3);//按照装入时间从小到大排序print(2);打印出页表详细信息printf("页表信息:\n页号页框号装入时间最近访问时间\n");for (j = 0; j < page_frame_number; j++){printf("%4d%8d%7d%7d\n", page_table[j].page_id, j, page_table[j].load_time, page_table[j].last_visit_time);}; break;排序函数int cmp3(const void *p, const void *q){//按照装入时间从小到大排序,,并且不要排序没页面的部分if ((*(struct Page_table*)p).page_id != -1 && (*(struct Page_table*)q).page_id != -1){ int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;if (c > 0)return 1;elsereturn -1;}}(7)并计算出中断页面次数及命中概率,并打印页表出来int sum;sum = ((virtual_page_number - page_interrupt_number) * 100 / virtual_page_number);printf("缺页中断次数:%d\n", page_interrupt_number);printf("中断命中率:%d%%\n", sum);printf("打印出页面\n");for (int i = 0; i < page_frame_number; i++){for (int g = 1; g <= virtual_page_number; g++){printf("%4d", pr[i][g]);}printf("\n");}4、实现(1)选择FIFO算法(2)输入页面号,列出页表详细信息(3)输入-1,结束输入,显示统计结果及页表二、最近最少使用页面置换算法1、基本思想:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
实验编号4名称页面置换算法模拟实验目的通过请求页式存储管理中页面置换算法模拟设计,以便:1、了解虚拟存储技术的特点2、掌握请求页式存储管理中页面置换算法实验内容与步骤设计一个虚拟存储区和内存工作区,并使用FIFO和LRU算法计算访问命中率。
<程序设计>先用srand()函数和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算相应的命中率。
<程序1>#include <windows.h> //Windows版,随机函数需要,GetCurrentProcessId()需要//#include <stdlib.h>//Linux版,随机函数srand和rand需要#include <stdio.h> //printf()需要#define TRUE 1#define FALSE 0#define INV ALID -1#define NULL 0#define total_instruction 320 //共320条指令#define total_vp 32 //虚存页共32页#define clear_period 50 //访问次数清零周期typedef struct{//定义页表结构类型(页面映射表PMT)int pn, pfn, counter, time;//页号、页框号(块号)、一个周期内访问该页面的次数、访问时间}PMT;PMT pmt[32];typedef struct pfc_struct{//页面控制结构int pn, pfn;struct pfc_struct *next;}pfc_type;pfc_type pfc[32];pfc_type *freepf_head,*busypf_head,*busypf_tail;//空闲页头指针,忙页头指针,忙页尾指针int NoPageCount; //缺页次数int a[total_instruction];//指令流数组int page[total_instruction], offset[total_instruction];//每条指令的页和页内偏移void initialize( int );void FIFO( int );//先进先出void LRU( int );//最近最久未使用void NRU( int );//最近最不经常使用/****************************************************************************main()*****************************************************************************/ void main(){int i,s;//srand(10*getpid());//用进程号作为初始化随机数队列的种子//Linux版srand(10*GetCurrentProcessId());//用进程号作为初始化随机数的种子//Windows版s=rand()%320;//在[0,319]的指令地址之间随机选取一起点mfor(i=0;i<total_instruction;i+=4){//产生指令队列if(s<0||s>319){printf("when i==%d,error,s==%d\n",i,s);exit(0);}a[i]=s;//任意选一指令访问点m。
目录一、摘要 (3)二、正文 (4)三、设计总结 (8)四、参考文献 (10)五、附录:源程序代码 (11)摘要Windows中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。
当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺页中断),由系统将其所需页面调入内存。
这种页面调入方式叫请求调页,为实现请求调页,核心配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。
此设计为了了解Windows XP的操作接口及系统调用方式,熟悉Windows XP常用操作的实现过程,练习并掌握Visual C++开发环境。
利用Windows SDK(System Development Kit)提供的API(应用程序接口)设计一个虚拟存储管理程序,并使用最佳淘汰算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)计算访问命中率。
(命中率=1-页面失效次数/页地址流长度)。
关键字Windows;请求调页;数据结构;存储管理正文一、设计思路页面置换算法:当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。
如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。
利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。
整个页面的调入过程对用户是透明的。
此设计为了了解Windows XP的操作接口及系统调用方式,熟悉Windows XP常用操作的实现过程,练习并掌握Visual C++开发环境。
利用Windows SDK(System Development Kit)提供的API(应用程序接口)设计一个虚拟存储管理程序,并使用最佳淘汰算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)计算访问命中率。
实验 5 页面置换算法模拟实验一.实验目地1.进一步掌握虚拟存储器地实现方法.2.掌握各种页面置换算法.3.比较各种页面置换算法地优缺点. 二.实验内容模拟实现页面置换算法, 步骤为:①使用产生随机数函数得到一个随机地数列, 作为将要载入地页面序列.②使用先进先出vFIFO)算法、最近最久未使用<LRU置换算法和最佳vOPT置换算法, 列出所需淘汰地页面号序列. b5E2RGbCAP③列出缺页中断次数. 三.参考源程序如下:#include vstdio.h> #include vstdlib.h> #include vtime.h> #define N 10 #define B 4/* ------------------------------------------------------ p1EanqFDPw函数名:IslnBuf(>,返回某个数X在不在缓冲Buf[],如在,返回位置,否则返回-1--- */ DXDiTa9E3dint IsInBuf(int buf[],int x>{int i,j=-1 。
for(i=0 o i<B。
i++>{ if(buf[i]==x>{ j=i 。
break 。
}else if(buf[i]==-1>{ buf[i]=x 。
j=i 。
break 。
} } return j 。
}/* ------------------------------------------------------ RTCrpUDGiT函数名:oldest(>, 返回最近最久未使用地页面位置--- */ 5PCzVD7HxAint oldest(int f[]>{int i,j=0,max=-1 。
for(i=0 。
ivB 。
i++>{ if(f[i]>max>{ max=f[i] 。
操作系统课程实验报告当发生缺页中断时操作系统必须在存选择一个页面将其移出存,以便为即将调入的页面让出空间。
而用来选择淘汰哪一页的规则叫做页面置换算法。
最简单的页面置换算法是先入先出(FIFO)法。
2、算法流程图3、步骤说明(1)初始化void init(){//初始化int i;for (i = 0; i < page_frame_number; i++){page_table[i].page_id = -1;page_table[i].load_time = -1;page_table[i].last_visit_time = -1;}}(2)选择算法,输入插入页面号。
进入判断函数int judge(){//判断页框是否满,或者页框里面是否已存在页面int i;for (i = 0; i < page_frame_number; i++){if (page_table[i].page_id == -1 || page_table[i].page_id == page_id)return i;}return -2;}之后根据返回数的不同决定了不同类型返回-2则说明页框满且页框里面没有存在要插入的页面。
返回-1则说明页框未满返回其它数则说明页框里存在相同的页面(3)//当没有空页框,并且页面本身也没有存在,则执行一下代码qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp);//按照装入时间从小到大排序page_table[0].page_id = page_id;page_table[0].load_time = counter;page_table[0].last_visit_time = counter;page_interrupt_number++;将页框号为0的页面置换成最新插入的页面。
int cmp(const void *p, const void *q){//按照装入时间从小到大排序int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;if (c > 0)return 1;elsereturn -1;}排序函数,将页面按装入时间从小到大排序(4)//如果页面未满,则将页面替换在空页框里if (page_table[j].page_id == -1){page_table[j].page_id = page_id;page_table[j].load_time = counter;page_table[j].last_visit_time = counter;page_interrupt_number++;则将页面替换在页框号最小的空页框里(5)//如果页面本身存在页框中,则执行一下代码page_table[j].last_visit_time = counter;则更新页面的最近访问时间(6)qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp3);//按照装入时间从小到大排序print(2);打印出页表详细信息printf("页表信息:\n页号页框号装入时间最近访问时间\n");for (j = 0; j < page_frame_number; j++){printf("%4d%8d%7d%7d\n", page_table[j].page_id, j, page_table[j].load_time,page_table[j].last_visit_time);}; break;排序函数int cmp3(const void *p, const void *q){//按照装入时间从小到大排序,,并且不要排序没页面的部分if ((*(struct Page_table*)p).page_id != -1 && (*(struct Page_table*)q).page_id != -1){ int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;if (c > 0)return 1;elsereturn -1;}}(7)并计算出中断页面次数及命中概率,并打印页表出来int sum;sum = ((virtual_page_number - page_interrupt_number) * 100 / virtual_page_number);printf("缺页中断次数:%d\n", page_interrupt_number);printf("中断命中率:%d%%\n", sum);printf("打印出页面\n");for (int i = 0; i < page_frame_number; i++){for (int g = 1; g <= virtual_page_number; g++){printf("%4d", pr[i][g]);}printf("\n");}4、实现(1)选择FIFO算法(2)输入页面号,列出页表详细信息(3)输入-1,结束输入,显示统计结果及页表二、最近最少使用页面置换算法1、基本思想:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经很久没有使用的页面很可能在未来较长的一段时间不会被用到。
这个,就是著名的局部性原理——比存速度还要快的cache,也是基于同样的原理运行的。
因此,我们只需要在每次调换时,找到最近最久使用的那个页面调出存。
2、算法流程图3、步骤说明:(1)初始化void init(){//初始化int i;for (i = 0; i < page_frame_number; i++){page_table[i].page_id = -1;page_table[i].load_time = -1;page_table[i].last_visit_time = -1;}}(2)选择算法,输入插入页面号。
进入判断函数int judge(){//判断页框是否满,或者页框里面是否已存在页面int i;for (i = 0; i < page_frame_number; i++){if (page_table[i].page_id == -1 || page_table[i].page_id == page_id) return i;}return -2;}之后根据返回数的不同决定了不同类型返回-2则说明页框满且页框里面没有存在要插入的页面。
返回-1则说明页框未满返回其它数则说明页框里存在相同的页面(3)//当没有空页框,并且页面本身也没有存在,则执行一下代码qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp1);//按照最后访问时间从小到大排序page_table[0].page_id = page_id;page_table[0].load_time = counter;page_table[0].last_visit_time = counter;page_interrupt_number++;将页框号为0的页面置换成最新插入的页面。
int cmp1(const void *p, const void *q){//按照最后访问时间从小到大排序int c = (*(struct Page_table*)p).last_visit_time - (*(structPage_table*)q).last_visit_time;if (c > 0)return 1;elsereturn -1;}排序函数,将页面按最后访问时间从小到大排序(4)//如果页面未满,则将页面替换在空页框里if (page_table[j].page_id == -1){page_table[j].page_id = page_id;page_table[j].load_time = counter;page_table[j].last_visit_time = counter;page_interrupt_number++;则将页面替换在页框号最小的空页框里(5)//如果页面本身存在页框中,则执行一下代码page_table[j].last_visit_time = counter;则更新页面的最近访问时间(6)qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp2);//按照最后访问时间从小到大排序print(2);打印出页表详细信息printf("页表信息:\n页号页框号装入时间最近访问时间\n");for (j = 0; j < page_frame_number; j++){printf("%4d%8d%7d%7d\n", page_table[j].page_id, j, page_table[j].load_time, page_table[j].last_visit_time);}; break;排序函数int cmp2(const void *p, const void *q){//按照最后访问时间从小到大排序,,并且不要排序没页面的部分if ((*(struct Page_table*)p).page_id != -1 && (*(struct Page_table*)q).page_id != -1){ int c = (*(struct Page_table*)p).last_visit_time - (*(structPage_table*)q).last_visit_time;if (c > 0)return 1;elsereturn -1;}}(7)并计算出中断页面次数及命中概率,并打印页表出来int sum;sum = ((virtual_page_number - page_interrupt_number) * 100 / virtual_page_number);printf("缺页中断次数:%d\n", page_interrupt_number);printf("中断命中率:%d%%\n", sum);printf("打印出页面\n");for (int i = 0; i < page_frame_number; i++){for (int g = 1; g <= virtual_page_number; g++){printf("%4d", pr[i][g]);}printf("\n");}4、实现(1)选择LRU算法(2)输入页面号,并打印出详细页表(3)输入-1,结束输入,显示统计结果及页表三、代码// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。