欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言完成页面淘汰过程(FIFO)

程序员文章站 2024-03-18 11:56:22
...

利用C语言编写程序,完成虚拟存储管理的页面淘汰过程。要求:从键盘上输入允许进程占有的页数及一个访问串,输出淘汰过程,并给出共发生的缺页次数。
例如:从键盘上输入允许进程占有的页数为:3
从键盘上输入一个访问串为:
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0

模拟“先进先出(FIFO)” 算法,输出:

7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0
7 0 1 2 2 3 0 4 2 3 0 0 0 1 2 2 2 7 0
7 0 1 1 2 3 0 4 2 3 3 3 0 1 1 1 2 7
7 0 0 1 2 3 0 4 2 2 2 3 0 0 0 1 2
7 0 1 2 3 0 4 2 3 0 1
#include <stdio.h>

int main()
{
	int i,j,k,k2,t;   	//i,j,k做循环变量用,k2是目前在内存中的页面中到达顺序最先的那个页面的下标,t输入值的时候用
	int n1;   //内存允许进入最大页面数
	int n2;   //实际需要进入内存的页面个数(排队等着进入内存的页面数)
	int pageseq[100];   //记录页面号或者叫做页号
	int mempages[10][2];   //mempages[i][0]代表页面号,mempages[i][1]代表这个页面到达的序号
	int n3;   //实际进入内存的页面数
	int n4;   //记录淘汰的页面的数量
	int replacedPage;  //记录被淘汰的那个页面的页面号

	printf("Input memory page number for each progress:");
	scanf("%d",&n1);   //输入内存允许进入最大页面数
	if(n1<1)    //得大于0!
	{
		printf("Memory page number error!\n");
			return 1;
	}

	//开始:输入页面号就像  7 8 6 5 4 3 5 6 7 8  这种的过程
	printf("Now,input page access sequence.\n");

	printf("Input requested page number firstly:");   //输入要进入内存的总的页面个数
	scanf("%d",&n2);
	printf("%d pages are waiting for access.\n",n2);  //所以就还有n2个页面等待进入

	//循环输入每个页面的页面号
	for(i=0;i<n2;i++)
	{
		printf("%d-th page is:",i+1);   //第i+1个页面号是:(等待用户输入)这里i+1是因为可能是方便用户理解,因为数组下标为0的页面,实际上是第一个页面
		scanf("%d",&t);
		pageseq[i]=t;   //就把每一个页面对应的页面号记录下来了
		//比如说7 8 6 5 4 3 5 6 7 8  第一个页面的页面号就是7,第二个8,第三个6.......
	}

	n3=0;  //实际在内存中的页面数量
	n4=0;  //淘汰的页面数量

	//淘汰的过程
	for(i=0;i<n2;i++)   //每一页进入内存的调度
	{

		for(j=0;j<n3;j++)   //这里的循环是:遍历现在已经在内存中的页面号,对照现在要进入的那个页面号,如果现在要进入的页面号
		{                   //存在于现在在内存中的页面号,跳出循环
			if(mempages[j][0]==pageseq[i])      //如果memgages[j][0](内存中的页面号)==pageseq[i](现在要进入内存的页面号)
				break;      //跳出循环
		}

	
		if(j==n3 && n3<n1)   //就比如一开始没有页面进入内存的情况n3=0,j=0,直接就跳出上面那个循环的情况,此时还没有任何页面进入内存,可以直接放入
		{                    //还有种情况是:n3<n1,虽然在目前的内存中没有找到相等的页面号,但是内存还存在空余,可以直接放入
			mempages[n3][0]=pageseq[i];   //则把现在要进入内存的这页,放在这个空闲的地方
			mempages[n3][1]=i+1;    //并把这页设置成第i+1个到达,也是因为,比如第0个到达有点怪,所以变成第0+1=1个到达
			n3++;   //此时进入内存的页面数+1
			n4++;   //此时淘汰的页面数+1,因为哪怕是空页,被占用也是淘汰的一种
		}

		else if(j ==n3)  //如果只是j等于n3,但是n3并不小于n1,那么n3肯定>=n1,说明虽然此时内存已经进满了页面,
		{                //但是并没有找到和目前要进入的页面的页面号匹配的页面,此时肯定要发生淘汰
			             //已知memgages[k][1]这个数组中存放的是每个页面进入内存的顺序。又按照先进的先淘汰的特点,最先进入的先淘汰,即顺序小的先淘汰
			             //所以就相当于找  目前在 内存中的  并且进入顺序最小的那个
			int minv;   //设置一个最小值
			minv=mempages[0][1];  //先暂且认定第一个值最小
			k2=0;    //记录进入顺序最小值的那个页面在数组中的下标号

			for(k=1;k<n3;k++)   //从内存的第二个元素(因为第一个元素目前被设定成最小值了)开始寻找最小值
			{
				if(minv>mempages[k][1])   //如果有元素比minv还小
				{
					k2=k;    //取这个元素的下标
					minv=mempages[k][1];   //记录下最小值
				}
			}

			replacedPage=mempages[k2][0];  //此时被淘汰的页面的页面号被记录在replacedPage中
			mempages[k2][0]=pageseq[i];   //并且把这一页替换成要进入内存的新页

			mempages[k2][1]=i+1; /这一步虽然老师算法里面没给,但是有这一步才是正确的,因为要把新加入这页的到达序号也写进去,(不然出现的错就是,因为新加入的这页的序号没给,
			                     就会赋垃圾值,在下次比较中,得到的结果就是错误的)

			n4++;   //被淘汰的页数加1
			printf("page %d in,page %d out.%d-th missing page.\n",pageseq[i],replacedPage,n4);  //打印新页进入,旧页淘汰以及淘汰页数


		}
		else  //此时虽然可能j不等于n3,但是是因为在循环中已经找到了相应页号,所以才直接退出
		{
			printf("page %d is in memory.\n",pageseq[i]);  //说明这页已经在内存了
		}
	}
	printf("Totally %d missing pages!\n",n4);  //最后输出一共淘汰的页数
	return 0;


}