C语言实现操作系统页面置换算法中的OPT算法 大虾请进

L249579008 2011-05-10 11:01:46
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
#include<time.h>

/*指令流长:320*/
/*虚页长:32*/
/*清零周期:50*/

typedef struct{ /*页面结构*/

int pn,pfn,counter,time;

}pl_type;



pl_type pl[32]; /*页面结构数组*/



struct pfc_struct{ /*页面控制结构*/

int pn,pfn;

struct pfc_struct *next;

};



typedef struct pfc_struct pfc_type; pfc_type pfc[32],*freepf_head,*busypf_head,*busypf_tail;

int diseffect, a[320];

int page[320], offset[320];



void initialize(int x);



void OPT(int x);




main(){

int S,i,j,k;

time_t t; //产生随机数用

srand((unsigned) time(&t));

S= rand() % 319+1;



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

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

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

j=rand()%32767;

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

a[i+3]=a[i+2]+1; /*执行后地址指令*/

j=rand()%32767;

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

}



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

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

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

}



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

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



OPT(i);
printf("\n");

}

}

void OPT(int total_pf) /* 理想型淘汰算法 */
//int total_pf;
{
int i,j,max,maxpage,d,dist[32];

initialize(total_pf);
for(i=0;i<320;i++)
{
if(pl[page[i]].pfn==-1)
{
diseffect++;
if(freepf_head==NULL)
{
for(j=0;j<32;j++)
if(pl[j].pfn!=-1)
dist[j]=32767;
else
dist[j]=0;
d=1;
for(j=i+1;j<320;j++)
{
if(pl[page[j]].pfn!=-1)
dist[page[j]]=d;
d++;
}
max=-1;
for(j=0;j<32;j++)
if(max<dist[j])
{
max=dist[j];
maxpage=j;
}
freepf_head=&pfc[pl[maxpage].pfn];
freepf_head->next=NULL;
pl[maxpage].pfn=-1;
}
pl[page[i]].pfn=freepf_head->pfn;
freepf_head=freepf_head->next;
}
printf("OPT的命中率为:%6.4f",1-(float)diseffect/320);
}
}
void initialize(int total_pf) /* 初始化相关数据结构 */

/*int total_pf; 用户进程的内存页面数 */

{

int i;

diseffect=0;



for(i=0;i<32;i++){

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

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

}



for(i=1;i<total_pf;i++){

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

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

} /* 建立pfcD一门和pfcD]之间的链接 */



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

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

}
...全文
1200 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧