浏览 2017 次
锁定老帖子 主题:C语言模拟页面调度过程
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-05
#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; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-05
有点土。。。
用lru/arc吧。。。。 |
|
返回顶楼 | |