intopt(){//最佳页面置换算法
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int page_lack =0;memset(pre,0,sizeof(pre));memset(dist,0x3f,sizeof(dist));memset(block,-1,sizeof(block));for(int i = n; i >=1;--i){for(int j =0; j <= page_max;++j)if(pre[j])
dist[i][j]= pre[j]- i;
pre[page[i]]= i;}for(int i =1; i <= n;++i){int j;int max_dist =0, p;for(j =1; j <= m;++j){if(block[j]==-1){//改块没有放入页面,则直接放入, 产生缺页
block[j]= page[i];
cout <<"页面"<< page[i]<<"不在内存,直接放入物理块"<< j <<"中!"<< endl;
page_lack++;break;}elseif(block[j]== page[i])//页面存在内存中 break;if(max_dist < dist[i][block[j]]){
max_dist = dist[i][block[j]];//说明block[j] 对应的页面以后会长时间不会用到
p = j;}}if(j > m){
cout <<"页面"<< page[i]<<"不在内存,将物理块"<< p <<"中的页面"<< block[p]<<"替换掉!"<< endl;
block[p]= page[i];
page_lack++;}
cout << endl <<"当前内存中页面的情况:"<< endl;for(int k =1; k <= m;++k)//内存中页面加载情况
cout << block[k]<<" ";
cout << endl << endl;}return page_lack;//返回缺页次数 }
LRU
intlru(){//最近最久未使用算法
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int page_lack =0;memset(pre,0,sizeof(pre));memset(dist,0x3f,sizeof(dist));memset(block,-1,sizeof(block));for(int i =1; i <= n;++i){for(int j =0; j <= page_max;++j)if(pre[j])
dist[i][j]= i - pre[j];
pre[page[i]]= i;}for(int i =1; i <= n;++i){//开始访问页面,初始是内存中没有分页 int j;int max_dist =0, p;for(j =1; j <= m;++j){if(block[j]==-1){
block[j]= page[i];
cout <<"页面"<< page[i]<<"不在内存,直接放入物理块"<< j <<"中!"<< endl;
page_lack++;break;}elseif(block[j]== page[i])//页面存在内存中 break;if(max_dist < dist[i][block[j]]){
max_dist = dist[i][block[j]];//说明block[j] 对应的页面以后会长时间不会用到
p = j;}}if(j > m){
cout <<"页面"<< page[i]<<"不在内存,将物理块"<< p <<"中的页面"<< block[p]<<"替换掉!"<< endl;
block[p]= page[i];
page_lack++;}
cout << endl <<"当前内存中页面的情况:"<< endl;for(int k =1; k <= m;++k)//内存中页面加载情况
cout << block[k]<<" ";
cout << endl << endl;}return page_lack;//返回缺页次数 }
FIFO
intfifo(){//先进先出页面置换算法
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int page_lack =0;memset(block,-1,sizeof(block));int index =1;for(int i =1; i <= n;++i){if(index > m) index =1;
set<int>::iterator it;
it = page_set.find(page[i]);if(it == page_set.end()){if(block[index]!=-1)
page_set.erase(block[index]);
page_set.insert(page[i]);
block[index++]= page[i];++page_lack;}for(int k =1; k <= m;++k)
cout << block[k]<<" ";
cout << endl;}return page_lack;}
CLOCK
int nru[N];//表示 物理块 i 最近时候被访问过 int page_in_block[N];//页面 i 在 block的下标索引 intclock(){
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int index =1;int page_lack =0;memset(block,-1,sizeof(block));for(int i =1; i <= n;++i){if(page_in_block[page[i]]){
nru[page_in_block[page[i]]]=1;
cout << endl <<"第"<< i <<"次: 页面"<< page[i]<<"已经存在物理块"<< page_in_block[page[i]]<<"中!"<< endl;}else{while(true){if(index > m) index =1;if(block[index]==-1){
nru[index]=1;
page_in_block[page[i]]= index;
block[index++]= page[i];++page_lack;break;}if(block[index]== page[i]){
nru[index++]=1;break;}else{if(nru[index]==0){//替换该页面
nru[index]=1;
page_in_block[block[index]]=0;
cout << endl <<"第"<< i <<"次: 物理块"<< index <<"中的页面"<< block[index]<<"最近未被使用,将要被页面"<< page[i]<<"替换!"<< endl;
page_in_block[page[i]]= index;
block[index++]= page[i];++page_lack;break;}else
nru[index++]=0;}}}for(int k =1; k <= m;++k)
cout << block[k]<<" ";
cout << endl;}return page_lack;}
源码
#include<iostream>#include<stdio.h>#include<map>#include<algorithm>#include<set>#include<cstdio>#include<cstring>#include<cmath>#define N 200usingnamespace std;int page[N];//页面引用号 int block[N];//物理块,内存 int dist[N][N];int n;//页面引用号个数 int m;//驻留集数目 int page_max;//最大页面号 char userOpt;//用户选择按钮 float page_rate;//缺页率int pre[N];//page[i]在page中的索引intopt(){//最佳页面置换算法
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int page_lack =0;memset(pre,0,sizeof(pre));memset(dist,0x3f,sizeof(dist));memset(block,-1,sizeof(block));for(int i = n; i >=1;--i){for(int j =0; j <= page_max;++j)if(pre[j])
dist[i][j]= pre[j]- i;
pre[page[i]]= i;}for(int i =1; i <= n;++i){int j;int max_dist =0, p;for(j =1; j <= m;++j){if(block[j]==-1){//改块没有放入页面,则直接放入, 产生缺页
block[j]= page[i];
cout <<"页面"<< page[i]<<"不在内存,直接放入物理块"<< j <<"中!"<< endl;
page_lack++;break;}elseif(block[j]== page[i])//页面存在内存中 break;if(max_dist < dist[i][block[j]]){
max_dist = dist[i][block[j]];//说明block[j] 对应的页面以后会长时间不会用到
p = j;}}if(j > m){
cout <<"页面"<< page[i]<<"不在内存,将物理块"<< p <<"中的页面"<< block[p]<<"替换掉!"<< endl;
block[p]= page[i];
page_lack++;}
cout << endl <<"当前内存中页面的情况:"<< endl;for(int k =1; k <= m;++k)//内存中页面加载情况
cout << block[k]<<" ";
cout << endl << endl;}return page_lack;//返回缺页次数 }intlru(){//最近最久未使用算法
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int page_lack =0;memset(pre,0,sizeof(pre));memset(dist,0x3f,sizeof(dist));memset(block,-1,sizeof(block));for(int i =1; i <= n;++i){for(int j =0; j <= page_max;++j)if(pre[j])
dist[i][j]= i - pre[j];
pre[page[i]]= i;}for(int i =1; i <= n;++i){//开始访问页面,初始是内存中没有分页 int j;int max_dist =0, p;for(j =1; j <= m;++j){if(block[j]==-1){
block[j]= page[i];
cout <<"页面"<< page[i]<<"不在内存,直接放入物理块"<< j <<"中!"<< endl;
page_lack++;break;}elseif(block[j]== page[i])//页面存在内存中 break;if(max_dist < dist[i][block[j]]){
max_dist = dist[i][block[j]];//说明block[j] 对应的页面以后会长时间不会用到
p = j;}}if(j > m){
cout <<"页面"<< page[i]<<"不在内存,将物理块"<< p <<"中的页面"<< block[p]<<"替换掉!"<< endl;
block[p]= page[i];
page_lack++;}
cout << endl <<"当前内存中页面的情况:"<< endl;for(int k =1; k <= m;++k)//内存中页面加载情况
cout << block[k]<<" ";
cout << endl << endl;}return page_lack;//返回缺页次数 }
set<int>page_set;intfifo(){//先进先出页面置换算法
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int page_lack =0;memset(block,-1,sizeof(block));int index =1;for(int i =1; i <= n;++i){if(index > m) index =1;
set<int>::iterator it;
it = page_set.find(page[i]);if(it == page_set.end()){if(block[index]!=-1)
page_set.erase(block[index]);
page_set.insert(page[i]);
block[index++]= page[i];++page_lack;}for(int k =1; k <= m;++k)
cout << block[k]<<" ";
cout << endl;}return page_lack;}int nru[N];//表示 物理块 i 最近时候被访问过 int page_in_block[N];//页面 i 在 block的下标索引 intclock(){
cout <<"请输入页面数:"<<"请输入驻留集大小:"<< endl;
cin >> n >> m;
cout <<"请输入页面引用顺序:"<< endl;for(int i =1; i <= n;++i){
cin >> page[i];
page_max =max(page_max, page[i]);}int index =1;int page_lack =0;memset(block,-1,sizeof(block));for(int i =1; i <= n;++i){if(page_in_block[page[i]]){
nru[page_in_block[page[i]]]=1;
cout << endl <<"第"<< i <<"次: 页面"<< page[i]<<"已经存在物理块"<< page_in_block[page[i]]<<"中!"<< endl;}else{while(true){if(index > m) index =1;if(block[index]==-1){
nru[index]=1;
page_in_block[page[i]]= index;
block[index++]= page[i];++page_lack;break;}if(block[index]== page[i]){
nru[index++]=1;break;}else{if(nru[index]==0){//替换该页面
nru[index]=1;
page_in_block[block[index]]=0;
cout << endl <<"第"<< i <<"次: 物理块"<< index <<"中的页面"<< block[index]<<"最近未被使用,将要被页面"<< page[i]<<"替换!"<< endl;
page_in_block[page[i]]= index;
block[index++]= page[i];++page_lack;break;}else
nru[index++]=0;}}}for(int k =1; k <= m;++k)
cout << block[k]<<" ";
cout << endl;}return page_lack;}voidprint_menu(){
cout <<"******内存分配和回收******"<< endl;
cout <<"0.退出"<< endl;
cout <<"1.OPT算法实现"<< endl;
cout <<"2.LRU算法实现"<< endl;
cout <<"3.FIFO算法实现"<< endl;
cout <<"4.CLOCK算法"<< endl;
cout <<"5.显示缺页率对比表"<< endl;}voidpage_rate_print(){int a,b,c,d;
cout<<"当前所用驻留块大小:"<<endl;while(1){scanf("%c",&userOpt);if( userOpt =='3'||userOpt =='4'||userOpt =='5')break;}switch(userOpt){case'3':
cout<<"\nopt缺页率\tlru缺页率\tfifo缺页率\tclock缺页率"<<endl;
a=7;b=10;c=9;d=12;
cout<<(double)a/d <<"\t"<<(double)b/d<<"\t"<<(double)c/d<<"\t"<<" "<<(double)c/d<<"\t"<<endl;break;case'4':
cout<<"\nopt缺页率\tlru缺页率\tfifo缺页率\tclock缺页率"<<endl;
a=6;b=8;c=10;d=12;
cout<<(double)a/d <<"\t"<<(double)b/d<<"\t"<<(double)c/d<<"\t"<<" "<<(double)c/d<<"\t"<<endl;break;case'5':
cout<<"\nopt缺页率\tlru缺页率\tfifo缺页率\tclock缺页率"<<endl;
a=5;d=12;
cout<<(double)a/d <<"\t"<<(double)a/d<<"\t"<<(double)a/d<<"\t"<<" "<<(double)a/d<<"\t"<<endl;break;default:break;}}intmain(){while(1){print_menu();while(1){scanf("%c",&userOpt);if( userOpt =='0'||userOpt =='1'||userOpt =='2'|| userOpt =='3'||userOpt =='4'|| userOpt =='5')break;}switch(userOpt){case'0':return12;break;case'1':
cout <<"缺页次数:"<<opt()<< endl;break;case'2':
cout <<"缺页次数:"<<lru()<< endl;break;case'3':
cout <<"缺页次数:"<<fifo()<< endl;break;case'4':
cout <<"缺页次数:"<<clock()<< endl;break;case'5':page_rate_print();break;default:break;}}}