当前位置: 首页 > 科技观察

插图:页面置换算法

时间:2023-03-18 17:05:40 科技观察

本文转载自微信公众号《靖宇》,作者靖宇。转载本文请联系静语公众号。页面替换算法功能:当发生页面错误需要转移新的页面且内存已满时,选择内存中的哪个物理页面被替换。目标:最小化页面换入和换出的数量(即页面错误的数量)。具体而言,换出将来不再使用或短期内使用较少的页面,通常只能在局部原则的指导下,根据过去的统计数据进行预测。最优页面替换算法的基本思想:发生页面错误时,对于内存中存储的每个逻辑页面,计算下一次访问之前需要等待多长时间,选择等待时间最长的那个用作替换页面。这只是一种理想情况,在实践中是无法实现的,因为操作系统无法知道每个页面在被再次访问之前要等待多长时间。可以作为其他算法性能评估的依据(在模拟器上运行某个程序,记录每次页面访问情况,二次运行时可以使用最优算法)。简单来说,最优的页面替换算法就是替换未来最长时间不需要的页面。假设PageFrames的大小为4,请求的页面顺序为:7,0,1,2,0,3,0,4,2,3,0,3,2,使用最优页面置换算法是什么PageFaults的数量?最初,页槽都是空的,所以请求的页7012被分配到空页槽,导致4个页错误。接下来,当请求第0页时,发现它已经存在于页框中,出现0页错误异常;当请求page3时,page7因为以后最长的时间不需要访问,所以被page7替换为3,出现1pagefault异常。页面0点击,0页面异常;请求页4不存在页框,替换页1,1页错误异常;对于后续的请求页面序列2、3、0、3、2,全部命中,没有出现pagefault异常。所以一共发生了6次pagefault异常,也就是图中的Miss状态,这里Hit表示命中,没有发生pagefault异常。模拟一个最优的页面置换算法:输入:页框号fn=3pagepg[]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};输出:hitshits=11pagefaultmiss=9输入:pageframenumberfn=4pagepg[]={7,0,1,2,0,3,0,4,2,3,0,3,2};输出:命中数hits=7pagefaultexceptionmiss=6我们使用页框号4,请求序列{7,0,1,2,0,3,0,4,2,3,0,3,2}举个例子。首先我们创建一个空数组fr来模拟页框:请求第7页,发现不在数组fr中且数组大小fr.size()usingnamespacestd;//用于检查页面框架中是否有要访问的页面keyboolsearch(intkey,vector&fr){for(inti=0;i&fr,intpn,intindex){//存储在future使用的页面索引intres=-1,farthest=index;for(inti=0;ifarthest){farthest=j;res=i;}break;}}//如果一个页面以后没有被引用过,则返回它。if(j==pn)returni;}//如果fr中的页面以后都没有出现过,返回其中任意一个,我们返回0。否则返回res。return(res==-1)?0:res;}/***pg[]请求页序*pn请求页码*fn页框号*/.voidoptimalPage(intpg[],intpn,intfn){//为给定的帧数创建一个数组并将其初始化为空。向量fr;//遍历页面引用数组并检查未命中和命中。inthit=0;for(inti=0;i