页面置换算法-LRU实验报告
目录
原创性声明
1 项目描述
2 系统结构分析
3 系统详细设计
4 系统主要算法
5 系统程序实现
6课程设计总结
附录:源程序
原创性声明
参考文献
《面向对象程序设计与VisualC++6.0教程》 陈天华编著
《C程序设计(第三版)》 谭浩强编著
《C++入门经典》
《面向对象程序设计与C++实现》 刘晋萍编著
《计算机操作系统教程》 徐甲同等编著
《计算机操作系统》 翟一鸣等编著
《操作系统实验教程 》 张丽芬, 刘利雄, 王全玉编著
《计算机操作系统》 梁红兵、哲风屏、汤子瀛 编著
《操作系统教程》 陈向群、杨芙清 编著
**
**
设计一个程序,有一个虚拟存储区和内存工作区,实现下述三种算法中的任意两种,计算访问命中率(命中率=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页。计算每种算法在不同内存容量下的命中率。
*
1 项目描述*
在各种存储器管理方式中,有一个共同的特点,即它们都要求将一个作业全部装入内存方能运行,但是有两种情况:(1) 有的作业很大,不能全部装入内存,致使作业无法运行;(2) 有大量作业要求运行,但内存容量不足以容纳所有这些作业。而虚拟内存技术正式从逻辑上扩充内存容量,将会解决以上两个问题。
从内存中调出一页程序或数据送磁盘的对换区中,通常,把选择换出的页面的算法称为页面置换算法(Page-Replacement Algorithms)。进而页面置换算法模拟程序能客观的将其工作原理展现在我们面前。
*
2 系统结构分析
首先,定义宏变量,设置所占最大内存长度。编辑以时间为种子,初始化随即发生器。进行相关页面输入程序的编写以及页面的打印。
其次,寻找最近最近最久未使用的页面 、记录当前内存块中页面离下次使用间隔长度等相关程序的代码编写。
最后,进行LRU算法的编写。.
*
程序N-S图
3 系统详细设计
由于分区式管理尽管实现方式较为简单,但存在着严重的碎片问题使得内存的利用率不高。再者,分区式管理时,由于各作业或进程对应于不同的分区以及在分区内各作业或进程连续存放,进程的大小或内存可用空间的限制。而且分区式管理也不利于程序段和数据段的共享。页式管理正是为了减少碎片以及为了只在内存存放那些反复执行或即将执行的程序段与数据部分,而把那些不经常执行的程序段和数据存放于外存待执行时调入,以提高内存利用率而提出来的页式管理有动态页式管理和静态页式管理之分,动态页式管理是在静态页式管理的基础上发展起来的。请求页式管理属于动态页式管理中的一一种,它的地址变换过程与静态页式管理时的相同,也是通过页表查出相应的页面号,由页面号与页内相对地址相加而得到实际物理地址。有关的地址变换部分是由硬件自动完成的。当硬件变换机构发现所要求的页不在内存时,产生缺页中断信号,由中断处理程序做出相应的处理。中断处理程序是由软件实现的。除了在没有空闲页面时要按照置换算法选择出被淘汰页面之外,还要从外存读入所需要的虚页。这个过程要启动相应的外存和涉及到文件系统。因此,请求页式管理是一个十分复杂的过程,内存利用率的提高是以牺牲系统开销的代价换来的。这里用到了置换算法。它是在内存中没有空闲页面时被调用。目的是选出一个被淘汰的页面。如果内存中有足够的空闲页面存放所调入的页,则不必使用置换算法。把内存和外存统一管理的真正目的是把那些被访问概率非常高的页存放在内存中。因此,置换算法应该置换那些被访问概率低的页,将它们移出内存。
*
4 系统主要算法
5系统程序实现
代码:
if(c==2)//LRU页面置换
{
n=0;
cout<<" ****************************************** "<<endl;
cout<<endl;
cout<<" LRU算法页面置换情况如下: "<<endl;
cout<<endl;
cout<<" ****************************************** "<<endl;
while(i<m)
{
int a;
t=Search(p[i].num,page);
if(t>=0) //如果已在内存块中
{
page[t].time=0; //把与它相同的内存块的时间置0
for(a=0;a<M;a++)
if(a!=t)page[a].time++; //其它的时间加1
cout<<p[i].num<<" ";
cout<<"不缺页"<<endl;
}
else //如果不在内存块中
{
n++; //缺页次数加1
t=Max(page); //返回最近最久未使用的块号赋值给t
page[t].num=p[i].num; //进行替换
page[t].time=0; //替换后时间置为0
cout<<p[i].num<<" ";
print(page);
for(a=0;a<M;a++)
if(a!=t)page[a].time++; //其它的时间加1
}
i++;
}
cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl;
}
6. 课程设计总结
通过这次课程设计,不仅让我了解了页面置换算法,开始我一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没没有成功,我仔细的分析题目,分析材料,在原有的基础上我进行了改正,我最后还是调试成功了,还是经过了一翻努力,这次操作系统实验,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握。通过努力,LRU页面置换算法程序都已经完成,此时此刻,我心里多了些成就感。
虽然自己所做的很少也不够完善,但毕竟也是努力的结果。主要有以下几点收获:
1.通过对上网和看书查阅相关资料,使自己对C++语言的基本框架有新的了解,加深了对其的认识。
2.在使用C++语言来实现功能时,不像以往用的其他语言,它比较简练,更容易理解,实用性很强。
课程设计就要结束了,不但对专业知识有了更深的理解,更使的自己认识到实践的重要性,理论、实践相结合才能达到很好的学习效果,特别是程序语言的学习。
源程序
#include<iostream>
#define N 3
using namespace std;
int main()
{
int ym[]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
int lru[N]={1,0,7};
int len[N]={0,0,0};
int allchagetimes=0;
for(int t=0;t<N;t++)
{
cout<<lru[t]<<" ";
}
cout<<endl;
for(int i=3;i<20;i++)
{
int flag=0;
int j=0;
int sum=0;
for(;j<N;j++)
{
if(ym[i]==lru[j])
{
flag=1;
break;
}
else if(ym[i]!=lru[j])
{
sum++;
if(sum==3)
{
flag=0;
break;
}
}
}
if(flag==1)
{
int temp=lru[0];
if(j==0)
{
}
else if(j==1)
{
lru[0]=lru[j];
lru[2]=lru[2];
lru[1]=temp;
}
else if(j==2)
{
lru[0]=lru[j];
lru[2]=lru[1];
lru[1]=temp;
}
}
else if(flag==0)
{
allchagetimes++;
lru[2]=lru[1];
lru[1]=lru[0];
lru[0]=ym[i];
}
for(int t=0;t<N;t++)
{
cout<<lru[t]<<" ";
}
cout<<endl;
}
cout<<"缺页"<<allchagetimes+3 <<"次,置换"<<allchagetimes<<"次"<<endl;
}