论坛首页 编程语言技术论坛

C语言模拟页面调度过程

浏览 2017 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-05  
C
#include <stdio.h>
#include <time.h>
#include<stdlib.h>
#define randomize() srand((unsigned)time(NULL)) //定义一个宏用来产生随机数的
#define N 10  //调动的次数
#define RealPage 4

struct Page
{
	int pn; //虚页号
	int pfn; //实页号
	int times;
	//struct Page *next; //指向下一个页面
};
int count,k,i,j,flag,call[N];
struct Page MemPage[RealPage];
void output()
{
	printf("\n\n-------------内存页面情况为-------------------\n");
	printf("调度顺序为:");
	int p;
	for(p=0;p<N;p++)
		printf("%d  ",call[p]);
	printf("\n");
	for(k=0;k<RealPage;k++)
		printf("序号:%d  虚页号:%d  实页号:%d  Time:%d  count:%d\n",k,MemPage[k].pn,MemPage[k].pfn,MemPage[k].times,count);

}
int main()
{
	count = 0; //替换计数器
	int init_t;
	for(init_t=0;init_t<RealPage;init_t++)
		//MemPage[init_t].pfn = -1;
	randomize(); 
	printf("调度顺序为:");
	for(i=0;i<N;i++)
	{
		call[i] = rand()%10;
		printf("%d  ",call[i]);
	}
	//开始调度了   
	for(i=0;i<N;i++)
	{
		flag = 1;
		int m;
		for(m=0;m<RealPage && MemPage[m].pn!=call[i];m++)
		{
			if(MemPage[m].pfn == 0)
			{
				MemPage[m].pfn = 3478 - m*79;
				MemPage[m].times = 1;
				MemPage[m].pn = call[i]; 
				count ++;
				break;
			}
		}
		//output(); 
		for(j=0;j<4 && flag!=0;j++)
		{

			if(call[i] == MemPage[j].pn)
			{
				flag = 0;
				break;
			}
			//在实页中找不到此页,用LRU算法进行替换
			else
			{
				if(j == RealPage-1) //表示全都比较一遍了,还是没找到相同的页,进行替换
				{
					int t1,t2,temp;
					for(t1=0;t1<RealPage;t1++)  //算出在内存中时间最长者,将其替出来
					{
						for(t2=t1+1;t2<RealPage;t2++)
							if(MemPage[t1].times > MemPage[t2].times)
								temp = t1;
							else
								temp = t2;
					}
					MemPage[temp].pn = call[i]; //替换
					MemPage[temp].times = 1; //时间重新开始计时
					count ++;
				}
			}
		}
		int r;
		for(r=0;r<RealPage;r++)
			MemPage[r].times ++;
		int n = 755599998;
		while(n--);
		output();
		
	}
	printf("\n				缺页率为:%f\n\n",(float)count/10);
	return 0;
}
   发表时间:2009-05-05  
有点土。。。
用lru/arc吧。。。。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics