#操作系统#C++请求调页存储管理方式的模拟
- 实验内容
(1)假设每个页面中可存放10条指令,分配给一作业的内存块数为4。
(2)用C语言模拟一作业的执行过程。该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
(3)置换算法:请分别考虑OPT、FIFO和LRU算法。
(4)作业中指令的访问次序按下述原则生成:
•50%的指令是顺序执行的。
•25%的指令是均匀分布在前地址部分。
•25%的指令时均匀分布在后地址部分。
具体的实施办法是:
① 在[0,319]之间随机选取一条起始执行指令,其序号为m;
② 顺序执行下一条指令,即序号为m+1的指令;
③ 通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1;
④ 顺序执行下一条指令,即序号为m1+1的指令;
⑤ 通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;
⑥ 顺序执行下一条指令,即序号为m2+1的指令;
⑦ 重复跳转到前地址部分、顺序执行、跳转到后地址部分、顺序执行的过程,直至执行320条指令。
- 代码实现
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<time.h>
using namespace std;
//r = rand()%(n - m + 1) + m;用下列公式即可得到指定范围[m,n]的随机数
struct page
{
int page_id;
int opt_time; //最长未被使用的时间
int lru_time; //有多久未被使用
};
int merge_time;
int random_num[320];
int count=0;
vector<page> page_in;
page temp;
void random_()
{ int i=1;
int m;
random_num[0]=rand()%(319 - 0 + 1) + 0 ;
m=random_num[0];
while(i<320)
{
random_num[i]=++m;// m+1写入数组
i++; //计数
if(i>=320)break; //条件判断
random_num[i]=rand()%(m-1 -0 +1) + 0; //前地址区
m=random_num[i];
i++;
if(i>=320)break;
random_num[i]=++m;
i++;
if(i>=320)break; //后地址区域
random_num[i]=rand()%(319 -m +2) + m+1;
m=random_num[i];
i++;
}
}
void page_print() //输出内存中的东西
{
cout<<endl<<"内存内页面为:";
for(int k=0;k<page_in.size();k++)
{
cout<<" "<<page_in[k].page_id;
}
}
int in_memory(int id) //判断是否在内存
{ bool sign=0;
for(int i=0;i<page_in.size();i++)
{
if(id/10==page_in[i].page_id)
{
sign=1;
break;
}
}
return sign;
}
int is_max() //判断内存是否已满
{
bool sign=0;
if(page_in.size()==4)
{
sign=1;
}
return sign;
}
void FIFO() //先进先出算法
{
//page_in.erase(page_in.begin()+page_in.size()-1);
merge_time=0;
for(int i=0;i<320;i++)
{
page_print();
if(in_memory(random_num[i])) //如果页面在内存里
{
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
else
{
if(is_max()) //调页
{ merge_time++;
page_in.erase(page_in.begin());
temp.page_id=random_num[i]/10;
page_in.push_back(temp);
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
else
{
temp.page_id=random_num[i]/10;
page_in.push_back(temp);
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
}
}
cout<<"总共调页:"<<merge_time<<"次"<<endl;
cout<<"缺页率为百分之"<<merge_time/3.2<<endl;
}
int OPT_sort(int j) //求最长未被使用的时间 返回的是页面在page_in 的id
{
int max_opt=0;
for(int i=0;i<4;i++)
{
page_in[i].opt_time=0;
int temp=1;
int temp_j=j;
while(temp_j<320)
{
if(page_in[i].page_id==random_num[temp_j]/10)
{
page_in[i].opt_time=temp;
if(page_in[i].opt_time>page_in[max_opt].opt_time)
{
//page_in[i].opt_time=temp;
max_opt=i;
}
break;
}
else
{
temp++;
temp_j++;
}
}
}
/*cout<<endl<<"opt_time:";
for(int i1=0;i1<4;i1++)
{
cout<<page_in[i1].opt_time<<endl;
}*/
for(int i=0;i<page_in.size();i++)
{
if(page_in[i].opt_time==0)
{
return i;
}
else
{
}
}
return max_opt;
}
void OPT()
{
page_in.erase(page_in.begin()+page_in.size()-1);
merge_time=0;
for(int i=0;i<320;i++)
{
page_print();
if(in_memory(random_num[i])) //如果页面在内存里
{
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
else
{
if(is_max()) //如果不在内存里面
{
merge_time++;
page_in.erase(page_in.begin()+OPT_sort(i));
temp.page_id=random_num[i]/10;
page_in.push_back(temp);
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
else
{
temp.page_id=random_num[i]/10;
page_in.push_back(temp);
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
}
}
cout<<"总共调页:"<<merge_time<<"次"<<endl;
cout<<"缺页率为百分之"<<merge_time/3.2<<endl;
}
void LRU_time()
{
for(int i=0;i<page_in.size();i++)
{
page_in[i].lru_time++;
}
}
int max_lrutime()
{
//int max_t=0;
int max_id=0;
for(int i=0;i<page_in.size();i++)
{
if(page_in[i].lru_time>page_in[max_id].lru_time)
{
max_id=i;
}
else
{
continue;
}
}
return max_id;
}
void LRU()
{
page_in.erase(page_in.begin()+page_in.size()-1);
merge_time=0;
for(int i=0;i<320;i++)
{
page_print();
if(in_memory(random_num[i])) //如果页面在内存里
{
LRU_time();
for(int i1=0;i1<page_in.size();i1++)
{
if(page_in[i1].page_id==random_num[i]/10)
{
page_in[i1].lru_time=0;
break;
}
}
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
else
{
if(is_max()) //满了调页
{
merge_time++;
LRU_time();
page_in.erase(page_in.begin()+max_lrutime());
temp.page_id=random_num[i]/10;
temp.lru_time=0;
page_in.push_back(temp);
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
else
{
LRU_time();
temp.page_id=random_num[i]/10;
temp.lru_time=0;
page_in.push_back(temp);
cout<<"\t\t执行第"<<i<<"条指令,指令为:"<<random_num[i]<<endl;
continue;
}
}
}
cout<<"总共调页:"<<merge_time<<"次"<<endl;
cout<<"缺页率为百分之"<<merge_time/3.2<<endl;
}
void print_num()
{
for(int i=0;i<320;i++)
{
cout<<random_num[i]<<" ";
}
cout<<endl<<endl;
cout<<"1、FIFO"<<endl<<"2、OPT"<<endl<<"3、LRU"<<endl<<"请输入:";
}
int main()
{ int aa;
random_();
print_num();
while(cin>>aa)
{
switch (aa)
{
case 0:return 0;
case 1:FIFO();break;
case 2:OPT();break;
case 3:LRU();break;
defaut: break;
}
}
return 0;
}
- 运行结果:
-
FIFO算法缺页率为百分之42.5。
-
OPT算法缺页率为34%LRU算法缺页率为43.75%