算法计算访问命中率.
设计一个虚拟存储区和内存工作区,并使用下列算法计算访问命中率.
(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;
}
运行结果:
算法计算访问命中率.相关推荐
- 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. 软键盘算法 计算软键盘上下左 ...
- 使用余弦相似度算法计算文本相似度-数学
20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...
- 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★
文章目录 一. CSMA/CD 协议 二. 传播时延对于 载波监听 的影响 三. 单程端到端传播时延 相关概念 四. 碰撞后重传时机 ( 截断二进制指数规避算法 ) 五.截断二进制指数规避算法 计算示 ...
- Boost:使用行列式函数和transform()算法计算许多4x4矩阵的行列式
Boost:使用行列式函数和transform()算法计算许多4x4矩阵的行列式 实现功能 C++实现代码 实现功能 使用行列式函数和transform()算法计算许多4x4矩阵的行列式 C++实现代 ...
- java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...
德州扑克中比较重要的一个算法就是计算牌面的得分,不仅仅关乎概率计算的结果,同时也需要很高的性能.蒙特卡洛算法计算的次数越多结果越准确,因此算法的性能至关重要.下面是一个高性能的牌面java计算算法. ...
- 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...
(数据结构课程设计分类题目 线性表 顺序表: 1.设有一元素为整数的线性表L=(a1,a2,a3,-,an),存放在一维数组A[N]中,设计一个算法,以表中an作为参考元素,将该表分为左.右两部分,其 ...
- c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现
数值作业:龙贝格算法计算积分C语言实现 数值作业:龙贝格算法计算积分C语言实现 根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为 ...
- 利用MSFM算法计算程函方程的走时CT胖射线反演法
利用MSFM算法计算程函方程的走时CT胖射线反演法 基于程函方程的弹性波走时CT胖射线反演方法,是在反演迭代过程中,利用程函方程计算走时场,并得到接收点处的走时数据,用这个数据代替正演数据.每次迭代完 ...
- Graham-Scan算法计算凸包的Python代码实现
对于一个点集P来讲,它的凸包就是一个凸多边形Q,其中满足P中的每个点都在Q的边界上或内部.就像下图所示 凸包的计算算法有好多种,wiki和算法导论第33章中都有比较详细的介绍,比如下面是算法导论中给出 ...
最新文章
- 前端如何使用proxyTable和nginx解决跨域问题
- 另一个git进程似乎在这个存储库中运行
- String、StringBuffer、与StringBuilder的区别
- python函数手册_python学习手册——内置函数(上)
- 【转】idea激活搭建授权服务器
- winform教_电脑绝技教你22天学精Csharp之第十五天winform应用程序补充5
- 【熊猫多模式站群开发日志】 优化了关键词调度和模板调度
- 关于IOC反射错误(无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性...)的诊断办法...
- 【Android】NanoHttpd学习(一)
- CAN总线学习总结2——CAN错误及CAN busoff处理机制
- 最新消息:原谷歌中国副院长刘骏任职人民搜索首席科学家
- CentOS LiveCD U盘安装方法
- OpenCasCade 教程-瓶子 (1)
- TDSQL-C PostgreSQL(CynosDB) 内核解密-披荆斩棘,勇往直前的腾讯云数据库
- Jmeter学习-BeanShell 内置变量vars、props、prev
- Git和SVN的优缺点/比较/区别
- DirectUI相关文章(三)-DirectUI 设计思路分析
- 利用python抓取网页各种类型内容(静态、动态)
- access 重置索引_Microsoft Access中的索引
- 学习笔记-会话技术CookieSession
热门文章
- 班子不到位,一切都白费
- 《数据结构与算法》(十四)- 图的应用:最短路径
- 基于cocoCreator版本2.4.5整理一款2D小游戏快速开发的游戏框架
- 漫画照片在线生成?在线操作学习一下
- 计算机在无纸化办公系统中应用属于,0506非计算机专业和计算机专业基础部分会考练习题.doc...
- (实验38)单片机,STM32F4学习笔记,代码讲解【SD卡实验】【正点原子】【原创】
- vue + 百度地图 +点位标注
- 【单片机】心形流水灯の制作指南(保姆级)
- 【北京.5月28日】第六届 Mobile Dev Day – WP7优秀应用经验分享日
- centos7系统安装与磁盘空间分配