網站首頁 編程語言 正文
1.實現(xiàn)效果
2.實現(xiàn)源代碼?
#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();//初始化函數(shù) void ymzh(); void yemianzhihuan (); void changeaddr(struct Page p[], int logaddr); void dizhizhuanhuan(); void menu(); int wang(); int yemianliu[32]={0};//全局變量數(shù)組,地址流 int p; struct Page { int pno;//頁號 int flag;//標志位 int cno;//主存號 int modf;//修改位 int addr;//外存地址 }Page; //全局變量p是一共有多少地址流 typedef struct pagel { int num; /*記錄頁面號*/ int time; /*記錄調入內存時間*/ }Pagel; /*頁面邏輯結構,方便算法實現(xiàn)*/ Pagel b[bsize]; /*內存單元數(shù)*/ int c[bsize][psize];/*保存內存當前的狀態(tài):緩沖區(qū)*/ int queue[100];/*記錄調入隊列*/ int k;/*調入隊列計數(shù)變量*/ int phb[bsize]={0};//物理塊標號 int pro[psize]={0};//進程序列號 int flag[bsize]={0};//進程等待次數(shù)(存放最久未被使用的進程標志)*/ int i=0,j=0;//i表示進程序列號,j表示物理塊號*/ int m =-1,n =-1;//物理塊空閑和進程是否相同判斷標志*/ int mmax=-1, maxflag=0;//標記替換物理塊進程下標*/ int count =0; //統(tǒng)計頁面缺頁次數(shù) void chushihua() //初始化函數(shù) { 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;//將隨機產生的指令數(shù)存入頁面流 } for (i=p-1;i>=0;i--) { cout<<yemianliu[i]<<" "; } cout<<endl; } void ymzh() { chushihua(); yemianzhihuan(); } void yemianzhihuan() { int a; printf("----------------------------------\n"); printf("☆☆歡迎使用分頁模擬實驗系統(tǒng)☆☆\n"); printf("----------------------------------"); printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"); printf("☆☆1.進入硬件地址變換算法 ☆☆\n"); printf("☆☆------------------------☆☆\n"); printf("☆☆2.進入頁面置換算法 ☆☆\n"); printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"); printf("請輸入您的選擇:"); switch(a) { case 1: ymzh(); break; case 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☆☆歡迎使用分頁模擬實驗系統(tǒng)☆☆\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(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) { case 0:printf("\t\t\t再見!\t\t\t\n"); break; case 1: cout<<"請輸入指令的邏輯地址:"; cin>>ins; changeaddr(p, ins);break; case 2: system("CLS"); a=wang();break; default:cout<<"輸入有誤,請重新輸入!"<<endl;break; } } } void menu() { int a; printf("\t\t\t--------------------------------\n"); printf("\t\t\t☆☆歡迎使用分頁模擬實驗系統(tǒng)☆☆\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("請選擇所要執(zhí)行的操作:"); scanf("%d",&a); switch(a) { case 0: printf("\t\t\t-再見!-\t\t\t\n");break; case 1: dizhizhuanhuan (); break; case 2: wang (); break; default:cout<<"輸入有誤,請重新輸入!"<<endl;break; } } int main() { menu(); } //****************隨機產生序列號函數(shù) 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 searchpb() { for (j=0;j<bsize; j++) { if(phb[j] == 0) { m=j; return m; break; } } return -1; } //************************************查找相同進程 int searchpro() { 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; //計數(shù)器置零 } //******先進先出頁面置換算法 void FIFO() { 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("缺頁次數(shù)為:%d\n",count); printf("缺頁率 :%16. 6f",(float)count/psize); printf("\n"); } /*初始化內存單元、緩沖區(qū)*/ 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; } /*取得在內存中停留最久的頁面,默認狀態(tài)下為最早調入的頁面*/ 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; 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++; } } } 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("內存狀態(tài)為:\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); else printf("|%2d",c[i][j]); } printf("|\n"); } Myprintf; // printf("\n調入隊列為:"); // for(i=0;i<k;i++) // printf("%3d", queue[i]); printf("\n缺頁次數(shù)為:%6d\n 缺頁率 :%16. 6f", k+1,(float)(k+1)/psize); } //********主函數(shù) int wang() { int sel; do{ printf("\t\t\t--------------------------------\n"); printf("\t\t\t☆☆歡迎使用分頁模擬實驗系統(tǒng)☆☆\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("請選擇所要執(zhí)行的操作:"); scanf("%d",&sel); switch(sel) { case 0: printf("\t\t\t再見!t\t\t\n"); break; case 1: build(); break; case 2: printf("最近最久未使用\n"); LRU();empty(); printf("\n");break; case 3: printf("先進先出算法\n"); FIFO();empty();printf("\n");break; default:printf("請輸入正確的選項號!");printf("\n\n");break; } }while(sel !=0 ); return sel; }
原文鏈接:https://www.cnblogs.com/SMIL/p/15675161.html
相關推薦
- 2022-10-19 C#如何提取經緯度文件中的經緯度數(shù)據(jù)_C#教程
- 2022-02-09 C++解決輸出鏈表中倒數(shù)k個結點的問題_C 語言
- 2022-02-17 springBoot自定義場景啟動器starter
- 2022-09-18 Redis6?主從復制及哨兵機制的實現(xiàn)_Redis
- 2022-01-22 Springboot + Redis 哨兵模式
- 2022-08-27 JQuery自定義模態(tài)框效果_jquery
- 2022-03-19 Docker匿名掛載和具名掛載的具體使用_docker
- 2023-01-20 Python-with?open()?as?f的用法及說明_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支