存储管理练习

设计一个虚拟存储区和内存工作区,并使用进先出的算法(FIFO)算法计算访问命中率。命中率=1-页面失效次数/页地址流长度。

程序参考源码

#define TRUE 1

#define FALSE 0

#define INVALID -1

#define NULL  0

#define  total_instruction 320     /*指令流长*/

#define  total_vp  32               /*虚页长*/

#define  clear_period  50           /*清0周期*/

typedef struct                      /*页面结构*/

{

int pn;      //页号 logic number

int pfn;     //页面框架号 physical frame number

int counter; //计数器

int time;    //时间

}pl_type;

pl_type pl[total_vp];                      /*页面线性结构---指令序列需要使用地址*/

typedef struct pfc_struct                  /*页面控制结构,调度算法的控制结构*/

{                          

    int pn;

int pfn;

struct pfc_struct *next;

}pfc_type;

pfc_type pfc[total_vp], *freepf_head, *busypf_head, *busypf_tail;

int diseffect,  a[total_instruction]; /* a[]为指令序列*/

int page[total_instruction],  offset[total_instruction];/*地址信息*/

int  initialize(int);

int  FIFO(int);

int main( )

{

int s,i,j;

srand(10*getpid());                    /*由于每次运行时进程号不同,故可用来作为初始化随机数队列的“种子”*/

s=(float)319*rand( )/32767/32767/2+1;  /*正态分布*/

for(i=0;i<total_instruction;i+=4)        /*产生指令队列*/

{

if(s<0||s>319)

{

printf("When i==%d,Error,s==%d\n",i,s);

exit(0);

}

a[i]=s;                                   /*任选一指令访问点m*/

a[i+1]=a[i]+1;                            /*顺序执行一条指令*/

a[i+2]=(float)a[i]*rand( )/32767/32767/2; /*执行前地址指令m*/

a[i+3]=a[i+2]+1;                          /*顺序执行一条指令*/

s=(float)(318-a[i+2])*rand( )/32767/32767/2+a[i+2]+2;

if((a[i+2]>318)||(s>319))

printf("a[%d+2],a number which is :%d and s==%d\n",i,a[i+2],s);

}

for (i=0;i<total_instruction;i++) /*将指令序列变换成页地址流*/

{

page[i]=a[i]/10;

offset[i]=a[i]%10;

}

for(i=4;i<=32;i++)   /*用户内存工作区从4个页面到32个页面*/

{

printf("---%2d page frames---\n",i);

FIFO(i);

}

return 0;

}

/*初始化相关数据结构 total_pf表示内存的块数 */

int initialize(int total_pf)             

{

int i;

diseffect=0;

for(i=0;i<total_vp;i++)

{

pl[i].pfn=INVALID;       /*置页面控制结构中的页号,页面为空*/

pl[i].counter=0;         /*页面控制结构中的访问次数为0*/

pl[i].time=-1;           /*访问的时间*/

}

for(i=0;i<total_pf-1;i++) /*建立pfc[i-1]和pfc[i]之间的链接*/

{

pfc[i].next=&pfc[i+1];

pfc[i].pfn=i;

}   

pfc[total_pf-1].next=NULL;

pfc[total_pf-1].pfn=total_pf-1;

freepf_head=&pfc[0];         /*空页面队列的头指针为pfc[0]*/

return 0;

}

int FIFO(int total_pf)              /*先进先出算法total_pf:用户进程的内存页面数*/

{

int i,j;

pfc_type *p; /*中间变量*/

initialize(total_pf);         /*初始化相关页面控制用数据结构*/

busypf_head=busypf_tail=NULL; /*忙页面队列头,队列尾链接*/

for(i=0;i<total_instruction;i++)

{

if(pl[page[i]].pfn==INVALID)   /*页面失效*/

{

diseffect+=1;                  /*失效次数*/

if(freepf_head==NULL)         /*无空闲页面*/

{

p=busypf_head->next;       

pl[busypf_head->pn].pfn=INVALID;

freepf_head=busypf_head;  /*释放忙页面队列的第一个页面*/

freepf_head->next=NULL;  /*表明还是缺页*/

busypf_head=p;

}

p=freepf_head->next;        

freepf_head->pn=page[i];

pl[page[i]].pfn=freepf_head->pfn;

freepf_head->next=NULL; /*使busy的尾为null*/

if(busypf_tail==NULL)

{

busypf_tail=busypf_head=freepf_head;

}

else

{

busypf_tail->next=freepf_head;

busypf_tail=freepf_head;

}

freepf_head=p;

}

}

printf("FIFO:%6.4f\n",1-(float)diseffect/320);

return 0;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值