五、实验体会
此次的实验不是很难,不论是FIFO还是LFU算法,都只需分成3部分考虑,即物理块中有相同页面、物理块中没有相同页面但有空闲、缺页中断这3种情况。只要分别根据不同情况的算法编写对应代码即可,而其余部分的代码两种算法均相同。随机生成要访问的字地址部分较复杂,但根据老师提供的算法我也顺利完成了。通过此次实验,我对FIFO、LFU算法有了更加详细的认识,对课上所学的只是有了一次实际的应用,对其有了更加深刻的理解。
附录:
#include
#define Blocksize 8 //物理块的大小 #define Procount 60 //进程的页面数 #define psize 100 //进程的大小 #define OneK 1024 //一个页面的大小 typedef struct page {
int num; /*记录页面号*/
int count; /*记录最近调度此页面的次数*/
}Page; /* 页面逻辑结构,结构为方便算法实现设计*/ Page Block[Blocksize]; /*内存单元数*/
int temp[psize][Blocksize + 1]={0}; /*暂保存内存当前的状态:缓冲区*/ int queue[psize]; /*记录调入页面序号*/ int phb[Blocksize]; int frontp=0;
int rearp=3;//初始化情况下,内存中已经分配3个页面
int flag=1; //标志是否有相同页面,如有则0,没有则1 int frontlea=0; //标志最先进去的页面号 int FIFO_break=0; int LFU_break=0;
void build() //产生页面调度的页面随机序列 {
int i=0; int suiji;
int k; //表示随机出来的存储块号 printf(\产生页面调度的页面随机序列:\\n\srand(time(NULL));
k=rand()%(OneK * Procount); queue[i++]=k/1024; do{
suiji=rand()%4+1; switch(suiji) { case 1: case 2:
if(k queue[i++]=(k+1+512)/1024; k=k+1+512; break; case 3: k=rand()%k; queue[i++]=k/1024; break; case 4: k=rand()%(61439 - k) + k; queue[i++]=k/1024; break; default: } break; }while(i for(i=0;i printf(\ } int searchpb()//查找空闲物理块,成功返回值是物理块号,否则就是-1 { int j,m; for(j=0; j printf(\ if((i+1)%5==0)printf(\ { if(Block[j].num == -1) { m = j; return m; break; } } void Init()//初始化内存 { } return -1;