页面置换算法(C语言)
页面置换常用的算法总结

页⾯置换常⽤的算法总结本⽂转载⾃:进程运⾏时,若其访问的页⾯不在内存⽽需将其调⼊,但内存已⽆空闲空间时,就需要从内存中调出⼀页程序或数据,送⼊磁盘的对换区。
选择调出页⾯的算法就称为页⾯置换算法。
好的页⾯置换算法应有较低的页⾯更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页⾯先调出。
常见的置换算法有以下四种。
1. 最佳置换算法(OPT)最佳(Optimal, OPT)置换算法所选择的被淘汰页⾯将是以后永不使⽤的,或者是在最长时间内不再被访问的页⾯,这样可以保证获得最低的缺页率。
但由于⼈们⽬前⽆法预知进程在内存下的若千页⾯中哪个是未来最长时间内不再被访问的,因⽽该算法⽆法实现。
最佳置换算法可以⽤来评价其他算法。
假定系统为某进程分配了三个物理块,并考虑有以下页⾯号引⽤串:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1进程运⾏时,先将7, 0, 1三个页⾯依次装⼊内存。
进程要访问页⾯2时,产⽣缺页中断,根据最佳置换算法,选择第18次访问才需调⼊的页⾯7予以淘汰。
然后,访问页⾯0时,因为已在内存中所以不必产⽣缺页中断。
访问页⾯3时⼜会根据最佳置换算法将页⾯1淘汰……依此类推,如图3-26所⽰。
从图中可以看出⾤⽤最佳置换算法时的情况。
可以看到,发⽣缺页中断的次数为9,页⾯置换的次数为6。
访问页⾯70120304230321201701物理块1777222227物理块200004000物理块31133311缺页否√√ √√√√√√√图3-26 利⽤最佳置换算法时的置换图2. 先进先出(FIFO)页⾯置换算法优先淘汰最早进⼊内存的页⾯,亦即在内存中驻留时间最久的页⾯。
该算法实现简单,只需把调⼊内存的页⾯根据先后次序链接成队列,设置⼀个指针总指向最早的页⾯。
但该算法与进程实际运⾏时的规律不适应,因为在进程中,有的页⾯经常被访问。
页面替换算法

页面替换算法一、实验目的1,通过模拟实现几种基本页面置换的算法,了解虚拟存储技术的特点。
2,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想,用三种算法来模拟实现。
3,通过对几种置换算法页面来比较他们的优缺点。
二,实验内容:设计一个虚拟工作区和内存工作区,并使用下列算法来模拟实现页面的置换:1,先进先出算法2,最近最少使用算法3,最佳置换算法三,源程序#include<iostream>#include<stdlib.h>using namespace std;int const InsideCount = 3;//内存中存放的页面数int count = 0;int Inside[InsideCount];int const PageCount =10;//总的页面数int Page[PageCount];int insert = 0;//先到先出置换算法fcfo中表示当内存满的时候,新进入的页号放的位置int suiji = 0; //随机置换算法randchange 当内存满的时候,新进入的页号放的位置int state[InsideCount];//clock置换算法中,内存中的每个页面号对应的状态int state2[InsideCount][2];// 二维数组,第一行第一列为访问位,第一行的第二列为修改位double lost = 0.0;bool isInside(int num)//检测页号是否在内存中{for(int i = 0; i < InsideCount; i++){if(Inside[i] == Page[num]){state[i] = 1;return true;}}return false;}bool change() //判断页面是否已经被修改{if((rand()%2+1) == 1 ){cout<<"该页面被修改"<<endl;return true;}elsereturn false;}void LRU(int num)//最近最久未使用置换算法LRU{int max = 0; // 表示内存中的页号,下一次出现的距离int maxchange; //表示内存中下次出现距离最大的页号在内存中的位置int k;if(isInside(num)){cout<<"命中"<<endl;for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}elseif(count == InsideCount){lost++;for(int j=0; j < InsideCount; j++){for( k = num; k >0;k--) //从当前的页号向前看,发现页号与内存中的页号相同,break ;比较内存中三个页号,看哪一个走的远,用max记录{if(Inside[j] == Page[k])break;}if( num - k > max){max = num - k;maxchange =j;//j 表示把内存中第j个Inside中的页面从内存拿出,把新的页面放入}}Inside[maxchange] = Page[num];for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}else{Inside[count] = Page[num];count++;for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}}void FIFO(int num)//先进现出置换算法(FIFO):{if(isInside(num)){cout<<"命中"<<endl;for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}elseif(count == InsideCount){lost++;Inside[insert] = Page[num];insert++;insert = insert % 3;for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}else{Inside[count] = Page[num];count++;for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}}void OPT(int num)//最佳置换算法(OPT){int max = 0; // 表示内存中的页号,下一次出现的距离int maxchange; //表示内存中下次出现距离最大的页号在内存中的位置int k;if(isInside(num)){cout<<"命中"<<endl;for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}elseif(count == InsideCount){lost++;for(int j=0; j < InsideCount; j++){for( k = num; k < PageCount;k++){if(Inside[j] == Page[k])break;}if( k > max){max = k; //k表示在这个地方会再次出现给定页面maxchange =j;//j 表示把内存中第j个Inside中的页面从内存拿出,把新的页面放入}}Inside[maxchange] = Page[num];for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}else{Inside[count] = Page[num];count++;for(int i=0 ; i <InsideCount; i++)cout<<"内存Inside["<<i<<"]中内容为:"<<Inside [i]<<endl;}}int main(){char ch ;//选择使用哪种算法while(1){for(int i = 0; i < PageCount; i++){Page[i] =rand()%9 + 1;}cout<<"O 最佳置换算法(OPT)(理想置换算法)"<<"\n"<<endl;cout<<"F 先进现出置换算法(FIFO)"<<"\n"<<endl;cout<<"U 最近最少使用(LRU)算法"<<"\n"<<endl;cin>>ch;switch(ch){case 'O':{lost = 0;count = 0;for(int j = 0; j < InsideCount; j++){Inside[j] = 0;}for(int i = 0; i < PageCount; i++){cout<<"读入Page["<<i<<"]="<<Page[i]<<endl;OPT(i);}cout<<"共" <<PageCount<<"次,"<<"缺失"<<lost<<" 次,缺失率为"<<lost/(PageCount)<<"\n\n"<<endl;}break;case 'F':{lost = 0;count = 0;for(int j = 0; j < InsideCount; j++){Inside[j] = 0;}for(int i = 0; i < PageCount; i++){cout<<"读入Page["<<i<<"]="<<Page[i]<<endl;FIFO(i);}cout<<"共" <<PageCount<<"次,"<<"缺失"<<lost<<" 次,缺失率为"<<lost/(PageCount)<<"\n\n"<<endl;}break;case 'U':{lost = 0;count = 0;for(int j = 0; j < InsideCount; j++){Inside[j] = 0;}for(int i = 0; i < PageCount; i++){cout<<"读入Page["<<i<<"]="<<Page[i]<<endl;LRU(i);}cout<<"共" <<PageCount<<"次,"<<"缺失"<<lost<<" 次,缺失率为"<<lost/(PageCount)<<"\n\n"<<endl;}break;}}return 0;}四、调试结果。
【精品】页面置换算法实验报告

【精品】页面置换算法实验报告一、实验目的了解操作系统中的页面置换算法,并实现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算法的实现需要维护一个记录页面使用时间的链表或队列。
页面置换算法

页面置换算法2008-03-01 22:30评价一个算法的优劣,可通过在一个特定的存储访问序列(页面走向)上运行它,并计算缺页数量来实现。
1 先入先出法(FIFO)最简单的页面置换算法是先入先出(FIFO)法。
这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。
理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。
建立一个FIFO队列,收容所有在内存中的页。
被置换页面总是在队列头上进行。
当一个页面被放入内存时,就把它插在队尾上。
这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。
因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。
FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。
当然,导致这种异常现象的页面走向实际上是很少见的。
2 最优置换算法(OPT)最优置换(Optimal Replacement)是在理论上提出的一种算法。
其实质是:当调入新的一页而必须预先置换某个老页时,所选择的老页应是将来不再被使用,或者是在最远的将来才被访问。
采用这种页面置换算法,保证有最少的缺页率。
但是最优页面置换算法的实现是困难的,因为它需要人们预先就知道一个进程整个运行过程中页面走向的全部情况。
不过,这个算法可用来衡量(如通过模拟实验分析或理论分析)其他算法的优劣。
3 最久未使用算法(LRU)FIFO算法和OPT算法之间的主要差别是,FIFO算法利用页面进入内存后的时间长短作为置换依据,而OPT算法的依据是将来使用页面的时间。
如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。
它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以置换。
这种算法就称为最久未使用算法(Least Recently Used,LRU)。
常见的页面置换算法

常见的页面置换算法1.概述页面置换算法是操作系统中用于管理内存的一种算法,其目的是确保可用内存的最大化并实现对内存的高效使用。
在操作系统中,当进程所需的内存空间超出了可用的物理内存空间时,操作系统就需要从主存中选择一些页面腾出空间来装载进程所需的页面。
这就需要使用页面置换算法。
2.常见的页面置换算法2.1最优页面置换算法(OPT)最优页面置换算法是一种理论上的置换算法。
它的核心思想是通过计算进程未来访问各个页面的时间和距离,来推断出离当前时间最久的页面。
这种算法的优点是能够保证页面置换的最优性,但是它需要预先知道进程未来所有的页面调度情况,这在实际应用中是不可行的。
2.2先进先出(FIFO)置换算法先进先出置换算法是一种很简单的置换算法,它选取主存中驻留时间最长的页面作为替换目标。
优点是实现简单,但是缺点是可能会引发置换震荡问题。
2.3最近最久未使用算法(LRU)最近最久未使用算法是一种比较常用的页面置换算法,其核心思想是将驻留时间久且最近一次使用时间早的页面视为需要置换的页面。
相对于FIFO算法,LRU算法能够保证更高的页面命中率和更小的置换次数。
2.4时钟置换算法(Clock)时钟置换算法是一种改进型的FIFO算法。
该算法使用一个环形队列来存储主存中的页面位置信息。
当需要置换页面时,指针先指向队列首位置,遍历队列并且在第一遍扫描时,将页框的访问位ACC设置为0。
第一遍扫描结束后,如果有页面的ACC位为0,就将其替换出去。
如果找不到未访问页面,指针再回到队列首位置,以此类推,直到找到为止。
3.总结以上所述的几种页面置换算法是操作系统中常见的算法。
它们各有优点和缺点,在实际应用中,需要根据实际情况进行选择。
在选择算法后,还需要对其进行适当的调整,以满足实际需求。
页面置换算法模拟实验 操作系统大作业(含源文件)

“计算机操作系统”课程设计大作业页面置换算法模拟实验(含完整资料,可直接提交)一、题目: 页面置换算法模拟实验二、目的分别采用最佳(Optimal)置换算法、先进先出(FIFO)页面置换算法和最近最少使用(LRU)置换算法对用户输入的页面号请求序列进行淘汰和置换,从而加深对页面置换算法的理解。
三、内容和要求请用C/C++语言编一个页面置换算法模拟程序。
用户通过键盘输入分配的物理内存总块数,再输入用户逻辑页面号请求序列,然后分别采用最佳(Optimal)置换算法、先进先出(FIFO)页面置换算法和最近最少使用(LRU)置换算法三种算法对页面请求序列进行转换,最后按照课本P150页图4-26的置换图格式输出每次页面请求后各物理块内存放的虚页号,并算出总的缺页率(缺页次数/总的请求次数)。
最后三种页面置换算法的优缺点。
三种页面置换算法的思想可参考教材P149-P152页。
假设页面号请求序列为4、3、2、1、4、3、5、4、3、2、1、5,当分配给某进程的物理块数分别为3块和4块时,试用自己编写的模拟程序进行页面转换并输出置换图和缺页次数、缺页率。
四、提交内容本大作业每个人必须单独完成。
最后需提交的内容包括:源程序(关键代码需要注释说明)、可运行程序、运行结果、算法思路及流程图、心得体会。
大作业严禁抄袭。
发现抄袭一律以不及格论。
请大家严格按照大作业题目来编写程序,不要上交以前布置的大作业。
如果提交的大作业题目与本文档要求不符,成绩一律为及格。
目录摘要 (2)正文 (2)1、设计思路 (3)2、各模块的伪码算法 (6)3、函数的调用关系图 (8)4、测试 (13)设计总结 (15)参考文献 (16)致谢 (17)附录:部分源程序代码 (18)摘要UNIX中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。
页面置换的名词解释

页面置换的名词解释页面置换指的是操作系统中一种内存管理技术,其主要目的是根据内存中的页面使用情况,动态地将内存中的某些页面替换出去,以便腾出空闲的内存空间给其他需要的页面使用。
页面指的是被划分为固定大小的块的内存空间,通常为4KB或者8KB。
在计算机系统中,程序在执行的过程中,会将需要的数据或指令加载到内存中进行处理。
然而,由于内存容量有限,无法一次性将所有程序所需的页面全部加载到内存中。
当程序需要页面而内存空间不足时,操作系统就会采用页面置换的技术,将原本在内存中的某些页面替换出去,给需要的页面腾出空间。
页面置换的目标是使得内存中的页面尽量是那些将来要使用到的页面,以提高程序的运行效率。
常见的页面置换算法有FIFO(先进先出)、最不常用(Least Frequently Used)、最近最少使用(Least Recently Used)等。
FIFO算法是最简单的置换算法,根据页面进入内存的先后顺序来进行替换。
当内存空间不足时,将最早进入内存的页面替换出去。
最不常用算法则是根据页面在一段时间内被访问的频率进行替换。
具体来说,每次页面被访问时,都会将该页面的访问频率加一,当内存空间不足时,选择访问频率最低的页面进行替换。
最近最少使用算法是根据页面最近一次被访问的时间来进行替换。
系统会为每个页面维护一个计时器,记录上次访问的时间。
当需要替换页面时,选择一个最久未被访问的页面进行替换。
这些页面置换算法都有各自的特点和适用场景。
FIFO算法简单且容易实现,但容易产生“抢占”现象;最不常用算法采用了频率统计的方式,可以较好地预测页面的使用情况;最近最少使用算法则更注重于页面的时间局部性。
然而,这些页面置换算法都存在着一定的问题。
例如,FIFO算法没有考虑页面的使用频率;最不常用算法也可能在短时间内无法完全准确地确定页面的使用频率;最近最少使用算法则需要维护精确的访问时间戳,带来了额外的开销。
为了解决这些问题,研究者们还提出了更加复杂的页面置换算法,如二次机会算法、clock算法、工作集算法等。
操作系统页面置换算法实验报告

学生实验报告姓名:年级专业班级学号成绩【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见1.程序的执行结果如下:(1)先进先出页面置换算法(2)最佳页面置换法(3)最近最久未使用置换算法2.以上三个程序通过数组和排序语句实现页面的三种基本调度算法。
(1)先进先出算法事先设定标志k=3,页面每发生一次置换k值增加1。
通过取k对3的余数来确定被置换的内存中的页面,当被访问页面存在于内存时,不置换,而直接输出原内存中的3个页面。
(2)最佳置换算法通过设定c1,c2,c3来记录当前内存中的页面被下一次访问的位置(时间),通过对c1,c2,c3的大小比较确定内存中需要被置换的页面。
三者中值最大的对应的内存页面选择被置换。
即实现了未来最长时间未访问的机制,即最佳置换算法。
(3)最近最久未使用置换算法的原理跟最佳置换算法类似。
初始设定变量c1,c2,c3记录当前内存中的以前的最近一次未被访问的位置(时间),比较三者的大小来确定需要被置换的页面。
三者中至最小的对应的内存页面选择被置换。
即实现了最近最久未使用的机制,即最近最久未使用置换算法。
3.上述三个程序分别能较好的模拟页面的基本调度算法,实现页面的置换,保证进程的正常执行。
但也分别存在一些不足。
(1)当内存中三个页面有部分相同时,程序不能很好的实现调度。
即c1,c2,c3中有部分变量值相等,源程序可能不能准确的找到调度顺序,如图所示。
(LRU算法)改进的方法为在c1,c2,c3间的大小比较判断语句中增加关系语句的默认处理办法,当三者间有部分相同时,默认选择按从前到后的顺序执行。
比如当c2=c3的时候选择页面a[2]进行置换。
当c1=c2=c3时则选择页面a[0]进行置换。
也就相当于无法运用LRU算法调用的时候折衷采取先进先出置换算法,以实现页面的合理调度,提高页面的利用效率。
指导教师签名:20 年月日【备注】。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return -1; }
int Max(Pro *page1)//寻找最近最长未使用的页面
{
Pro *page=new Pro[M];
page=page1;
int e=page[0].time,i=0;
while(i<M) 面
//找出离现在时间最长的页
{
if(e<page[i].time) e=page[i].time;
2.最近最久未使用算法:LRU 算法的提出,是基于这样一个事实: 在前面几条指令中使用频繁的页面很可能在后面的几条指令中 频繁使用。反过来说,已经很久没有使用的页面很可能在未来较 长的一段时间内不会被用到。这个,就是著名的局部性原理—— 比内存速度还要快的 cache,也是基于同样的原理运行的。因此, 我们只需要在每次调换时,找到最少使用的那个页面调出内存。 这就是 LRU 算法的全部内容。
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
//如果不在内存块中《操作源自统》实验报告题目:页面置换算法 班级:网络工程 姓名:朱锦涛 学号:E31314037
一、实验目的
用代码实现页面置换算法,通过代码的具体实现,加深对两 个页面置换算法:先进先出页面置换算法和最近最久未使用算法 的核心的理解。
二、实验原理
1.先进先出页面置换算法:地址映射过程中,若在页面中发现所 要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时 操作系统必须在内存选择一个页面将其移出内存,以便为即将调 入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换 算法。最简单的页面置换算法是先入先出(FIFO)法。
{
n++;
//缺页次数加 1
赋值给 t
t=Max(page);
//返回最近最久未使用的块号
page[t].num=p[i].num;
//进行替换
置为 0
page[t].time=0;
//替换后时间
cout<<p[i].num<<" ";
print(page);
for(a=0;a<M;a++)
if(a!=t)
间加 1
page[a].time++;
//其它的时
}
i++;
}
cout<<"缺页次数:"<<n<<" "<<n/20<<endl;
缺页率:
}
}while(c==1||c==2);
return 0; } 实验结果: FIFO 置换算法:
LRU 置换算法:
四.实验小结
本次试验,使用顺序表来存储包括内存页面和页面号引用串, struct Pro{int num,time;};其中 num 表示页面号,页面号引用 串用随机数循环 20 次来初始化 20 个页面号,同时物理块号可由 用户自己在 3~5 之间选择,初始化页面号全为 0。Time 为该页面 在内存的时间,这只在 LRU 算法有使用到。第一个页面进入物理 块时初始化为 0,以后每有新页面过来询问时,不管有没有替换 内存中的页面,都将其值加一。 当新页面进来时,若内存中有 该页面号,则将该块号重新置为 0,内存中其他页面的时间+1, 若没有该页面号,则替换内存中页面时间最长的。
cout<<" "<<endl;
FIFO 算法页面置换情况
cout<<endl;
cout<<" ****************************************** "<<endl;
while(i<20)
{
if(Search(p[i].num,page)>=0) //当前页面在内存中
Pro *page=new Pro[M];//动态结构体数组 do{
for(int i=0;i<M;i++)//初试化页面基本情况 {
page[i].num=0; page[i].time=20-1-i; }
cout<<"1:FIFO 页面置换"<<endl; cout<<"2:LRU 页面置换"<<endl;
cout<<endl;
cout<<" "<<endl;
LRU 算法页面置换情况如下:
cout<<endl;
cout<<" ****************************************** "<<endl;
while(i < 20) {
int a;
t=Search(p[i].num,page);
void print(Pro *page1)//打印当前的页面 {
Pro *page=new Pro[M]; page=page1; for(int i=0;i<M;i++) cout<<page[i].num<<" "; cout<<endl; } int Search(int e,Pro *page1 )//寻找内存块中与 e 相同的 块号 { Pro *page=new Pro[M]; page=page1; for(int i=0;i<M;i++) //遍历内存 if(e==page[i].num)
i++;
}
for( i=0;i<M;i++)if(e==page[i].time)return i;//找到 离现在时间最长的页面返回其块号
return -1; }
int Count(Pro *page1,int i,int t,Pro p[L])//记录当前内存 块中页面离下次使用间隔长度 {
Pro *page=new Pro[M]; page=page1;
//打印当前页面
print(page);
//下一个内存块
t++;
个页面
i++;
//指向下一
}
}
}
cout<<"缺页次数:"<<n<<" "<<n/20<<endl;
缺页率:
}
if(c==2)//LRU 页面置换
{
n=0;
cout<<" ****************************************** "<<endl;
int count=0; for(int j=i;j<L;j++) {
if(page[t].num==p[j].num )break;//当前页面再次 被访问时循环结束
else count++;//否则 count+1 } return count;//返回 count 的值
}
int main() {
p[i].time=0;
cout<<p[i].num<<" "; } cout<<endl;
cout<<"请输入可用内存页面数 m(3~5): "; do { cin>>M; if(M>5||M<3) cout<<"内存块 m 须在 3~5 之间,请重新输入 m: ";
else break; }while(1);
cout<<"按其它键结束程序;"<<endl; cin>>c; system("cls"); //清屏 if(c==1)//FIFO 页面置换 {
n=0;
cout<<" ****************************************** "<<endl;
cout<<endl;
如下:
int c,i; int t=0; float n=0; Pro p[L]; //20 个结构体
srand(time(NULL));//随机数发生器 cout<<"输出随机数: "; for(i=0;i<20;i++) //20 个随机数
{ p[i].num=rand( )%10+1;//产生 1 到 10 之间的随即数放到数 组p中
通过本次试验,我加深了对两个页面置换算法:先进先出页面 置换算法和最近最久未使用算法的核心的理解。
三、实验内容 源程序: #include<iostream.h> #include <stdlib.h> #include <time.h> #include <stdio.h>
#define L 20//页面走向长度最大为 20