热门标签 | 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)


推荐阅读
  • 本文深入探讨了 Python 中的循环结构(包括 for 循环和 while 循环)、函数定义与调用,以及面向对象编程的基础概念。通过详细解释和代码示例,帮助读者更好地理解和应用这些核心编程元素。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
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社区 版权所有