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

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

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

7012030423032120170
7012230423000122270
701123042333011127
70012304222300012
70123042301
#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;


}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用c语言编写的FIFO页面淘汰算法的示例代码: ```c #include <stdio.h> #define MAX_FRAMES 10 int main() { int pageRequests[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5}; int numRequests = sizeof(pageRequests) / sizeof(int); int frames[MAX_FRAMES]; int numFrames = 0; int numPageFaults = 0; int oldestPageIndex = 0; for (int i = 0; i < numRequests; i++) { int pageRequested = pageRequests[i]; int pageFound = 0; // Check if page is already in memory for (int j = 0; j < numFrames; j++) { if (frames[j] == pageRequested) { pageFound = 1; break; } } // Page fault if (!pageFound) { if (numFrames < MAX_FRAMES) { // Add page to an empty frame frames[numFrames++] = pageRequested; } else { // Replace oldest page in memory frames[oldestPageIndex] = pageRequested; oldestPageIndex = (oldestPageIndex + 1) % MAX_FRAMES; } numPageFaults++; } } printf("Number of page faults: %d\n", numPageFaults); return 0; } ``` 在这个示例代码中,我们模拟了一个有12个页面请求的情况。我们在循环中遍历每个页面请求,然后检查该页面是否已经存在于内存中。如果页面不存在,则发生页面错误。如果当前有可用的空闲内存帧,则将页面添加到其中。否则,我们要替换内存中最旧的页面,即FIFO算法所采用的方法。 在代码中,我们使用了一个`frames`数组来存储当前在内存中的页面。我们还使用`numFrames`变量来表示当前内存中有多少个页面。`numPageFaults`变量用于计算页面错误的数量。最后,`oldestPageIndex`变量用于跟踪内存中最旧页面的索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值