C语言实现操作系统页面置换算法中的OPT算法 大虾请进
#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] */
}