#include<iostream>#include<process.h>#include<stdlib.h>#include<ctime>#include<conio.h>#include<stdio.h>#include<string.h>usingnamespacestd;#defineMyprintfprintf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n")/*表格控制*/#definebsize4//物理塊大小#definepsize16//進程大小voidchushihua();//初始化函數voidymzh();voidyemianzhihuan();voidchangeaddr(structPagep[],intlogaddr);voiddizhizhuanhuan();voidmenu();intwang();intyemianliu[32]={0};//全局變量數組,地址流intp;structPage{intpno;//頁號intflag;//標志位intcno;//主存號intmodf;//修改位intaddr;//外存地址}Page;//全局變量p是一共有多少地址流typedefstructpagel{intnum;/*記錄頁面號*/inttime;/*記錄調入內存時間*/}Pagel;/*頁面邏輯結構,方便算法實現*/Pagelb[bsize];/*內存單元數*/intc[bsize][psize];/*保存內存當前的狀態:緩沖區*/intqueue[100];/*記錄調入隊列*/intk;/*調入隊列計數變量*/intphb[bsize]={0};//物理塊標號intpro[psize]={0};//進程序列號intflag[bsize]={0};//進程等待次數(存放最久未被使用的進程標志)*/inti=0,j=0;//i表示進程序列號,j表示物理塊號*/intm=-1,n=-1;//物理塊空閑和進程是否相同判斷標志*/intmmax=-1,maxflag=0;//標記替換物理塊進程下標*/intcount=0;//統計頁面缺頁次數voidchushihua()//初始化函數{intt;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;}voidymzh(){chushihua();yemianzhihuan();}voidyemianzhihuan(){inta;printf("----------------------------------\n");printf("☆☆歡迎使用分頁模擬實驗系統☆☆\n");printf("----------------------------------");printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");printf("☆☆1.進入硬件地址變換算法☆☆\n");printf("☆☆------------------------☆☆\n");printf("☆☆2.進入頁面置換算法☆☆\n");printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");printf("請輸入您的選擇:");switch(a){case1:ymzh();break;case2:wang();break;default:cout<<"輸入有誤,請重新輸入!"<<endl;break;}}voidchangeaddr(structPagep[],intlogaddr){//地址變換intj=logaddr/64;//對應的塊號intk=logaddr%64;//對應的偏移量intflag=0;intaddr;for(inti=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;}voiddizhizhuanhuan(){inta;intins;//指令邏輯地址structPagep[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\t☆☆1.輸入指令☆☆\n");printf("\t\t\t☆☆------------------------☆☆\n");printf("\t\t\t☆☆2.進入頁面置換算法☆☆\n");printf("\t\t\t☆☆------------------------☆☆\n");printf("\t\t\t☆☆0.EXIT☆☆\n");printf("\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");while(a!=0){cout<<endl<<"請輸入您的選擇:";cin>>a;cout<<"頁號"<<"標記位"<<"外存地址"<<"主存號"<<endl;for(inti=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){case0:printf("\t\t\t再見!\t\t\t\n");break;case1:cout<<"請輸入指令的邏輯地址:";cin>>ins;changeaddr(p,ins);break;case2:system("CLS");a=wang();break;default:cout<<"輸入有誤,請重新輸入!"<<endl;break;}}}voidmenu(){inta;printf("\t\t\t--------------------------------\n");printf("\t\t\t☆☆歡迎使用分頁模擬實驗系統☆☆\n");printf("\t\t\t---------------------------------\n");printf("\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");printf("\t\t\t☆☆1.輸入指令☆☆\n");printf("\t\t\t☆☆------------------------☆☆\n");printf("\t\t\t☆☆2.進入頁面置換算法☆☆\n");printf("\t\t\t☆☆------------------------☆☆\n");printf("\t\t\t☆☆0.EXIT☆☆\n");printf("\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");printf("請選擇所要執行的操作:");scanf("%d",&a);switch(a){case0:printf("\t\t\t-再見!-\t\t\t\n");break;case1:dizhizhuanhuan();break;case2:wang();break;default:cout<<"輸入有誤,請重新輸入!"<<endl;break;}}intmain(){menu();}//****************隨機產生序列號函數int*build(){printf("隨機產生一個進程序列號為:\n");inti=0;for(i=0;i<psize;i++){pro[i]=10*rand()/(RAND_MAX+1)+1;printf("%d",pro[i]);}printf("\n");return(pro);}//***************************************查找空閑物理塊intsearchpb(){for(j=0;j<bsize;j++){if(phb[j]==0){m=j;returnm;break;}}return-1;}//************************************查找相同進程intsearchpro(){for(j=0;j<bsize;j++){if(phb[j]=pro[i]){n=j;returnj;}}return-1;}//*************************初始化內存voidempty(){for(i=0;i<bsize;i++)phb[i]=0;count=0;//計數器置零}//******先進先出頁面置換算法voidFIFO(){for(i=0;i<psize;i++){//m=searchpb();//n=searchpro();//找到第一個空閑的物理快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;}else//不存在空閑物理塊{phb[mmax]=pro[i];flag[mmax]=0;for(j=0;j<bsize;j++){flag[j]++;}mmax=-1;maxflag=0;count++;}}else//存在相同的進程{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");}/*初始化內存單元、緩沖區*/voidInit(Pagel*b,intc[bsize][psize]){inti,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;}/*取得在內存中停留最久的頁面,默認狀態下為最早調入的頁面*/intGetMax(Pagel*b){inti;intmax=-1;inttag=0;for(i=0;i<bsize;i++){if(b[i].time>max){max=b[i].time;tag=i;}}returntag;}/*判斷頁面是否已在內存中*/intEquation(intfold,Pagel*b){inti;for(i=0;i<bsize;i++){if(fold==b[i].num)returni;}return-1;}/*LRU核心部分*/voidLruu(intfold,Pagel*b){inti;intval;val=Equation(fold,b);if(val>=0){b[val].time=0;for(i=0;i<bsize;i++)if(i!=val)b[i].time++;}else{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++;}}}voidLRU(){inti,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);elseprintf("|%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);}//********主函數intwang(){intsel;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\t☆☆1.產生隨機序列☆☆\n");printf("\t\t\t☆☆------------------------☆☆\n");printf("\t\t\t☆☆2.最近最久未使用☆☆\n");printf("\t\t\t☆☆------------------------☆☆\n");printf("\t\t\t☆☆3.先進先出☆☆\n");printf("\t\t\t☆☆------------------------☆☆\n");printf("\t\t\t☆☆0.退出☆☆\n");printf("\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");printf("請選擇所要執行的操作:");scanf("%d",&sel);switch(sel){case0:printf("\t\t\t再見!t\t\t\n");break;case1:build();break;case2:printf("最近最久未使用\n");LRU();empty();printf("\n");break;case3:printf("先進先出算法\n");FIFO();empty();printf("\n");break;default:printf("請輸入正確的選項號!");printf("\n\n");break;}}while(sel!=0);returnsel;}
到此,相信大家對“C語言怎么實現頁面置換算法”有了更深的了解,不妨來實際操作一番吧!這里是本站網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
本報記者莊安實習生楊紅勇近日,成都一女子報警稱被電信詐騙。騙子先誘導她下載了兩個軟件,讓她無法接聽別人的電話。對方以她涉嫌犯罪,需要證明清白為由,誘導她做了一些操作后,她銀行卡里的9萬多元被轉走,其中8.7萬元是以山西兩家公司的名義“充電費”。7月10日,被騙者傅莎(化名)告訴本報(www.thepaper.cn),成都市公安局金牛分局已經受理了她的報案。目前,案件仍在進一步調查中。金牛公安分局7...
2022年青島人口總數量是多少?青島2021年常住人口有多少?一起簡單了解下。2022年青島市人口總數1040.77一萬人。青島市總人口穩步增長,2022年底,全市常住人口穩步增長。1040.77萬人,比去年年底增長1.49%。與第七次全國人口普查相比,1007.17與1萬人相比,青島常住人口增長33.6萬人。青島到底有多少人?第六次全國人口普查青島常住人口871.51萬人,其中市區人口為萬人,其...
咖啡是一種非常受歡迎的飲料。對于咖啡愛好者來說,咖啡不僅能帶來味蕾的享受,在下午愛打瞌睡的時候來一杯咖啡,還能提神醒腦。相比奶茶等街頭飲品,很多人對咖啡的印象似乎更友好一些,認為咖啡很好喝,提神,不容易讓人發胖。其實并不是這樣的??Х鹊昀锝洺?梢钥吹揭韵铝N咖啡。很多朋友點咖啡的時候,往往都在必點清單上。但是,很多人喝了之后,發現自己胖了很多。接下來我就給大家說說這幾款不推薦減肥的咖啡,看看你經常...