#include<iostream>#include<process.h>#include<stdlib.h>#include<ctime>#include<conio.h>#include<stdio.h>#include<string.h>using namespace std;#define myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n")/*表格控制*/#define bsize 4 //物理块大小#define psize 16 //进程大小void chushihua();//初始化函数void ymzh();void yemianzhihuan ();void changeaddr(struct page p[], int logaddr);void dizhizhuanhuan();void menu();int wang();int yemianliu[32]={0};//全局变量数组,地址流int p;struct page {int pno;//页号int flag;//标志位int cno;//主存号int modf;//修改位int addr;//外存地址}page; //全局变量p是一共有多少地址流typedef struct pagel{int num; /*记录页面号*/int time; /*记录调入内存时间*/}pagel; /*页面逻辑结构,方便算法实现*/pagel b[bsize]; /*内存单元数*/int c[bsize][psize];/*保存内存当前的状态:缓冲区*/int queue[100];/*记录调入队列*/int k;/*调入队列计数变量*/int phb[bsize]={0};//物理块标号int pro[psize]={0};//进程序列号int flag[bsize]={0};//进程等待次数(存放最久未被使用的进程标志)*/int i=0,j=0;//i表示进程序列号,j表示物理块号*/int m =-1,n =-1;//物理块空闲和进程是否相同判断标志*/int mmax=-1, maxflag=0;//标记替换物理块进程下标*/int count =0; //统计页面缺页次数void chushihua() //初始化函数{int t;srand(time(0));//随机产生指令序列p=12+rand()%32;cout<<"地址流序列:";cout<<endl;for(i=0; i<p; i++){t=1+rand()%9;yemianliu[i]=t;//将随机产生的指令数存入页面流}for (i=p-1;i>=0;i--){cout<<yemianliu[i]<<" ";}cout<<endl;}void ymzh(){chushihua();yemianzhihuan();}void yemianzhihuan(){int a;printf("----------------------------------\n");printf("欢迎使用分页模拟实验系统\n");printf("----------------------------------");printf("\n");printf("1.进入硬件地址变换算法 \n");printf("------------------------\n");printf("2.进入页面置换算法 \n");printf("\n");printf("请输入您的选择:");switch(a){ca 1:ymzh();break;ca 2:wang();break;default:cout<<"输入有误,请重新输入!"<<endl;break;}}void changeaddr(struct page p[], int logaddr){//地址变换int j=logaddr/64;//对应的块号int k=logaddr%64; //对应的偏移量int flag=0;int addr;for(int i=0;i<8;i++){if(p[i].pno==j)//找到对应的页号{if(p[i].flag==1)//页面标志为1{addr=p[i].cno*64+k;cout<<"物理地址为:"<<addr<<endl;cout<<"详细信息:"<<"\t页面号:"<<p[i].pno<<"\t 主存号:"<<p[i].cno<<"\t偏移量:"<<k<<endl;flag=1;break;}}}if(flag==0)cout<<"该页不在主存,产生缺页中断"<<endl;}void dizhizhuanhuan(){int a;int ins;//指令逻辑地址struct page p[8];p[0].pno=0;p[0].flag=1;p[0].cno=5;p[0].modf=1;p[0].addr=011;p[1].pno=1;p[1].flag=1;p[1].cno=8;p[1].modf=1;p[1].addr=012;p[2].pno=2;p[2].flag=1;p[2].cno=9;p[2].modf=0;p[2].addr=013;p[3].pno=3;p[3].flag=1;p[3].cno=10;p[3].modf=0;p[3].addr=015;p[4].pno=4;p[4].flag=0;p[4].addr=017;p[5].pno=5;p[5].flag=0;p[5].addr=025;p[6].pno=6;p[6].flag=0;p[6].addr=212;p[7].pno=7;p[7].flag=0;p[7].addr=213;printf("\t\t\t--------------------------扬州是哪里------\n");printf("\t\t\t欢迎使用分页模拟实验系统\n");printf(理论经济学"\t\t\t---------------------------------\n");printf("\t\t\t\n");printf("\t\t\t1.输入指令 \n");printf("\t\t\t------------------------\n");printf("\t\t\t2.进入页面置换算法 \n");printf("\t\t\t------------------------\n");printf("\t\t\t0.exit \n");printf("\t\t\t\n");while(a!=0){cout<<endl<<"请输入您的选择:";cin>>a;cout<<"页号"<<"标记位"<<"外存地址"<<"主存号"<<endl;for(int i=0;i<8;i++){cout<<p[i].pno<洛阳音乐喷泉图片<"\t"<<p[i].flag<<"\t"<<p[i].addr<<"\t";if(p[i].flag)cout<<p[i].cno;cout<<endl;}switch(a){ca 0:printf("\t\t\t再见!\t\t\t\n"); break;ca 1:cout<<"请输入指令的逻辑地址:";cin>>ins;changeaddr(p, ins);break;ca 2: system("cls"); a=wang();break;default:cout<<"输入有误,请重新输入!"<<endl;break;}}}void menu(){int a;printf("\t\t\t--------------------------------\n");printf("\t\t\t欢迎使用分页模拟实验系统\n");printf("\t\t\t---------------------------------\n");printf("\t\t\t\n");printf("\t\t\t1.输入指令 \n");printf("\t\t\t------------------------\n");printf("\t\t\t2.进入页面置换算法 \n");printf("\t\t\t------------------------\n");printf("\t\t\t0.exit \n");printf("\t\t\t\n");printf("请选择所要执行的操作:");scanf("%d",&a);switch(a){ca 0: printf("\t\t\t-再见!-\t\t\t\n");break;ca 1: dizhizhuanhuan (); break;ca 2: wang (); break;default:cout<<"输入有误,请重新输入!"<<endl;break;}}int main(){menu();}//****************随机产生序列号函数int* build(){printf("随机产生一个进程序列号为:\n");int i=0;for(i=0; i<psize; i++){pro[i]=10*rand()/(rand_max+1)+1;printf("%d ", pro[i]);}printf("\n");return(pro);}//***************************************查找空闲物理块int archpb(){for (工程造价是干啥的j=0;j<bsize; j++){if(phb[j] == 0){m=j;return m;break;}}return -1;}//************************************查找相同进程int archpro(){for(j=0;j< bsize;j++){if(phb[j] =pro[i]){n=j;return j;}}return -1;}//*************************初始化内存void empty(){for(i=0;i<bsize;i++)phb[i]=0;count=0; //计数器置零} //******先进先出页面置换算法void fifo(){for( i=0; i<psize; i++){// m=archpb();// n=archpro();//找到第一个空闲的物理快for(j=0;j<bsize;j++) {if(phb[j] == 0){m=j;break;}}//找与进程相同的标号for(j=0;j<bsize;j++) {if(phb[j] == pro[i]){n=j;}}//找flag值最大的for(j=0;j<bsize;j++){if(flag[j]>maxflag){maxflag = flag[j];mmax = j;}}if(n == -1)//不存在相同进程{if(m != -1)//存在空闲物理块{phb[m]=pro[i];//进程号填入该空闲物理块// count++;flag[m]=0;for (j=0;j<=m; j++){flag[j]++;}m=-1;}el//不存在空闲物理块{phb[mmax] =pro[i];flag[mmax] =0;for (j=0;j<bsize;j++){flag[j]++;}mmax = -1;maxflag = 0;count++;}}el//存在相同的进程{phb[n] = pro[i];for(j=0;j<bsize;j++){flag[j]++;}n=-1;}for(j=0;j < bsize;j++){printf("%d ", phb[j]);}printf("\n");}printf("缺页次数为:%d\n",count);printf("缺页率 :%16. 6f",(float)count/psize);printf("\n");}/*初始化内存单元、缓冲区*/void init(pagel *b,int c[bsize][psize]){int i,j;for (i=0;i<psize;i++){b[i].num=-1;b[i].time=psize-i-1;}for(i=0;i<bsize;i++)for(j=0;j<psize;j++)c[i][j]=-1;}/*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/int getmax(pagel *b){int i;int max=-1;int tag=0;for(i=0;i<bsize;i++){if(b[i].time>max){max=b[i].time;tag= i;}}return tag;}/*判断页面是否已在内存中*/int equation(int fold, pagel *b){int i;for(i=0;i<bsize;i++){if(fold==b[i]. num)return i;}return -1;}/*lru核心部分*/void lruu(int fold, pagel *b){int i;int val;val=equation(fold, b);if (val>=0){b[val].time=0;f吉林高考or(i=0;i<bsize;i++)if (i!=val)b[i].time++;}el{queue[++k]=fold;/*记录调入页面*/val=getmax(b);b[val].num=fold;b[val].time=0;for (i=0;i<bsize;i++){// urlcount++;if (i!=val)b[i].time++;}}}void lru(){int i,j;k=0;init(b, c);for(i=0; i<psize; i++){lruu(pro[i],b);c[0][i]=pro[i];/*记录当前的内存单元中的页面*/for(j=0;j<bsize;j++)c[j][i]=b[j].num;}/*结果输出*/printf("内存状态为:\n");myprintf;for(j=0;j<psize;j++)printf("|%2d", pro[j]);printf("|\n");myprintf;for(i=0;i<bsize;i++){for(j=0; j<psize; j++){if(c[i][j]==-1)printf("|%2c",32);elprintf("|%2d",c[i][j]);}printf("|\n");}myprintf;// printf("\n调入队列为:");// for(i=0;i<k;i++)// printf("%3d", queue[i]);printf("\n缺页次数为:%6d\n 缺页率 :%16. 6f", k+1,(float)(k+1)/psize);}//********主函数int wang(){int l;do{printf("\t\t\t--------------------------------\n");printf("\t\t\t欢迎使用分页模拟实验系统\n");printf("\t\t\t---------------------------------\n");printf("\t\t\t\n");printf("\t\t\t 虚拟内存 \n");printf("\t\t\t------------------------\n");printf("\t\t\t1.产生随机序列 \n");printf("\t\t\t------------------------\n");printf("\t\t\t2.最近最久未使用 \n");printf("\t\t\t------------------------\n");printf("\t\t\t3.先进先出 \n");printf("\t\t\t------------------------\n");printf("\t\t\t0.退出 \n");printf("\t\t\t\n");printf("请选择所要执行的操作:");scanf("%d",&l);switch(l){ca 0: printf("\t\t\t再见!t\t\t\n"); break;ca 1: build(); break;ca 2: printf("最近最久未使用\n"); lru();empty(); printf("\n");break;ca 3: printf("先进先出算法\n"); fifo();empty();printf("\n");break;default:printf("请输入正确的选项号!");printf("\n\n");break;}}while(l !=0 );return l;}
到此这篇关于c语言实现页面置换算法(fifo、lru)的文章就介绍到这了,更多相关c语言 页面置换算法内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 02:21:06,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/32f3454b25333676d405a4f39163f61f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C语言实现页面置换算法(FIFO、LRU).doc
本文 PDF 下载地址:C语言实现页面置换算法(FIFO、LRU).pdf
留言与评论(共有 0 条评论) |