#include<iostream>
#include<iomanip>
using namespace std;
#define m 5 //m表示页数
#define n 3 //n表示物理块数
float interrupt=0; //产生缺页中断的次数
int k=0; //指向最先进入内存的页,即被淘汰的页
int PageTable[m]; //定义页表,总共m页,数组中数值是状态位 =1表示该页在内存中,=0表示不在内存中,默认处置为0
int Block[n]; //定义物理块,总共n个,数组中数值表示对应物理块中装入的页的编号
int process[20]; //进程访问序列
int number=1; //用于标志访问次数
void Visit(int); //访问函数
int main (void)
{
int input;
cout<<"某进程共有"<<m<<"页,请输入进程访问序列(范围:1-"<<m<<",用0表示结束):\n";
cin>>input;
for(int length=0;input!=0;length++) //将输入序列存入process数组,长度为length
{
process[length]=input;
cin>>input;
}
for(int j=0;j<length;j++)
Visit(process[j]); //依次访问页process[j]
cout<<"共"<<length<<"次访问,产生"<<interrupt<<"次缺页中断,缺页率为 "<<interrupt/length<<"\n";
}
void Visit(int x)
{
int i,j;
cout<<setw(2)<<number<<": 访问页"<<x<<" "; //第number次访问,访问页x
for(i=0;i<n;i++)
{
if(Block[i]==0) //访问页x时没有命中,且内存未装满,产生缺页中断,直接调入访问页
{
interrupt++; //缺页中断次数加1
PageTable[x-1]=1; //修改状态位
Block[i]=x; //页x调入物理块
cout<<"缺页中断 内存未满 调入页"<<x<<" 物理块内的页为 ";
for(j=0;j<=i;j++)cout<<Block[j]<<" "; //输出物理块内的页号
cout<<"\n";
break;
}
if(PageTable[x-1]==1) //访问页x时命中
{
cout<<"命中 物理块内的页为 ";
for(j=0;j<n && Block[j]!=0;j++)cout<<Block[j]<<" "; //输出物理块内的页号
cout<<"\n";
break;
}
}
if(i==n) //访问页x时内存已装满,且没有命中,产生缺页中断,调入该页至内存,淘汰最先进入的页
{
cout<<"缺页中断 淘汰页"<<Block[k]<<" 调入页"<<x<<" 物理块内的页为 ";
interrupt++; //缺页中断次数加1
PageTable[Block[k]-1]=0; //页Block[k]被淘汰,状态位修改为 0
Block[k]=x; //页x调入物理块
PageTable[x-1]=1; //页x状态位修改为 1
k=(k+1)%n; //修改下次被淘汰页指针
for(j=0;j<n;j++)cout<<Block[j]<<" "; //输出物理块内的页号
cout<<"\n";
}
number++; //访问次数加1
}
单独的FIFO
最新推荐文章于 2024-04-01 19:54:46 发布