实验六页面置换

合集下载

页面置换算法实验报告

页面置换算法实验报告

页面置换算法实验报告
一、实验内容
本次实验主要围绕页面置换算法进行,以实验课本的实例介绍,采用FIFO页面置换算法对后面提到的参数进行置换,最终得出页面置换的结果和比较所得结果。

二、实验步骤
(一) 熟悉FIFO算法
首先是要了解FIFO页面置换算法,FIFO全称(First In First Out),按页面进入内存的顺序来替换相应内存页面,先进先出,将先进入内存的页面先替换出去。

(二) 阅读实验课本
在阅读实验课本之前要先熟悉实验书上所介绍的FIFO算法,然后在实验书上找出需要做的实验,并对实验环境和表格进行观察,掌握实验的基本内容。

(三) 开始页面置换
在开始实验之前,熟悉实验环境,根据实验书上的参数,首先模拟进程分配内存,根据FIFO算法去进行计算,根据上表中的参数去比较,最后得出最终结果。

(四) 在本次实验的补充
这次实验中,可以把FIFO的概念应用到实际应用中,也可以模拟不同情况,例如改变页面的大小,观察不同页面置换算法的结果,实验出最合适的结果。

三、实验结论
本次实验是为了了解FIFO页面置换算法,实验出最终的结果,最后得出页面置换的结果及比较结果。

页面置换算法实验(内含完整代码)

页面置换算法实验(内含完整代码)

实验二存储管理一、实验目的通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。

二、实验内容基于一个虚拟存储区和内存工作区,设计下述算法并计算访问命中率。

1、最佳淘汰算法(OPT)2、先进先出的算法(FIFO)3、最近最久未使用算法(LRU)4、简单时钟(钟表)算法(CLOCK)命中率=1-页面失效次数/页地址流(序列)长度三、实验原理简述UNIX中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。

当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。

这种页面调入方式叫请求调页。

为实现请求调页,核心配置了四种数据结构:页表、页帧(框)号、访问位、修改位、有效位、保护位等。

当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。

该程序通过查找页表,得到该页所在外存的物理块号。

如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。

如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。

利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。

整个页面的调入过程对用户是透明的。

四、算法描述本实验的程序设计基本上按照实验内容进行。

即使用srand( )和rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。

(1)通过随机数产生一个指令序列,共320条指令。

指令的地址按下述原则生成:A:50%的指令是顺序执行的B:25%的指令是均匀分布在前地址部分C:25%的指令是均匀分布在后地址部分具体的实施方法是:A:在[0,319]的指令地址之间随机选取一起点mB:顺序执行一条指令,即执行地址为m+1的指令C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’D:顺序执行一条指令,其地址为m’+1E:在后地址[m’+2,319]中随机选取一条指令并执行F:重复步骤A-E,直到320次指令(2)将指令序列变换为页地址流设:页面大小为1K;用户内存(页帧)容量为4页~32页;用户虚存容量为32K。

【精品】页面置换算法实验报告

【精品】页面置换算法实验报告

【精品】页面置换算法实验报告一、实验目的了解操作系统中的页面置换算法,并实现FIFO、LRU和Clock算法。

二、实验原理页面置换算法是操作系统中用到的一种算法,其作用是在内存不够用时,选择牺牲已经在内存中的一些页,腾出更多的空间给新的内容。

本次实验主要实现了FIFO、LRU和Clock算法。

1、FIFO算法FIFO算法是最简单的页面置换算法,它采用先进先出的原则,即最先进入内存的页面应该最早被替换出去。

该算法的实现非常简单,只需要维护一个队列即可。

当需要置换页面时,选择队列的第一个页面进行替换即可。

2、LRU算法LRU算法是Least Recently Used的缩写,即最近最少使用算法。

该算法的核心思想是选择最久没有被使用的页面进行替换。

为了实现该算法,需要维护记录页面使用时间的链表、栈或队列等结构。

3、Clock算法Clock算法也叫做二次机会算法,是一种改良的FIFO算法。

它是基于FIFO算法的思想,并且每个页面都设置了一个使用位(use bit),用于记录该页面是否被使用过。

当需要置换一个页面时,检查该页面的使用位,如果该页面的使用位为1,则将该页面的使用位设置为0并移到队列的末尾,表示该页面有“二次机会”继续待在内存中;如果该页面的使用位为0,则选择该页面进行替换。

三、实验过程本次实验采用Python语言实现页面置换算法,并使用样例进行测试。

1、FIFO算法实现FIFO算法的实现非常简单,只需要用一个队列来维护已经在内存中的页面,当需要置换页面时,选择队列的第一个元素即可。

代码如下:```pythonfrom collections import dequeclass FIFO:def __init__(self, frame_num):self.frame_num = frame_numself.frames = deque(maxlen=frame_num)def access(self, page):if page in self.frames:return Falseif len(self.frames) >= self.frame_num:self.frames.popleft()self.frames.append(page)return True```2、LRU算法实现LRU算法的实现需要维护一个记录页面使用时间的链表或队列。

页面置换实验报告

页面置换实验报告

计算机科学系实验报告书课程名:《操作系统》题目:虚拟存储器管理页面置换算法模拟实验班级:学号:姓名:一、实验目的与要求1.目的:请求页式虚存管理是常用的虚拟存储管理方案之一。

通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。

2.要求:本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。

其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。

要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。

程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。

二、实验说明1.设计中虚页和实页的表示本设计利用C语言的结构体来描述虚页和实页的结构。

在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。

pfn 代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。

time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。

在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。

pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。

next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。

2.关于缺页次数的统计为计算命中率,需要统计在20次的虚页访问中命中的次数。

为此,程序应设置一个计数器count,来统计虚页命中发生的次数。

每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。

最终命中率=count/20*100%。

3.LRU算法中“最近最久未用”页面的确定为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值,表示该虚页的最后一次被访问时间。

页面置换算法实验报告

页面置换算法实验报告

页面置换算法实验报告页面置换算法实验报告一、引言在计算机操作系统中,页面置换算法是一种重要的内存管理策略。

当物理内存不足以容纳所有需要运行的进程时,操作系统需要根据一定的算法将部分页面从内存中换出,以便为新的页面腾出空间。

本实验旨在通过实际操作,对比不同的页面置换算法在不同场景下的性能表现。

二、实验背景在计算机系统中,每个进程都有自己的虚拟内存空间,而物理内存空间是有限的。

当进程需要访问某个页面时,如果该页面不在物理内存中,就会发生缺页中断,操作系统需要根据页面置换算法选择一个页面将其换出,然后将需要访问的页面换入。

常见的页面置换算法有先进先出(FIFO)、最近最久未使用(LRU)、时钟(Clock)等。

三、实验目的本实验旨在通过模拟不同的页面置换算法,比较它们在不同情况下的缺页率和效率。

通过实验结果,评估各个算法在不同场景下的优劣,为实际系统的内存管理提供参考。

四、实验设计与方法本实验选择了三种常见的页面置换算法进行比较:FIFO、LRU和Clock。

我们使用C++编程语言模拟了一个简单的内存管理系统,并通过产生不同的访存序列来模拟不同的场景。

实验中,我们设置了不同的物理内存大小,访存序列长度和页面大小,以模拟不同的系统环境。

五、实验结果与分析在实验中,我们分别测试了FIFO、LRU和Clock算法在不同的系统环境下的表现。

通过统计不同算法的缺页率和运行时间,得出以下结论:1. FIFO算法FIFO算法是最简单的页面置换算法,它按照页面进入内存的顺序进行置换。

实验结果表明,FIFO算法在缺页率方面表现一般,特别是在访存序列具有局部性的情况下,其性能明显下降。

这是因为FIFO算法无法区分不同页面的重要性,可能会将经常使用的页面换出,导致缺页率升高。

2. LRU算法LRU算法是一种基于页面访问时间的置换算法,它认为最近被访问的页面很可能在未来会被再次访问。

实验结果表明,LRU算法在缺页率方面表现较好,特别是在访存序列具有较强的局部性时,其性能明显优于FIFO算法。

页面置换算法实验报告

页面置换算法实验报告

页面置换算法实验报告一、实验目的本次实验的目的是通过模拟页面置换算法的过程,了解不同算法的优缺点,掌握算法的实现方法,以及对算法的性能进行评估。

二、实验原理页面置换算法是操作系统中的一个重要概念,它是为了解决内存不足的问题而产生的。

当系统中的进程需要使用内存时,如果内存已经被占满,就需要将一些页面从内存中置换出去,以便为新的页面腾出空间。

页面置换算法就是用来决定哪些页面应该被置换出去的算法。

常见的页面置换算法有以下几种:1. 最佳置换算法(OPT)最佳置换算法是一种理论上的最优算法,它总是选择最长时间内不会被访问的页面进行置换。

但是,由于无法预测未来的页面访问情况,因此最佳置换算法无法在实际中使用。

2. 先进先出置换算法(FIFO)先进先出置换算法是一种简单的置换算法,它总是选择最先进入内存的页面进行置换。

但是,这种算法容易出现“抖动”现象,即频繁地将页面置换出去,然后再将其置换回来。

3. 最近最久未使用置换算法(LRU)最近最久未使用置换算法是一种比较常用的置换算法,它总是选择最长时间未被访问的页面进行置换。

这种算法可以避免“抖动”现象,但是实现起来比较复杂。

4. 时钟置换算法(Clock)时钟置换算法是一种改进的FIFO算法,它通过维护一个环形链表来实现页面置换。

当需要置换页面时,算法会从当前位置开始扫描链表,如果找到一个未被访问的页面,则将其置换出去。

如果扫描一圈后都没有找到未被访问的页面,则将当前位置的页面置换出去。

三、实验过程本次实验使用Python语言编写了一个页面置换算法模拟程序,可以模拟上述四种算法的过程,并输出算法的性能指标。

程序的主要流程如下:1. 读取输入文件,获取页面访问序列和内存大小等参数。

2. 根据选择的算法,初始化相应的数据结构。

3. 遍历页面访问序列,模拟页面置换的过程。

4. 输出算法的性能指标,包括缺页率、页面置换次数等。

下面分别介绍四种算法的实现方法。

1. 最佳置换算法(OPT)最佳置换算法需要预测未来的页面访问情况,因此需要遍历整个页面访问序列,找到最长时间内不会被访问的页面。

页面置换算法实验报告实验心得

页面置换算法实验报告实验心得

页面置换算法实验报告实验心得
1. 实验背景
页面置换算法是操作系统中的重要概念,主要用于解决内存不足的问题。

它通过将当前不需要的页面从内存中移出,以腾出空间给即将到来的页面。

本次实验主要是通过模拟不同页面置换算法的过程,来更好地了解和掌握这些算法的实现原理及其优缺点。

2. 实验过程
本次实验中,我们使用了三种页面置换算法,分别是最优页面置换算法(OPT)、先进先出页面置换算法(FIFO)和最近最久未使用页面置换算法(LRU)。

在模拟的过程中,我们需要先给每个页面设置一个访问时间,然后根据不同算法的实现原理来决定哪个页面被置换出去。

通过实验,我们发现不同的算法在不同情况下的效果也会不同。

比如,当页面访问时间相对均匀分布时,FIFO算法的效果会比较好,而当页面访问时间存在一定规律性时,LRU算法的效果则会更好。

而OPT 算法则需要未来时间的信息,一般情况下难以实现,但是在某些特殊情况下,它也可以发挥出比较好的效果。

3. 实验心得
通过本次实验,我更深入地了解了页面置换算法的实现原理,学会了如何根据不同算法的特点来选择合适的算法来解决内存不足的问题。

在实验过程中,我也学会了如何使用Python编程语言来模拟不同算法的过程,提高了我的编程能力。

通过不断地调试和实验,我还学会了如何发现问题和解决问题的方法,这对我今后的学习和工作都大有裨益。

总之,本次实验不仅加深了我对操作系统中重要概念的理解,也提高了我的编程和分析问题的能力,让我对未来的学习和工作充满信心和热情。

页面置换算法实验报告

页面置换算法实验报告

页面置换算法实验报告背景页面置换算法是计算机操作系统中的一个重要概念,它用于解决操作系统需要共享有限的物理内存资源给多个进程使用的问题。

在操作系统中,每个进程都有自己的虚拟地址空间,但实际的物理内存资源是有限的。

当物理内存不足时,操作系统需要根据一定的策略将一部分进程暂时从内存中移出,以便为其他进程让出空间,而后再从外存中将其重新加载到内存中。

这个过程就是页面置换。

页面置换算法有很多种,比如最优页面置换算法(Optimal)、先进先出页面置换算法(FIFO)、最近最久未使用页面置换算法(LRU)等等。

不同的算法对于系统性能、响应时间等指标有着不同的影响,因此在实际应用中需要选择合适的算法来平衡各种需求。

本实验旨在通过模拟页面置换算法,并对不同算法进行性能分析,以便了解各种算法的优缺点,为实际系统的选择提供依据。

分析在实验中,我们选择了三种常用的页面置换算法,分别是FIFO、LRU和Optimal。

下面对这三种算法进行详细的分析和说明。

先进先出页面置换算法(FIFO)FIFO算法是最简单和最直观的页面置换算法。

它按照页面进入内存的顺序来选择被淘汰的页面。

当内存不足时,选择最早进入内存的页面进行置换,即将其从内存中移出。

FIFO算法不需要进行进一步的页面访问计算,只需要维护一个页面进入内存的队列即可,因此实现起来比较简单。

然而,由于FIFO算法没有考虑页面的访问频率和重要性,所以可能会导致被频繁访问的页面被淘汰出内存,从而影响系统的性能。

最近最久未使用页面置换算法(LRU)LRU算法是一种基于”最近使用原则”的页面置换算法。

它根据页面最近被访问的时间来选择被淘汰的页面。

当内存不足时,选择最长时间未被访问的页面进行置换,即将其从内存中移出。

LRU算法需要维护一个页面访问时间的记录,以便在需要置换时能够快速找到最近最久未使用的页面。

相比于FIFO算法,LRU算法更加合理地利用了页面的访问情况,但实现起来相对复杂一些。

操作系统实验-页面置换算法

操作系统实验-页面置换算法

四种页面置换算法一、实验原理:在存运行过程中,若其所要访问的页面不在存而需要把他们调入存,但存已经没有空闲空间时,为了保证该进程能正常运行,系统必须从存中调出一页程序或数据送磁盘的对换区中。

但应将那个页面调出,需根据一定的算法来确定。

通常,把选择换出页面的算法成为页面置换算法。

置换算法的好坏,将直接影响到系统的性能。

一个好的页面置换算法,应具有较低的页面更换频率。

从理论上讲,应将那些以后不再会访问的页面置换出,或者把那些在较长时间不会在访问的页面调出。

目前存在着许多种置换算法(如FIFO,OPT,LRU),他们都试图更接近理论上的目标。

二、实验目的1.通过模拟实现几种基本页面置换的算法,了解虚拟存储技术的特点。

2.掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想,并至少用三种算法来模拟实现。

3.通过对几种置换算法页面的比较,来对比他们的优缺点,并通过比较更换频率来对比它们的效率。

三、实验分析在进程运行过程中,若其所访问的页面不存在存而需要把它们调入存,但存已无空闲时,为了保证该进程能够正常运行,系统必须从存中调出一页程序或数据送磁盘的对换区中。

但应调出哪个页面,需根据一定的算法来确定,算法的好坏,直接影响到系统的性能。

四、运行结果五、代码#include"stdafx.h"#define M 3 //物理页数#define N 20 //需要调入的页数typedef struct page {int num;int time;int temp;}Page; //物理页项,包括调入的页号和时间Page pp[M]; //M个物理页int queue1[20], queue2[20], queue3[20]; //记录置换的页int K = 0, S = 0, T = 0; //置换页数组的标识int pos = 0;//记录存在最长时间项int changenum = 0;int A[N];//初始化存页表项及存储存情况的空间void INIT(){int i;for (i = 0; i<M; i++){pp[i].num = -1;pp[i].time = 0;pp[i].temp = 0;} }//取得存中存在时间最久的位置int GetMax(){int max = -1;int i;for (i = 0; i<M; i++){if (pp[i].time > max){max = pp[i].time;pos = i;}}return pos;}//检查最长时间不使用页面int longestTime(int mxatimep,int temp) {int i;int max = -1;for (i = 0; i<M; i++){pp[i].temp = 0;}for (i = temp; i<N; i++){if (pp[0].temp == 1 && pp[1].temp == 1 && pp[2].temp == 1){ break;}if (pp[0].num != A[i]){pp[0].time++;if (pp[0].temp >= 1){pp[0].time--;}}else{pp[0].temp++;}if (pp[1].num != A[i]){pp[1].time++;if (pp[1].temp >= 1){pp[1].time--;}}else{pp[1].temp++;}if (pp[2].num != A[i]){pp[2].time++;if (pp[2].temp >= 1){pp[2].time--;}else{pp[2].temp++;}}for (i = 0; i<M; i++){if (pp[i].time>max){max = pp[i].time;pos = i;}}return pos;}//检查某页是否在存int Equation(int fold){int i;for (i = 0; i<M; i++){if (pp[i].num == fold)return i;}return -1;}//检查物理存是否已满,-1表满,其他不满int Check(){int i;for (i = 0; i<M; i++){if (pp[i].num == -1)return i;}return -1;}void FIFO(int fold,int temp){int i;int a, b, c;a = Equation(fold);//页已存在if (a != -1){}//页不存在else{b = Check();//存还有空闲if (b != -1){pp[b].num = fold;//存已满,需要置换else {c = GetMax();pp[c].num = fold;pp[c].time = 0;changenum++;}queue1[K++] = fold;}for (i = 0; i<M; i++){if (pp[i].num != -1){pp[i].time++;}}}void OPT(int fold,int temp){int a, b, c;a = Equation(fold);if (a == -1){//页不在存b = Check();//存还有空闲if (b != -1){pp[b].num = fold;}//存已满,需要置换else{c = longestTime(fold,temp);pp[c].num = fold;pp[c].time = 0;changenum++;}queue3[T++] = fold;}}void LRU(int fold,int temp){int i;int a, b;int p;a = Equation(fold);if (a != -1)//页已在存{//把此项移动到链表最后一项if (a == 2)//此项已经在最后,不需要做任何改动{}else{p = Equation(-1);if (p == -1)//链表是满的{for (; a<2; a++)pp[a].num = pp[a + 1].num;pp[2].num = fold;}else if (p <= 3)//链表不满{for (; a<p - 1; a++)pp[a].num = pp[a + 1].num;pp[a].num = fold;}}}else{b = Check();if (b != -1)//不满pp[b].num = fold;else{for (i = 0; i<2; i++)pp[i].num = pp[i + 1].num;pp[2].num = fold;changenum++;}queue2[S++] = fold;}}int_tmain(int argc, _TCHAR* argv[]){int B[N];int i;INIT();changenum = 0;printf("请依次输入%d个页面号:\n", N);for (i = 0; i<N; i++){scanf_s("%d", &A[i]);}//OPTprintf("\n");printf("1.最佳置换算法(Opt)\n");INIT();changenum = 0;for (i = 0; i<N; i++){B[i] = A[i];}for (i = 0; i<N; i++){OPT(B[i], i);}printf("\n");printf("OPT算法,调入页面顺序为:");for (i = 0; i<T; i++)printf("%3d", queue3[i]);printf("\n页面置换次数为:%6d\n缺页率:%16.2f\n\n", changenum, (float)changenum / N); //FIFOprintf("2.先进先出页面置换算法(FIFO)\n");INIT();changenum = 0;for (i = 0; i<N; i++){B[i] = A[i];}for (i = 0; i<N; i++){FIFO(B[i], i);}printf("FIFO算法,调入页面顺序为:");for (i = 0; i<K; i++)printf("%3d", queue1[i]);printf("\n页面置换次数为:%6d\n缺页率:%16.2f\n\n", changenum, (float)changenum / N);//LRUprintf("3.最近最久未使用算法(LRU)\n");INIT();changenum = 0;for (i = 0; i<N; i++){B[i] = A[i];}for (i = 0; i<N; i++){LRU(B[i], i);}printf("LRU算法,调入页面顺序为:");for (i = 0; i<S; i++)printf("%3d", queue2[i]);printf("\n页面置换次数为:%6d\n缺页率:%16.2f\n\n", changenum, (float)changenum / N);printf("\n");printf("四种算法已全部执行完毕!\n");return 0;}。

操作系统实验报告材料6-页面置换算法模拟

操作系统实验报告材料6-页面置换算法模拟

实验报告( 2013 / 2014学年第1学期)课程名称操作系统原理实验名称实验6:页面置换算法模拟实验时间2013 年12 月 10 日指导单位软件工程系指导教师杨健学生姓名班级学号学院(系) 软件工程系专业计算机软件与服务外包//物?理え?块é定¨义?typedef struct BlockNode{int page_index;//page数簓组哩?的?下?标括?struct BlockNode * next;}BlockNode;struct{int length;//当獭?前°物?理え?块é长¤度èint miss_flag;//缺ā?页?标括?志?,?若?为a1,?则ò缺ā?页?int miss_count;//缺ā?页?次?数簓BlockNode*front;BlockNode*rear;}Block;//本?程ì序ò中D全?局?变?量?名?均ù由?两?个?单蹋?词洙?组哩?成é,?且ò开a头?字?母?大洙?写′int BlockSize = 5;//物?理え?块é大洙?小?int PageCount = 200;//页?面?总哩?数簓int PageSize = 1024;//页?面?大洙?小?int AddrRange = 8*1024;//访?问ê地?址·范?围§int get_num(int down,int up)//得?到?一?个?down~up之?间?的?整?数簓{int num;char str[111];while(1){fgets(str,111*sizeof(int),stdin);num=atoi(str);//把?字?符?串?中D的?数簓字?转羇换?为a整?数簓if(num>=down&& num<=up)break;printf("输?入?范?围§有瓺误ó,请?重?新?输?入?:");}//whilereturn num;}void init_block()//构1造ì一?个?空?的?物?理え?块é队ó列{Block.rear=Block.front=(BlockNode*)malloc(sizeof(BlockNode)); if(!Block.front){printf("内ú存?分?配?失骸?败悒?\n");exit(0);}Block.length=0;Block.miss_count=0;Block.rear->next=NULL;}void enqueue(int page_index)//入?队óvoid clear_block()//清?空?物?理え?块é{while(Block.rear=Block.front->next){ Block.front->next=Block.rear->next;free(Block.rear);Block.length--;}Block.rear=Block.front;Block.length=0;Block.miss_count=0;}void destroy_block()//销ú毁ù物?理え?块é{while(Block.rear=Block.front){Block.front=Block.front->next;free(Block.rear);}free(page);}void init_page()//初?始?化ˉ页?面?系μ列int i,j;srand(time(NULL));//用?当獭?前°系μ统?时骸?间?来ぁ?初?始?化ˉ随?机ú种?子哩? page=(struct node_page*) malloc(PageCount*sizeof(struct node_page));for(i=0;i<PageCount;i++){page[i].address=rand()%AddrRange;page[i].page_num=page[i].address/PageSize;}for(i=0;i<PageCount;i++){for(j=i+1;j<PageCount;j++){if(page[i].page_num== page[j].page_num){page[i].next_order=j;break;}//if}//forif(j== PageCount)//说μ明÷page[i]以?后ó都?不?会á再ù访?问êpage[i].next_order= PageCount;}//for}void print_page()//打洙?印?页?面?系μ列{int i;printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("页?面?系μ列为a:阰\n");for(i=0;i<PageCount;i++){printf("[%-2d,%-4d]",page[i].page_num,page[i].address%PageSize); if((i+1)%5== 0){printf("\n");}//if}printf("\n");}void FIFO_Replace(int page_index)//FIFO置?换?{BlockNode*node;if(!Block.length){enqueue(page_index);Block.miss_flag=0;return;}node=Block.front;while(node=node->next){if(page[node->page_index].page_num==page[page_index].page_num){destroy_block(); return 0;}截图。

页面置换算法实践报告

页面置换算法实践报告

页面置换算法实践报告页面置换算法(Page Replacement Algorithm)是操作系统中用于管理虚拟内存的重要算法之一。

其目的是在有限的物理内存空间中,将进程所需的页面加载到内存中,并根据一定的策略替换掉不再被使用的页面,以提高内存利用率和系统性能。

在本次实践报告中,我将重点介绍三种常见的页面置换算法:先进先出(FIFO)、最近最久未使用(LRU)和最不经常使用(LFU)。

先进先出(FIFO)算法是最简单的页面置换算法之一。

它根据页面进入内存的先后顺序进行页面置换。

当一个页面需要被替换时,选择最早进入内存的页面进行替换。

虽然FIFO算法的实现简单,但它无法很好地反映页面的使用频率和重要性,容易发生“缺页率抖动”的问题。

缺页率抖动指的是在某些场景下,缺页率会频繁地快速上升,然后又快速下降。

最近最久未使用(LRU)算法是一种基于页面历史访问记录的页面置换算法。

它认为最近被访问过的页面是最有可能在未来被访问的,因此选择最近最久未使用的页面进行替换。

LRU算法可以较为准确地反映页面的使用频率,避免了FIFO算法的缺点。

但由于需要记录页面的访问历史,因此实现相对复杂,需要额外的开销。

最不经常使用(LFU)算法是一种基于页面使用频率的页面置换算法。

它认为使用频率最低的页面是最不重要的,因此选择最不经常使用的页面进行替换。

LFU算法可以较好地反映页面的使用频率,对于一些热点页面和冷门页面的处理较为准确。

但由于需要记录页面的使用次数,因此实现相对复杂,需要额外的开销。

根据实际情况选择合适的页面置换算法对于系统的性能影响非常重要。

一般来说,FIFO算法比较适用于缺页率较低的情况,而LRU算法则适用于需要较高精确度的场景,而LFU算法则适用于需要特别关注页面使用频率的场景。

在实践中,我们可以使用模拟算法来进行页面置换算法的实验。

通过构造不同的页面访问序列,我们可以测试不同算法的效果并进行比较。

在实验过程中,我们可以观察不同算法的缺页率、替换次数、访问延迟等指标,以评估算法的性能。

操作系统—页面置换算法实验报告

操作系统—页面置换算法实验报告

操作系统—页面置换算法实验报告本报告旨在介绍操作系统中的页面置换算法,包括实验的目的和背景以及页面置换算法的概念和作用。

本实验旨在描述实验环境以及所使用的页面置换算法,包括FIFO、LRU、OPT等。

同时,还会详细介绍实验步骤和设置的参数。

实验环境操作系统:Windows 10编程语言:C++开发环境:Visual。

2019页面置换算法FIFO(First-In-First-Out)算法:按照先进先出的原则置换页面,最早进入内存的页面会被置换出去。

LRU(Least Recently Used)算法:根据页面的使用情况,置换最长时间没有被访问过的页面。

OPT(Optimal)算法:理论上最优的页面置换算法,根据未来一段时间内页面的访问情况,选择最少使用的页面进行置换。

实验步骤创建一个模拟操作系统的C++程序。

设定内存大小、页面大小和页面数等参数。

实现FIFO算法,将其应用于模拟操作系统中的页面置换过程。

实现LRU算法,将其应用于页面置换过程。

实现OPT算法,将其应用于页面置换过程。

运行模拟程序,观察不同页面置换算法的效果。

分析比较不同算法的页面置换结果,评估其优缺点。

参数设置内存大小:512MB页面大小:4KB页面数:128以上是本次实验的实验设计,将通过创建模拟操作系统程序,实现FIFO、LRU和OPT等页面置换算法,并对其结果进行比较和评估。

本实验展示了页面置换算法的不同性能,并分析了各种算法的优缺点。

实验结果表明,不同的页面置换算法对系统性能有显著影响。

以下是对各种算法的性能分析:先进先出(FIFO)算法:该算法将最早进入内存的页面置换出去。

优点是简单易实现,缺点是无法适应程序的访问模式变化,容易产生"Belady异常"。

先进先出(FIFO)算法:该算法将最早进入内存的页面置换出去。

优点是简单易实现,缺点是无法适应程序的访问模式变化,容易产生"Belady异常"。

页面置换算法实验总结

页面置换算法实验总结

页面置换算法实验总结
在操作系统中,页面置换算法是为了解决内存不足的问题,当内存中的页面不足时,需要选择一些页面进行置换,将其换出到磁盘上,从而为新的页面腾出空间。

在本次实验中,我实现了三种页面置换算法,分别是FIFO(先进先出)、LRU(最近最少使用)和OPT(最佳置换)。

下面是对这三种算法的总结:
1. FIFO算法:FIFO算法是最简单的页面置换算法,它按照页面进入内存的顺序进行置换。

实验结果显示,FIFO算法在某些情况下可能会导致“抖动”现象,即不断发生页面置换,性能较差。

2. LRU算法:LRU算法是根据页面的使用历史进行置换,将最长时间没有被使用的页面置换出去。

实验结果显示,LRU算法相比于FIFO算法在减少页面抖动方面表现更好,但是实现起来较为复杂,需要维护一个访问历史记录的数据结构。

3. OPT算法:OPT算法是一种理想情况下的页面置换算法,它通过预测未来的页面访问情况来选择最佳的页面进行置换。

实验结果显示,OPT算法在减少页面抖动方面表现最好,但是实现起来较为困难,需要对未来的页面访问情况进行预测。

综上所述,不同的页面置换算法在不同的场景下有着不同的表现。

FIFO算法简单易实现,但性能较差;LRU算法在某些情况下能够较好地减少页面抖动;OPT算法在理论上是最佳的页面置换算法,但实现起来较为困难。

实际中的选择需要根据具体的应用场景
和系统需求来确定。

实验六 页面置换算法实现

实验六 页面置换算法实现

计算机操作系统综合设计实验六实验名称:页面置换算法实现学号:学生姓名:班级:指导教师:实验地点:实验日期:评分:一、实验目的1)理解页面置换相关理论;2)掌握Clock置换算法和改进型Clock置换算法。

二、实验平台windows 10Visual C++ 6.0三、实验步骤1、实验内容1)设计页面置换相关数据结构;2)给一个进程设计多个(≥10)页面;3)设定为每个进程提供的页面数(≤5);4)可动态修改页面信息(包括调用标志和修改标志);5)实现改进型Clock页面置换算法;6)动态给出页面调用序列并进行调度;7)输出置换结果。

2、实验步骤1)输入代码A、打开Visual C++ 6.0;B、新建c++文件,创建basic.h头文件,并且创建clock.cpp;2)进行功能测试并得出正确结果A、编译、运行clock.cpp。

B、输入引用次数,以及页面号。

C、得到页面执行结果,以及缺页率。

3)clock置换函数程序流程图四、实验总结通过这次课程设计,加深了对操作系统的认识,了解了操作系统中各种资源分配算法的实现,特别是对虚拟存储,页面置换有了深入的了解,并能够用高级语言进行模拟演示。

对于clock函数的实现,起初根本不知道怎么下笔,但是认真分析了它的运作机制,就逐步清晰了。

通过浏览、阅读有关的资料,学到了很多东西。

一分耕耘,一分收获,这次的课程设计让我受益匪浅。

虽然自己所做的很少也不够完善,但毕竟也是努力的结果。

另外,使我体会最深的是:任何一门知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能达到功效。

页面置换算法 实验报告

页面置换算法 实验报告
1.页面结构 typedef struct{ int pn, pfn, counter, time; } pl_type ; pl_type pl[total_vp]; 其中pn为页面号(页号),pfn为页帧号(物理块号),counter为
一个周期内访问该页面的次数,time为访问时间;pl[total_vp]为页面 结构数组,由于共有320条指令,每页可装入10条指令,因此虚页长 total_vp的值为32。
可为每个页面设置一个步长变量其初值为一足够大的数对于不在内存的页面将其值重置为零对于位于内存的页面其值重置为当前访问页面与之后首次出现该页面时两者之间的距离因此该值越大表示该页是在最长时间内不再被访问的页面可以选择其作为换出页面
综合性实验报告
专业 年级 课程名称 操作系统 学号姓名 实验地点
班级:
项目名称 页面置换算法
为有效
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 ",1-(float)diseffect/320);
}
void OPT(int total_pf) /* 最佳页面置换算法 */
{
int i,j,max,maxpage,d,dist[total_vp];
initialize(total_pf);
for(i=0;i<total_instruction;i++)

页面置换算法实验报告

页面置换算法实验报告

页面置换算法实验报告一、实验目的:设计和实现最佳置换算法、随机置换算法、先进先出置换算法、最近最久未使用置换算法、简单Clock置换算法及改进型Clock置换算法;通过支持页面访问序列随机发生实现有关算法的测试及性能比较。

二、实验内容:●虚拟内存页面总数为N,页号从0到N-1●物理内存由M个物理块组成●页面访问序列串是一个整数序列,整数的取值范围为0到N - 1。

页面访问序列串中的每个元素p表示对页面p的一次访问●页表用整数数组或结构数组来表示❑符合局部访问特性的随机生成算法1.确定虚拟内存的尺寸N,工作集的起始位置p,工作集中包含的页数e,工作集移动率m(每处理m个页面访问则将起始位置p +1),以及一个范围在0和1之间的值t;2.生成m个取值范围在p和p + e间的随机数,并记录到页面访问序列串中;3.生成一个随机数r,0 ≤r ≤1;4.如果r < t,则为p生成一个新值,否则p = (p + 1) mod N;5.如果想继续加大页面访问序列串的长度,请返回第2步,否则结束。

三、实验环境:操作系统:Windows 7软件:VC++6.0四、实验设计:本实验包含六种算法,基本内容相差不太,在实现方面并没有用统一的数据结构实现,而是根据不同算法的特点用不同的数据结构来实现:1、最佳置换和随机置换所需操作不多,用整数数组模拟内存实现;2、先进先出置换和最近最久未使用置换具有队列的特性,故用队列模拟内存来实现;3、CLOCK置换和改进的CLOCK置换具有循环队列的特性,故用循环队列模拟内存实现;4、所有算法都是采用整数数组来模拟页面访问序列。

五、数据结构设计://页面访问序列数组:int ref[ref_size];//内存数组:int phy[phy_size];//队列数据结构定义:typedef struct QNode //定义队列数据结构{int data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front; //头指针QueuePtr rear; //尾指针}LinkQueue;//定义链表数据结构typedef struct LNode //定义循环链表数据结构{int data;int flag; //访问位int modify; //修改位struct LNode *next;}LNode,*LinkList;六、主要函数说明:1、void set_rand_num() //产生具有局部特性的随机数列;2、int Exchange_LNode(LinkList &L,int e,int i)//将链表L中序号为i的结点替换为内容为e的结点;3、bool Search_LinkList(LinkList &L,int e,int &i)//找到链表L中内容为e的结点,并用i返回其位置,i=1表示第一个非头结点,依次类推;4、void Search_LL_Flag(LinkList &L,int &i)//用i返回第一个flag为0的结点的位置,i=1表示第一个非头结点,以此类推;5、void Set_LL_Flag(LinkList &L,int i) //设置链表L中的序号为i的结点的flag标志为1;6、int Search_LL_ModifyClock(LinkList &L,int &modify_num)//找到改进的CLOCK算法所需要淘汰的页,用modify_num返回其位置;此函数根据书上给的思路,第一遍扫描A=0且M=0的页面予以淘汰,若失败,则进行第二轮扫描A=0且M=1的页面,第二轮扫描时将所有访问过的页面的访问位A置0;若失败则重复上述两部;7、void Set_LL_modify(LinkList &L,int i) //设置链表L中的序号为i的结点的modify标志为1;8、bool SearchQueue(LinkQueue &Q,int e,int &i) //寻找队列Q中结点data域等于e的结点,并用i返回其在Q中的位置;9、int getnum(int a,int b) //用b返回元素a在被引用数列中的下一个位置10、void ORA() //实现最佳置换算法,包括判断页面是否在内存中、页面进内存、输出内存状态等内容;11、void RAND() //随机置换算法12、void FIFO() //先进先出算法13、void LRU() //最近最久未使用算法实现最近最久未使用算法的思想是:判断待进入内存的页面,如果与内存中的第一个页面相同,则将它移到最后一个,即标志为最近使用的页;如果与内存中的第二个页面相同,则将它删除,并在队列尾部添加相同元素,即标志为最近使用的页;14、void CLOCK() //实现CLOCK算法15、void Modified_Clock() //实现改进的CLOCK算法16、int main() //主函数,调用实现各算法的6个主要函数,并输出各算法的缺页率。

实验六 页面置换算法模拟实验

实验六 页面置换算法模拟实验

实验六页面置换算法模拟实验一、实验目的1. 掌握虚拟存储器的实现方法。

2. 掌握各种页面置换算法。

3. 比较各种页面置换算法的优缺点。

二、实验内容模拟实现各种页面置换算法。

具体步骤为:1. 使用产生随机数函数得到一个随机的数列,作为将要载入的页面序列。

2. 可以选择使用先进先出(FIFO)算法、最近最久未使用(LRU)置换算法和最佳(OPT)置换算法,给出所需淘汰的页面号序列。

3. 列出缺页中断次数。

三、实验源程序/* 程序说明:本程序假设内存为程序分配的内存块数为4。

*//* 进入程序后可以根据菜单项进入不同的模块 *//* 1.使用首次适应算法分配空间 *//* 2.最近最久未使用的页面 *//* 3.使用最佳适应算法分配空间 *//* 4.显示有多少个缺页中断 *//* 5.推出系统 */#include<stdio.h>#include<stdlib.h>#include<time.h>#define N 39 /* 随机数序列的长度*/#define B 4 /* 内存的页面数 *//函数名:IsInBuf//功能:返回某个数x有没有在缓冲Buf[]中,若在,返回其位置;若不在,则返回-1/ int IsInBuf(int buf[],int x){ int i,j=-1;for(i=0;i<B;i++){ if(buf[i]==x) {j=i;break;}else if(buf[i]==-1){buf[i]=x;j=i;break;}}return j;}/函数名:oldest()//功能:返回最近最久未使用的页面的位置/int oldest(int f[]){ int i,j=0,max=-1;for(i=0;i<B;i++){ if(f[i]>max) {max=f[i];j=i;}f[i]++;}return j;}/函数名:oldest2()//功能:返回未来最长时间不使用的页面的位置/int oldest2(int list[],int buf[],int f[],int start) { int i,j;for(i=0;i<B;i++){ for(j=start;j<N;j++){ if(buf[i]==list[j]) break;}f[i]=j;}return oldest(f);}/函数名:main()/main(){ int list[N];int buf[B],f[B],i,j,k,max,min;int old=0;int change=0;/生成一系列随机数并初始化环境/srand((int)time(NULL));for(i=0;i<B;i++) buf[i]=f[i]=-1;printf(“\nThe Random List:\n”);for(i=0;i<N;i++){ list[i]=(int) rand()%10;printf(“%2d”,list[i]);}/显示FIFO淘汰页面的序列/printf(“\nFIFO:\n”);change=0;for(i=0;i<N;i++){j=IsInBuf(buf,list[i]);if(j==-1){ printf(“%2d”,buf[old]);buf[old]=list[i];old=(old+1)%(int)B;change++;}elseprintf(“”);}/显示有多少个缺页中断/printf(“\nchanges:%d\n”,change);/显示LRU淘汰页面的序列/printf(“LRU :\n”);change=0;for(i=0;i<B;i++) buf[i]=f[i]=-1;for(i=0;i<N;i++){j=IsInBuf(buf,list[i]);old=oldest(f);if(j==-1){ printf(“%2d”,buf[old]);buf[old]=list[i];f[old]=0;change++;}else{ f[j]=0;printf(“”);}}/显示有多少个缺页中断/printf(“\nchanges:%d\n”,change);/显示OPT淘汰页面的序列/printf(“OPT :\n”);change=0;for(i=0;i<B;i++) buf[i]=f[i]=-1;for(i=0;i<N;i++){j=IsInBuf(buf,list[i]);if(j==-1){ old=oldest2(list,buf,f,i);printf(“%2d”,buf[old]);buf[old]=list[i];f[old]=0;change++;}else{ printf(“”);}}/显示有多少个缺页中断/printf(“\nchanges:%d\n”,change);}说明:多次运行结果并不相同,分析一下原因。

页面置换实习报告

页面置换实习报告

页面置换实习报告在计算机系统中,页面置换是一项至关重要的内存管理技术。

为了更深入地理解和掌握这一技术,我进行了相关的实习。

一、实习目的页面置换的目的在于当内存空间不足时,将一些暂时不使用的页面换出到外存,以腾出空间给当前需要的页面。

通过这次实习,我希望能够:1、深入理解页面置换算法的工作原理和特点。

2、掌握不同算法在实际应用中的性能差异。

3、提高自己的编程能力和问题解决能力。

二、实习环境本次实习使用的编程语言为 Python,开发环境为 PyCharm。

操作系统为 Windows 10。

三、页面置换算法简介1、先进先出(FIFO)算法FIFO 算法是最简单的页面置换算法之一。

它总是淘汰最先进入内存的页面。

这种算法实现简单,但可能会导致一些频繁使用的页面被过早置换出去。

2、最近最久未使用(LRU)算法LRU 算法根据页面最近的使用情况来决定置换。

即淘汰最长时间未被使用的页面。

该算法性能较好,但实现相对复杂,需要记录页面的使用时间。

3、最优置换(OPT)算法OPT 算法是一种理论上的最优算法,它淘汰未来最长时间内不会被使用的页面。

然而,由于在实际中无法准确预测未来的页面使用情况,所以该算法更多地用于理论分析。

四、实习过程1、算法实现首先,我使用 Python 实现了上述三种页面置换算法。

在实现过程中,我使用了数据结构来存储页面的相关信息,并通过模拟页面的调入和调出过程来计算缺页次数。

以 FIFO 算法为例,我使用一个队列来存储页面进入内存的顺序。

当需要置换页面时,将队首的页面淘汰。

2、性能测试为了比较不同算法的性能,我设计了一系列的测试用例。

测试用例包括不同的页面访问序列和不同的内存大小。

通过运行测试用例,我记录了每种算法在不同情况下的缺页次数。

3、结果分析对测试结果进行分析是实习的重要环节。

我发现,在不同的页面访问模式下,不同算法的表现差异较大。

例如,当页面访问序列具有局部性时,LRU 算法的表现通常优于FIFO 算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六页面置换算法模拟
一、实验目的
(1)了解内存分页管理策略
(2)掌握调页策略
(3)掌握一般常用的调度算法
(4)学会各种存储分配算法的实现方法。

(5)了解页面大小和内存实际容量对命中率的影响。

二、实验预备知识
分页存储管理将一个进程的逻辑地址空间分成若干大小相等的片,称为页面或页。

在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。

但应将哪个页面调出,须根据一定的算法来确定。

通常,把选择换出页面的算法称为页面置换算法(Page_Replacement Algorithms)。

一个好的页面置换算法,应具有较低的页面更换频率。

从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。

1、最佳置换算法OPT(Optimal)
它是由Belady于1966年提出的一种理论上的算法。

其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。

采用最佳置换算法,通常可保证获得最低的缺页率。

但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,便可以利用此算法来评价其它算法。

2、先进先出(FIFO)页面置换算法
这是最早出现的置换算法。

该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。

3、最近最久未使用置换算法
1) LRU(Least Recently Used)置换算法的描述
FIFO置换算法性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况。

最近最久未使用(LRU)
置换算法,是根据页面调入内存后的使用情况进行决策的。

由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。

该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。

2) LRU置换算法的硬件支持
LRU置换算法虽然是一种比较好的算法,但要求系统有较多的支持硬件。

为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,须有以下两类硬件之一的支持:
①寄存器
为了记录某个进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为
R=R
n-1R
n-2
R
n-3
……R
2
R
1
R
当进程访问某物理块时,要将相应寄存器的Rn-1位置
成1。

此时,定时信号将每隔一定时间(例如100ms)将寄存器右移一位。

如果我们把n位寄存器的数看作是一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。

如图1示出了某进程在内存中具有8个页面,为每个内存页面配置一个8位寄存器时的LRU访问情况。

这里,把8个内存页面的序号分别定为1˜˜8。

由图可以看出,第7个内存页面的R值最小,当发生缺页时首先将它置换出去。

②栈
可利用一个特殊的栈来保存当前使用的各个页面的页面号。

每当进程访问某页面时,便将页面的页面号从栈中移出,将它压入栈顶。

因此,栈顶始终是最新被访问页面的编号民,而栈底则是最近最久未使用的页面的页面号。

三、实验内容
编写程序模拟实现LRU 算法(Least Recently) 和FIFO 算法(First IN First Out)。

先参照LRU算法实现的示例程序,写出实现FIFO算法模拟程序。

参考实验步骤如下:
(1)现定义数据结构和全局变量。

#include<stdio.h>
#include<conio.h>
#define M 4
#define N 17
#define Myprintf
printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") /*表格控制*/
typedef struct page
{ int num; /*记录页面号*/
int time; /*记录调入内存时间*/
}Page; /* 页面逻辑结构,结构为方便算法实现设计*/
Page b[M]; /*内存单元数*/
int c[M][N]; /*暂保存内存当前的状态:缓冲区*/
int queue[100]; /*记录调入队列*/
int K; /*调入队列计数变量*/
(2)初始化内存单元、缓冲区
void Init(Page *b,int c[M][N])
{ int i,j;
for(i=0;i<N;i++)
{ b[i].num=-1;
b[i].time=N-i-1; }
for(i=0;i<M;i++)
for(j=0;j<N;j++)
c[i][j]=-1;
}
(3)取得在内存中停留最久的页面,默认状态下为最早调入的页面*/
int GetMax(Page *b)
{ int i;
int max=-1;
int tag=0;
for(i=0;i<M;i++)
{ if(b[i].time>max)
{ max=b[i].time;
tag=i; } }
return tag;
}
(4)判断页面是否已在内存中*/
int Equation(int fold,Page *b)
{ int i;
for(i=0;i<M;i++)
if (fold= =b[i].num) return i;
return -1;
}
(5)LRU算法
void Lru(int fold,Page *b)
{ int i;
int val;
val=Equation(fold,b);
if (val>=0)
{ b[val].time=0;
for(i=0;i<M;i++)
if (i!=val) b[i].time++;
}
else
{ queue[++K]=fold;/*记录调入页面*/ val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<M;i++)
if (i!=val) b[i].time++;
} }
(6)主程序
void main()
{ int a[N]={1,0,1,0,2,4,1,0,0,8,7,5,4,3,2,3,4};
int i,j;
start:
K=-1;
Init(b, c);
for(i=0;i<N;i++)
{ Lru(a[i],b);
c[0][i]=a[i];
/*记录当前的内存单元中的页面*/
for(j=0;j<M;j++)
c[j][i]=b[j].num;
}
/*结果输出*/
printf("内存状态为:\n");
Myprintf;
for(j=0;j<N;j++)
printf("|%2d ",a[j]);
printf("|\n");
Myprintf;
for(i=0;i<M;i++)
{ for(j=0;j<N;j++)
if(c[i][j]==-1) printf("|%2c ",32);
else
printf("|%2d ",c[i][j]);
printf("|\n");
}
Myprintf;
printf("\n调入队列为:");
for(i=0;i<K+1;i++)
printf("%3d",queue[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f",K+1,(float)(K+1)/N);
printf("\nAre you continuing!\ty?");
if(getche()=='y') goto start;
}
【思考题】
(1)为什么在实际的系统中不用LRU置换算法,而用它的近似算法?(2)OPT算法为什么难以实现?。

相关文档
最新文档