虚拟存储器管理-模拟分页请求和缺页调度

虚拟存储器管理-模拟分页请求和缺页调度

请求分页系统虚拟存储技术是把作业地址空间的全部信息放在磁盘上,当作业被选中运行时,先把作业的开始几页装入主存并启动运行。为此在为作业建立页表时,应说明哪些页已经在主存,哪些页不在主存,页表如图所示

假定主存的每块长度为64个字节,现有一个8页的作业,系统为其分配了4个主存块,其中第0至第3页已经装入主存


标志表示对应页是否已经装入内存,1表示已装入,0表示未装入

主存块号表示该页对应的主存块号

修改位表示该页调入主存后是否修改过的标志,若未被修改,在置换该页时就不需将该页写回外存,以减少系统的开销和启动磁盘的次数,若修改,则必须将该页重新写到外存。

外存地址表示该页所在的外存地址

若给定一个逻辑地址空间的地址为A,页面大小为L,则页号为(int)(A/L),页内地址为A%L

按页号查找页表,若该页的标志为1,表示该页已在主存,从中找出该页对应的主存块号

绝对地址=块号*块的长度+页内偏移量

当访问的页不在主存时,进行缺页调度,执行先进先出的(FIFO)页面置换算法

代码模拟如下

#include
#include
#include
#include
#include
#define N 10000
struct yebiao
{
	int yehao; //页号
	int flag; //标记位
	int zhucunkuaihao;//主存块号
	int waicundizhi;//外存地址
	int xiugaiwei;//修改位
}yebiao[N];
int FIFO[4]={0,1,2,3};
void init()
{
	int i;
	for(i=0;i<4;i++)
	{
		yebiao[i].yehao=i;
		yebiao[i].flag=1;
	}
	for(i=4;i<8;i++)
	{
		yebiao[i].yehao=i;
		yebiao[i].flag=0;
	}
	yebiao[0].zhucunkuaihao=5;
    yebiao[1].zhucunkuaihao=8;
    yebiao[2].zhucunkuaihao=9;
    yebiao[3].zhucunkuaihao=10;
    yebiao[4].zhucunkuaihao=-1;
    yebiao[5].zhucunkuaihao=-1;
    yebiao[6].zhucunkuaihao=-1;
    yebiao[7].zhucunkuaihao=-1;
	yebiao[0].waicundizhi=11;
    yebiao[1].waicundizhi=12;
    yebiao[2].waicundizhi=13;
    yebiao[3].waicundizhi=15;
    yebiao[4].waicundizhi=17;
    yebiao[5].waicundizhi=25;
    yebiao[6].waicundizhi=212;
    yebiao[7].waicundizhi=213;
	yebiao[0].xiugaiwei=1;
    yebiao[1].xiugaiwei=1;
    yebiao[2].xiugaiwei=0;
    yebiao[3].xiugaiwei=0;
    yebiao[4].xiugaiwei=-1;
    yebiao[5].xiugaiwei=-1;
    yebiao[6].xiugaiwei=-1;
    yebiao[7].xiugaiwei=-1;
}
void print()
{
	int i;
	printf("页号  标志  主存块号  外存地址  修改位\n");
	for(i=0;i<8;i++)
	{
		printf("%d  %d  %d  %d  %d\n",yebiao[i].yehao,yebiao[i].flag,yebiao[i].zhucunkuaihao,yebiao[i].waicundizhi,yebiao[i].xiugaiwei);
	}
}
int main()
{
	int i,t;
	int a,d;//页号,页内地址
	int wuli;//物理地址 
	int waicun;//外存地址
	int flag;
	init();
	printf("请输入逻辑地址,当输入-1时结束\n");
	print();
	while(scanf("%d",&t),t!=-1)
	{
		a=t/64; // 页号
		d=t%64; //页内地址
		printf("逻辑地址%d对应的页号和页内地址分别为%d %d\n",t,a,d);
		if(yebiao[a].flag)  //在内存中
		{
			printf("该页在主存中\n");
            wuli=yebiao[a].zhucunkuaihao*64+d;//绝对地址=块号*块的长度+页内偏移量
			printf("逻辑地址%d对应的物理地址为%d\n",t,wuli);
			printf("该页在主存中是否被修改,输入1修改,输入0不修改\n");
			scanf("%d",&flag);
		    yebiao[a].xiugaiwei=1;
		}
		else
		{
			printf("该页不在主存,缺页调度,执行先进先出的(FIFO)页面置换算法\n");
			//先进先出
			if(yebiao[FIFO[0]].xiugaiwei) //该页在主存中是否被修改
			{
                yebiao[FIFO[0]].xiugaiwei=0;
				printf("将页面%d唤出,并将该页写回修改外存地址%d\n",yebiao[FIFO[0]].yehao,yebiao[FIFO[0]].waicundizhi);
			}
			else
			{
                yebiao[FIFO[0]].zhucunkuaihao=-1;
				printf("将页面%d唤出\n",yebiao[FIFO[0]].waicundizhi);
			}
			printf("将该页装入主存块号%d中\n",yebiao[FIFO[0]].zhucunkuaihao);
            yebiao[a].zhucunkuaihao=yebiao[FIFO[0]].zhucunkuaihao; //换入内存
			yebiao[a].xiugaiwei=0;
			yebiao[a].flag=1;
			yebiao[FIFO[0]].zhucunkuaihao=-1; //唤出内存
			yebiao[FIFO[0]].flag=0;
			for(i=0;i<3;i++) //先进先出,模拟队列
			FIFO[i]=FIFO[i+1];
			FIFO[3]=a;
		}
		print();
	}
	return 0;
}



你可能感兴趣的:(操作系统)