热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(C语言实现)页面置换——先进先出算法(FIFO)

原标题:(C语言实现)页面置换——先进先出算法(FIFO)一、设计目的:加深对请求页式存储管理实现原理的理解,掌握页面置换算法中的

原标题:(C语言实现)页面置换——先进先出算法(FIFO)

一、设计目的:

加深对请求页式存储管理实现原理的理解,掌握页面置换算法中的先进先出算法。

二、设计内容

设计一个程序,有一个虚拟存储区和内存工作区,实现下述三种算法中的任意两种,计算访问命中率(命中率=1-页面失效次数/页地址流长度)。附加要求:能够显示页面置换过程。
该系统页地址流长度为320,页面失效次数为每次访问相应指令时,该指令对应的页不在内存的次数。
程序首先用srand()和rand()函数分别进行初始化、随机数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
通过随机数产生一个指令序列。共320条指令,指令的地址按下述原则生成:
(1)50%的指令是顺序执行的。
(2)25%的指令是均匀分布在前地址部分。
(3)25%的指令是均匀分布在后地址部分。
具体的实施方法如下:
在【0,319】的指令地址之间随机选取一起点m。
顺序执行一条指令,即执行地址为m+1的指令。
在前地址【0,m+1】中随机选取一条指令并执行,该指令的地址为m’。
顺序执行一条指令,其地址为m’+1。
在后地址【m’+2,319】中随机选取一条指令并执行。
重复步骤(1)-(5),直到320次指令。
将指令序列变换为页地址流。
设:
页面大小为1KB。
用户内存容量4页到32页。
用户虚存容量为32KB。
在用户虚存中,按每K存放10条指令虚存地址,即320条指令在虚存中的存放方式为:
第0条~9条指令为第0页(对应虚存地址为【0,9】)。
第10条~19条指令为第1页(对应虚存地址为【10,19】)。
……
第310条~319条指令为第31页(对应虚拟地址为【310,319】)。
按以上方式,用户指令可组成32页。
计算每种算法在不同内存容量下的命中率。

三、程序结构:

首先,用srand()和rand()函数分别进行初始化、随机数定义和产生指令序列;
接着,将指令序列变换成相应的页地址流;

然后,并针先进先出算法计算出相应的命中率和输出页面置换过程。

源程序:

#include
#include
#define N 320
int num[N]; //存放随机数
int page[N]; //存放页地址流
int mc文章来源地址36476.html[33]; //memory capacity内存容量 ,并初始化为0
void randomnumber()//random number随机数 程序第一步,产生320个指令序列
{
int pc;
int flag=0;
scanf("%d",&pc);www.yii666.com
printf("\n在0-319之间产生的320个随机数如下:\n");
for(int i=0;i<320;i++)
{
num[i]=pc;
if(flag%2==0) pc=++pc%320; //flag=0||2 50%的指令是顺序执行的
if(flag==1) pc=rand()% (pc-1); //flag=1 25%的指令是均匀分布在前地址部分
if(flag==3) pc=pc+1+(rand()%(320-(pc+1))); //flag=3 25%的指令是均匀分布在后地址部分
flag=++flag%4;
printf("%3d ",num[i]);
if((i+1)%10==0) printf("\n"); //每行输出10个数
}
}
void pageaddress() //pageaddress页地址 程序第二步,将指令序列变换为页地址流
{
for(int i=0;i<320;i++)
{
printf("%3d ",page[i]=num[i]/10);
if((i+1)%10==0) printf("\n"); //每行输出10个数
}
}
inwww.yii666.comt FIFO(int capacity)
{
int j,x,y,m;
int sum=0; //mc中分配的个数
int exist=0; //命中次数
int flag; //标志是否命中 flag=0没命中 flag=1命中
int ep=1; //elimination position淘汰位置
mc[1]=page[0];
printf(" %2d加入 \t",page[0]);
for(m=1;m<=capacity;m++) //输出当前内存块的存储情况
printf("%2d ",mc[m]);
printf("\n");
sum+=1;
fo文章来源站点https://www.yii666.com/r(j=1;j<320;j++)
{
flag=0;
for(y=1;y<=sum;y++) //判断这个页地址流是否命中
if(mc[y]==page[j]) {
exist++;
flag=1;
printf(" %2d命中 \t",page[j]);
for(m=1;m<=capacity;m++) //输出当前内存块的存储情况
printf("%2d ",mc[m]);
printf("\n文章来源地址36476.html");
break;}
//没命中
if(flag==0)
{
if(sum {for(x=1;x<=capacity;x++) //查找内存块中第一个空块
if(mc[x]==-1) {
mc[x]=page[j];
sum++;
printf(" %2d加入 \t",page[j]);
for(m=1;m<=capacity;m++) //输出当前内存块的存储情况
printf("%2d ",mc[m]);
printf("\n");
break;}
}
else if(sum>=capacity)
{
int t=mc[ep];
mc[ep]=page[j];
printf(" %2d置换%2d\t",page[j],t);
for(m=1;m<=capacity;m++) //输出当前内存块的存储情况
printf("%2d ",mc[m]);
printf("\n");
ep+=1;
if(ep==capacity+1) ep=1;
}
}
}
printf("\nexist=%d\n命中率=%lf",exist,exist/320.0);
}
int main()
{
int capacity; //内存块数
printf("请输入第一条指令号(0~319):");
randomnumber();
printf("\n指令序列对应的页地址流:\n");
pageaddress();
printf("\n\n\n\t\t先进先出算法(FIFO):\n\n");
printf("请输入内存块数(4-32):");
scanf("%d",&capacity);
for(int i=1;i<=32;i++) //给数组赋初值
mc[i]=-1;
FIFO(capacity);
return 0;
}

来源于:(C语言实现)页面置换——先进先出算法(FIFO)


推荐阅读
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 本文针对HDU 1042 N! 问题提供详细的解析和代码实现。题目要求计算给定整数N(0 ≤ N ≤ 10000)的阶乘N!。文章不仅提供了算法思路,还附上了C++语言的具体实现。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • 在学习了Splay树的基本查找功能后,可能会觉得它与普通的二叉查找树没有太大的区别,仅仅是通过splay操作减少了时间开销。然而,Splay树之所以被誉为“序列之王”,主要在于其强大的区间操作能力。 ... [详细]
  • Day4今天继续复习搞基础课,加油!树形DP每一个节点都分为选和不选两种状态,选为f[i,1],不选为f[i,0]&# ... [详细]
  • 本题旨在通过实现矩阵加法,加深对多维数组的理解。题目要求读取两个 n×m 的矩阵 A 和 B,并计算它们的和。 ... [详细]
  • 本文详细探讨了select和epoll两种I/O多路复用技术的内部实现原理,分析了它们在处理大量文件描述符时的性能差异,并通过具体示例代码展示了select的工作流程。 ... [详细]
  • UVa 11683: 激光雕刻技术解析
    自1958年发明以来,激光技术已在众多领域得到广泛应用,包括电子设备、医疗手术工具、武器等。本文将探讨如何使用激光技术进行材料雕刻,并通过编程解决一个具体的激光雕刻问题。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • 本文介绍了一个来自AIZU ONLINE JUDGE平台的问题,即清洁机器人2.0。该问题来源于某次编程竞赛,涉及复杂的算法逻辑与实现技巧。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
author-avatar
小群群zheng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有