#include
#define N 3 //分配给进程的物理块大小
int q[N]; // 内存中页面集合
int arrived[100]; //记录访问过的页面
int k = 0; // k表示一共有访问了多少页面
void init();
void pageExchange(int page);
void prt();
int main(){
int page,i;
init();
while(1){
printf("请输入要访问的页面号(0-7),如果要结束访问,则输入-1:\n");
scanf("%d",&page); //输入要访问的页面
if(page==-1){ //结束访问,退出循环
break;
}
for(i=0;i
if(q[i]==-1){
printf("缺页中断:调入页面%d\n",page);
q[i] = page; //将page页放置到下标为i的内存物理块中
break;
}
if(q[i]==page){
printf("页面在内存中,直接访问%d\n",page);
break;
}
}
if(i>=N){
printf("缺页中断:执行页面置换算法:\n");
pageExchange(page);
}
arrived[k]=page;
k++;
prt();
}
return 0;
}
void init(){
//初始化内存中页面集合为空
int i;
for(i=0;i
}
}
void pageExchange(int page){ //写入页面置换算法
//此例采用LRU算法来实现置换
int i,j,m,count=0,sig[N] = {0};
for(i=k-1;i>=0;i--){
for(j=0;j
if(count==N-1){ //说明已经找到了N-1个页面,剩下一个就是最近最久未被使用的页面
for(m=0;m
if(sig[m]==0){
printf("页面%d换出,页面%d换入\n",q[m],page);
q[m]=page; //page覆盖了原来的q[m],这里没有考虑是否将q[m]换回到外存
return; //直接终止函数
}
}
}
if(sig[j]!=1 && arrived[i]==q[j]){
sig[j] = 1;
count++;
}
}
}
}
void prt(){
int i;
printf("\n");
printf("已经访问的页面:");
for(i=0;i
printf("%d->",arrived[i]);
}
printf("\n");
printf("驻留集:");
for(i=0;i
if(q[i]==-1){
printf(" ");
} else{
printf("%d ",q[i]);
}
}
printf("\n");
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)