采用先进先出实现分页管理的缺页调度

采用先进先出实现分页管理的缺页调度

根据到达先后顺序进行处理,设有四个主存块号,每访问一次均存入主存,具体步骤可看下面代码结果截图。

#include<stdio.h>

struct PCB{
	int num;
	int label;
	int block;
	int address;
	int fix;
};
struct FIFO{
	int num;
	int fag;
};

int k=1;

//初始化 
void init(PCB *p,FIFO *q){
	FILE *r=fopen("4-2.txt","r");
	for(int i=0;i<8;i++)
	fscanf(r,"%d%d%d%d%d",&p[i].num,&p[i].label,&p[i].block,&p[i].address,&p[i].fix);
	printf("页号    标志    主存块号   外存地址    修改位  \n");
	for(int i=0;i<8;i++)
	printf("%3d%7d%21d\n",p[i].num,p[i].label,p[i].address);
    r=fopen("4-2x.txt","r");
	for(int i=0;i<8;i++)
	fscanf(r,"%d%d",&q[i].num,&q[i].fag);
	printf("主存块号为:\n");
	for(int i=0;i<4;i++)
	printf("%5d",q[i].num);
}

//缺页处理 
void cut(PCB *p,int a,int b,FIFO *q){
	int ss=0;
	for(int i=0;i<4;i++)
	if(q[i].fag==0&&ss==0){
		p[a].block=q[i].num;
		p[a].label=1;
		q[i].fag=k;
		p[a].fix=0;
		k=k%4+1;
		ss=1;
	}
	if(ss==0){
		int temp=0;
		for(int i=0;i<4;i++){
			if(q[temp].fag>q[i].fag)
			temp=i;
		}
		for(int i=0;i<8;i++)
		if(p[i].block==q[temp].num){
		    p[i].block=0;
			p[i].label=0;
		}
		for(int i=0;i<4;i++)
		q[i].fag--;
		q[temp].fag=4;
		p[a].label=1;
		p[a].block=q[temp].num;
		p[a].fix=0;
	}
	printf("页号    标志    主存块号   外存地址    修改位  \n");
	for(int i=0;i<8;i++){
		if(p[i].label!=0)
		printf("%3d%7d%10d%11d%12d\n",p[i].num,p[i].label,p[i].block,p[i].address,p[i].fix);
		else
		printf("%3d%7d%21d\n",p[i].num,p[i].label,p[i].address);
	}
	printf("绝对地址为:\n");
		int m=p[a].block*64+b;
		printf("%x\n",m);
}

//搜索页表 
void search(PCB *p,int a,int b,FIFO *q){
	if(p[a].label==0){
		printf("该页不在主存,产生缺页中断\n");
		cut(p,a,b,q); 
	}
	else{
		printf("绝对地址为:\n");
		int m=p[a].block*64+b;
		printf("%x\n",m);
		p[a].fix=1;
	    printf("页号    标志    主存块号   外存地址    修改位  \n");
	    for(int i=0;i<8;i++){
	     	if(p[i].label!=0)
	     	printf("%3d%7d%10d%11d%12d\n",p[i].num,p[i].label,p[i].block,p[i].address,p[i].fix);
		    else
	    	printf("%3d%7d%21d\n",p[i].num,p[i].label,p[i].address);
	    }
	}
}

//输入指令 
void input(PCB *p,FIFO *q){
	int N,a,b,m;
	printf("\n输入指令个数:\n");
	scanf("%d",&N);
	for(int i=0;i<N;i++){
		printf("输入第%d条指令\n",i+1);
		scanf("%x",&m);
		a=m/64;
		b=m%64;
		search(p,a,b,q); 
	}
} 

//主函数 
int main(){
	PCB p[8];
	FIFO q[4];
	init(p,q);
	input(p,q);
} 

代码中文件读取如下:
在这里插入图片描述
结果展示如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
谢谢大家观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值