页面置换算法-LRU

页面置换算法-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;
}
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、实验题目:页面置换算法(请求分页) 二、实验目的: 进一步理解父子进程之间的关系。 1) 理解内存页面调度的机理。 2) 掌握页面置换算法的实现方法。 3) 通过实验比较不同调度算法的优劣。 4) 培养综合运用所学知识的能力。 页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。 三、实验内容及要求 这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。 程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存页面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存页面进行调度。要求: 1) 每个子进程应能反映出页面置换的过程,并统计页面置换算法的命中或缺页情况。 设缺页的次数为diseffect。总的页面访问次数为total_instruction。 缺页率 = disaffect/total_instruction 命中率 = 1- disaffect/total_instruction 2)将为进程分配的内存页面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
本实验使用一下算法 使用rand()函数随机产生页面号,用数组装入页面号,模拟页面调入内存中发生页面置换的过程。 整个过程,都是使用数组来实现每个算法,模拟队列,模拟堆栈的功能,实现每一个置换算法页面置换算法 最佳置换算法(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。用于算法评价参照。 随机置换算法 (S):产生一个取值范围在0和N-1之间的随机数,该随机数即可表示应被淘汰出内存的页面。 先进先出置换算法(FIFO):选择最先进入内存即在内存驻留时间最久的页面换出到外存。 最近最久未使用置换算法LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存 Clock置换算法:为进入内存的页面设置一个访问位,当内存中某页被访问,访问位置一,算法在选择一页淘汰时,只需检查访问位,若为0,则直接换出,若为1,置该访问位为0,检测内存中的下一个页面的访问位。 改进型Clock置换算法: ①从查寻指针当前位置起扫描内存分页循环队列,选择A=0且M=0的第一个页面淘汰;若未找到,转② ② 开始第二轮扫描,选择A=0且M=1的第一个页面淘汰,同时将经过的所有页面访问位置0;若不能找到,转①
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Founless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值