fifo.c

来自「关于操作系统:先进先出调度算法(FIFO)处理缺页中断」· C语言 代码 · 共 94 行

C
94
字号
#define t_i_m 4          //定义内存中的页面数
#define t_i_t 7           //定义全部页面数
#include <stdio.h>
typedef struct           //定义页表数据结构
{
 int pno;
 int flag;
 int mpno;
 int sign;
 int direction;
} paget;
paget pt[t_i_t];          //定义页表
typedef struct           //命令结构
{
 int code;
 int pno;
 int address;
} instruction;
/*
1 add
2 sub
3 mul
4 div
5 shift
6 store
7 load
*/
instruction array[12]={{1,0,70},     //定义指令序列
		       {1,1,50},
		       {3,2,15},
		       {6,3,21},
		       {7,0,56},
		       {2,6,40},
		       {5,4,53},
		       {1,5,23},
		       {6,1,37},
		       {7,2,78},
		       {1,4,1},
		       {6,6,84}};
int p[t_i_t]={0,1,2,3,4,5,6},k=0;
void initpt()                    //初始化页表
{
	int i;
	for(i=0;i<t_i_t;i++)
	{
		pt[i].pno=i;
		pt[i].flag=0;
		pt[i].mpno=0;
		pt[i].sign=0;
		pt[i].direction=0;
	}
	for(i=0;i<t_i_m;i++)
		pt[i].flag=1;
	pt[0].mpno=5;pt[0].direction=11;
	pt[1].mpno=8;pt[1].direction=12;
	pt[2].mpno=9;pt[2].direction=13;
	pt[3].mpno=1;pt[3].direction=21;
	pt[4].mpno=-1;pt[4].direction=22;
	pt[5].mpno=-1;pt[5].direction=23;
	pt[6].mpno=-1;pt[6].direction=121;

}
void adt(instruction s)         //地址转换函数
{
	int i,l,addr,j;
	l=s.pno;
	if(pt[l].flag==1)
	{
		addr=1024*pt[s.pno].mpno+s.address;
		if(s.code==6) pt[l].sign=1;
		printf("\n%d",addr);
	}
	else
	{
		printf("\n*%d ",l);
		j=p[k];
		if(pt[j].sign==1)
		printf("OUT %d ",j);
		printf("IN %d ",l);
		p[k]=l;
		k=(k+1)%t_i_m;
		pt[j].flag=0;
		pt[l].flag=1;
	}
}

main()
{
 int i;
 initpt();
 for(i=0;i<12;i++)
	 adt(array[i]);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?