设计一个虚拟存储区和内存工作区,并使用下列算法计算访问命中率.

(1)       进先出的算法(FIFO)

(2)       最近最少使用的算法(LRU)

(3)       最佳淘汰算法(OPT)

(4)       最少访问页面算法(LFU)

(5)       最近最不经常使用算法(NUR)

命中率=(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  LRU(int);
int  LFU(int);
int  NUR(int); //not use recently
int  OPT(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);
LRU(i);
LFU(i);
NUR(i);
OPT(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;
}
int LRU (int total_pf)       /*最近最久未使用算法least recently used*/
{
int min,minj,i,j,present_time; /*minj为最小值下标*/
initialize(total_pf);
present_time=0;
for(i=0;i<total_instruction;i++)
{
if(pl[page[i]].pfn==INVALID)             /*页面失效*/
{
diseffect++;
if(freepf_head==NULL)              /*无空闲页面*/
{
min=32767;                     /*设置最大值*/
for(j=0;j<total_vp;j++)            /*找出time的最小值*/
{
if(min>pl[j].time&&pl[j].pfn!=INVALID)
{
min=pl[j].time;
minj=j;
}
}
freepf_head=&pfc[pl[minj].pfn];   //腾出一个单元
pl[minj].pfn=INVALID;
pl[minj].time=0;
freepf_head->next=NULL;
}
pl[page[i]].pfn=freepf_head->pfn;   //有空闲页面,改为有效
pl[page[i]].time=present_time;
freepf_head=freepf_head->next;      //减少一个free 页面
}
else
{
pl[page[i]].time=present_time;        //命中则增加该单元的访问次数
present_time++;
}
}
printf("LRU:%6.4f\n",1-(float)diseffect/320);
return 0;
}
int NUR(int  total_pf )                  /*最近未使用算法Not Used recently count表示*/
{
int i,j,dp,cont_flag,old_dp;
pfc_type *t;
initialize(total_pf);
dp=0;
for(i=0;i<total_instruction;i++)
{
if (pl[page[i]].pfn==INVALID)         /*页面失效*/
{
diseffect++;
if(freepf_head==NULL)               /*无空闲页面*/
{
cont_flag=TRUE;
old_dp=dp;
while(cont_flag)
{
if(pl[dp].counter==0&&pl[dp].pfn!=INVALID)
cont_flag=FALSE;
else
{
dp++;
if(dp==total_vp)
dp=0;
if(dp==old_dp)
for(j=0;j<total_vp;j++)
pl[j].counter=0;
}
}
freepf_head=&pfc[pl[dp].pfn];
pl[dp].pfn=INVALID;
freepf_head->next=NULL;
}
pl[page[i]].pfn=freepf_head->pfn;
freepf_head->pn=page[i];
freepf_head=freepf_head->next;
}
else
pl[page[i]].counter=1;
if(i%clear_period==0)
for(j=0;j<total_vp;j++)
pl[j].counter=0;
}
printf("NUR:%6.4f\n",1-(float)diseffect/320);
return 0;
}
int OPT(int total_pf)       /*最佳置换算法*/
{
int i,j, max,maxpage,d,dist[total_vp];
pfc_type *t;
initialize(total_pf);
for(i=0;i<total_instruction;i++)
{
if(pl[page[i]].pfn==INVALID)      /*页面失效*/
{
diseffect++;
if(freepf_head==NULL)         /*无空闲页面*/
{
for(j=0;j<total_vp;j++)
{
if(pl[j].pfn!=INVALID)
dist[j]=32767;
else
dist[j]=0;
}
for(j=0;j<total_vp;j++)
{
if((pl[j].pfn!=INVALID)&&(dist[j]==32767))
{
dist[j]=j;
}
}
max=0;
for(j=0;j<total_vp;j++)
if(max<dist[j])
{
max=dist[j];
maxpage=j;
}
freepf_head=&pfc[pl[maxpage].pfn];
freepf_head->next=NULL;
pl[maxpage].pfn=INVALID;
}
pl[page[i]].pfn=freepf_head->pfn;
freepf_head=freepf_head->next;
}
}
printf("OPT:%6.4f\n",1-(float)diseffect/320);
return 0;
}
/*该算法时根据已知的预测未知的,least frequency  Used是最不经常使用置换法*/
int  LFU(int total_pf)
{
int i,j,min,minpage;
pfc_type *t;
initialize(total_pf);
for(i=0;i<total_instruction;i++)
{
if(pl[page[i]].pfn==INVALID)      /*页面失效*/
{
diseffect++;
if(freepf_head==NULL)          /*无空闲页面*/
{
min=32767;
/*获取counter的使用用频率最小的内存*/
for(j=0;j<total_vp;j++)
{
if(min>pl[j].counter&&pl[j].pfn!=INVALID)
{
min=pl[j].counter;
minpage=j;
}
}
freepf_head=&pfc[pl[minpage].pfn];
pl[minpage].pfn=INVALID;
pl[minpage].counter=0;
freepf_head->next=NULL;
}
pl[page[i]].pfn=freepf_head->pfn;   //有空闲页面,改为有效
pl[page[i]].counter++;
freepf_head=freepf_head->next;      //减少一个free 页面
}
else
{
pl[page[i]].counter;
pl[page[i]].counter=pl[page[i]].counter+1;
}
}
printf("LFU:%6.4f\n",1-(float)diseffect/320);
return 0;
}

运行结果:

算法计算访问命中率.相关推荐

  1. Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法 计算软键盘上下

    Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode  urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法  计算软键盘上下左 ...

  2. 使用余弦相似度算法计算文本相似度-数学

    20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...

  3. 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★

    文章目录 一. CSMA/CD 协议 二. 传播时延对于 载波监听 的影响 三. 单程端到端传播时延 相关概念 四. 碰撞后重传时机 ( 截断二进制指数规避算法 ) 五.截断二进制指数规避算法 计算示 ...

  4. Boost:使用行列式函数和transform()算法计算许多4x4矩阵的行列式

    Boost:使用行列式函数和transform()算法计算许多4x4矩阵的行列式 实现功能 C++实现代码 实现功能 使用行列式函数和transform()算法计算许多4x4矩阵的行列式 C++实现代 ...

  5. java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...

    德州扑克中比较重要的一个算法就是计算牌面的得分,不仅仅关乎概率计算的结果,同时也需要很高的性能.蒙特卡洛算法计算的次数越多结果越准确,因此算法的性能至关重要.下面是一个高性能的牌面java计算算法. ...

  6. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...

    (数据结构课程设计分类题目 线性表 顺序表: 1.设有一元素为整数的线性表L=(a1,a2,a3,-,an),存放在一维数组A[N]中,设计一个算法,以表中an作为参考元素,将该表分为左.右两部分,其 ...

  7. c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现

    数值作业:龙贝格算法计算积分C语言实现 数值作业:龙贝格算法计算积分C语言实现 根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为 ...

  8. 利用MSFM算法计算程函方程的走时CT胖射线反演法

    利用MSFM算法计算程函方程的走时CT胖射线反演法 基于程函方程的弹性波走时CT胖射线反演方法,是在反演迭代过程中,利用程函方程计算走时场,并得到接收点处的走时数据,用这个数据代替正演数据.每次迭代完 ...

  9. Graham-Scan算法计算凸包的Python代码实现

    对于一个点集P来讲,它的凸包就是一个凸多边形Q,其中满足P中的每个点都在Q的边界上或内部.就像下图所示 凸包的计算算法有好多种,wiki和算法导论第33章中都有比较详细的介绍,比如下面是算法导论中给出 ...

最新文章

  1. 前端如何使用proxyTable和nginx解决跨域问题
  2. 另一个git进程似乎在这个存储库中运行
  3. String、StringBuffer、与StringBuilder的区别
  4. python函数手册_python学习手册——内置函数(上)
  5. 【转】idea激活搭建授权服务器
  6. winform教_电脑绝技教你22天学精Csharp之第十五天winform应用程序补充5
  7. 【熊猫多模式站群开发日志】 优化了关键词调度和模板调度
  8. 关于IOC反射错误(无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性...)的诊断办法...
  9. 【Android】NanoHttpd学习(一)
  10. CAN总线学习总结2——CAN错误及CAN busoff处理机制
  11. 最新消息:原谷歌中国副院长刘骏任职人民搜索首席科学家
  12. CentOS LiveCD U盘安装方法
  13. OpenCasCade 教程-瓶子 (1)
  14. TDSQL-C PostgreSQL(CynosDB) 内核解密-披荆斩棘,勇往直前的腾讯云数据库
  15. Jmeter学习-BeanShell 内置变量vars、props、prev
  16. Git和SVN的优缺点/比较/区别
  17. DirectUI相关文章(三)-DirectUI 设计思路分析
  18. 利用python抓取网页各种类型内容(静态、动态)
  19. access 重置索引_Microsoft Access中的索引
  20. 学习笔记-会话技术CookieSession

热门文章

  1. 班子不到位,一切都白费
  2. 《数据结构与算法》(十四)- 图的应用:最短路径
  3. 基于cocoCreator版本2.4.5整理一款2D小游戏快速开发的游戏框架
  4. 漫画照片在线生成?在线操作学习一下
  5. 计算机在无纸化办公系统中应用属于,0506非计算机专业和计算机专业基础部分会考练习题.doc...
  6. (实验38)单片机,STM32F4学习笔记,代码讲解【SD卡实验】【正点原子】【原创】
  7. vue + 百度地图 +点位标注
  8. 【单片机】心形流水灯の制作指南(保姆级)
  9. 【北京.5月28日】第六届 Mobile Dev Day – WP7优秀应用经验分享日
  10. centos7系统安装与磁盘空间分配