页面置换算法
页面置换算法大题

页面置换算法大题
摘要:
一、页面置换算法概述
二、页面置换算法的分类
三、页面置换算法的优缺点分析
四、常见的页面置换算法及其应用
五、总结
正文:
一、页面置换算法概述
页面置换算法,是计算机操作系统中的一种内存管理技术。
它的主要作用是在内存有限的情况下,对内存中的页面进行有效管理,以便在需要时,能够迅速地调用所需的页面,提高系统的运行效率。
二、页面置换算法的分类
根据页面置换的原则,可以将页面置换算法分为以下几类:
1.最佳置换算法(OPT):总是选择在将来最远的时间内不会被访问的页面进行置换。
2.最近最少使用(LRU)算法:选择距离现在最长时间内没有被访问过的页面进行置换。
3.时钟(Clock)算法:根据页面的访问频率,将其分为多个类别,选择访问次数最少的页面进行置换。
4.最不经常使用(LFU)算法:根据页面的访问次数,选择访问次数最少的页面进行置换。
三、页面置换算法的优缺点分析
各种页面置换算法都有其优点和缺点。
比如,最佳置换算法虽然理论上最优,但实际操作中难以实现,且可能导致内存碎片化。
最近最少使用算法虽然简单易行,但在应对突发访问需求时,可能会出现效率低下的问题。
四、常见的页面置换算法及其应用
在实际应用中,根据不同的系统需求和场景,可以选择不同的页面置换算法。
例如,对于需要频繁进行数据访问的系统,可以选择时钟算法或最近最少使用算法;对于需要保证页面顺序的系统,可以选择最佳置换算法或最不经常使用算法。
五、总结
页面置换算法是操作系统中重要的内存管理技术,其选择和应用直接影响到系统的运行效率和稳定性。
fifo算法c语言

fifo算法c语言FIFO算法C语言实现FIFO(First In First Out)算法是一种简单的页面置换算法,也称为先进先出算法。
该算法的核心思想是将最先进入内存的页面最先淘汰,即将页表中最早调入内存的页面移出内存。
本文将介绍如何使用C语言实现FIFO算法。
一、FIFO算法原理1.1 页面置换在操作系统中,为了提高程序运行效率,会将程序需要用到的数据和指令从硬盘上加载到内存中。
但是内存有限,无法容纳所有程序需要用到的数据和指令。
当内存不足时,就需要进行页面置换。
页面置换就是将当前正在使用但又不常用的页面从内存中移出,并将新的页面调入内存。
在进行页面置换时,需要选择一个合适的页面置换算法。
1.2 FIFO算法FIFO算法是一种简单而常用的页面置换算法。
它以队列为基础,将最早进入队列的页面作为被淘汰的对象。
具体来说,在FIFO算法中,操作系统会维护一个队列来记录当前正在使用的所有页面。
当需要进行页面置换时,操作系统会选择队头元素对应的页面进行淘汰,并将新调入内存中的页面插入队尾。
二、FIFO算法C语言实现2.1 算法流程FIFO算法的实现流程如下:1. 初始化页面队列,将所有页面按照调入内存的时间顺序依次插入队列;2. 当需要进行页面置换时,将队头元素对应的页面移出内存,并将新调入内存中的页面插入队尾;3. 重复执行步骤2。
2.2 代码实现下面是使用C语言实现FIFO算法的示例代码:```c#include <stdio.h>#include <stdlib.h>#define MAX_PAGE_NUM 100 // 最大页面数#define MAX_MEM_SIZE 10 // 最大内存容量int page_queue[MAX_PAGE_NUM]; // 页面队列int mem[MAX_MEM_SIZE]; // 内存int queue_head = 0; // 队头指针int queue_tail = -1; // 队尾指针// 初始化页面队列void init_page_queue(int page_num) {for (int i = 0; i < page_num; i++) {page_queue[i] = i % MAX_MEM_SIZE;}}// 页面置换函数void page_replace(int new_page) {int old_page = page_queue[queue_head]; // 获取被淘汰的页面mem[old_page] = new_page; // 将新页面调入内存中queue_tail = (queue_tail + 1) % MAX_PAGE_NUM; // 更新队尾指针queue_head = (queue_head + 1) % MAX_PAGE_NUM; // 更新队头指针}int main() {int page_num = 20; // 页面数int miss_count = 0; // 缺页次数init_page_queue(page_num);for (int i = 0; i < page_num; i++) {int page = page_queue[i];if (mem[page] == 0) { // 页面不在内存中miss_count++;page_replace(page);}}printf("缺页次数:%d\n", miss_count);return 0;}```2.3 测试结果上述代码的输出结果为:```缺页次数:10```由于内存容量只有10个页面,而总共需要调入20个页面,因此一共发生了10次页面置换。
最佳页面置换算法

最佳页面置换算法(Optimal)(非常专业)评价一个算法的优劣,可通过在一个特定的存储访问序列(页面走向)上运行它,并计算缺页数量来实现。
1 先入先出法(FIFO)最简单的页面置换算法是先入先出(FIFO)法。
这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。
理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。
建立一个FIFO队列,收容所有在内存中的页。
被置换页面总是在队列头上进行。
当一个页面被放入内存时,就把它插在队尾上。
这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。
因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。
FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。
当然,导致这种异常现象的页面走向实际上是很少见的。
现在来看下4块的情况:0 1 2 3 2 1 3 2 5 2 3 6 2 1 4 2【解答】刚开始内存并没有这个作业,所以发生缺页中断一次。
作业的0号页进入内存。
(1次缺页中断)而页1又不在内存,又发生缺页中断一次。
作业页1进入内存。
(2次缺页中断) 页2不在内存,发生缺页中断。
页2进入内存。
(3次缺页中断)页3不在内存,发生缺页中断。
页3进入内存。
(4次缺页中断)接下来调入页2,页1,页3,页2。
由于都在内存中,并不发生缺页中断。
页5不在内存,发生缺页中断。
页5进入内存,页5置换页0。
(5次缺页中断) 接下来调入页2,页3。
由于都在内存中,并不发生缺页中断。
页6不在内存,发生缺页中断。
页6进入内存。
页6置换页1。
(6次缺页中断) 页2在内存,不发生缺页中断。
页1不在内存(在发生第6次缺页中断时被置换了),发生缺页中断。
页1进入内存,页2被置换。
(7次缺页中断)页4置换页3,页4进入内存。
(8次缺页中断)现在调入页2,但页2在发生第7次缺页中断时被置换掉了。
常见页面置换算法图解

常见页⾯置换算法图解前⾔缓存⽂件置换的原因是电脑存储器空间固定,不可能将服务器上所有数据都加载在存储空间中,当需要调⽤不⽤的数据时,那么势必需要将需要的数据进来存储空间替换原有数据常见的缓存⽂件置换⽅法有:先进先出算法(FIFO):最先进⼊的内容作为替换对象最久未使⽤算法(LRU):最久没有访问的内容作为替换对象最近最少使⽤算法(LFU):最近最少使⽤的内容作为替换对象⾮最近使⽤算法(NMRU):在最近没有使⽤的内容中随机选择⼀个作为替换对象内存的平均引⽤时间为:其中T= 内存平均引⽤时间m= 未命中率 = 1 - (命中率)Tm= 未命中时访问主内存需要的时间 (或者在多层缓存中对下级缓存的访问时间)Th= 延迟,即命中时引⽤缓存的时间E= 各种次级因素, 如多处理器系统中的队列效应衡量缓存的指标主要有两个:延迟和命中率。
同时也存在其他⼀些次级因素影响缓存的性能。
缓存的命中率是指需要的对象在缓存中被找到的频率。
⾼效的置换策略会保留较多的实⽤信息来提升命中率(在缓存⼤⼩⼀定的情况下)。
缓存的延迟是指命中后,从发出请求到缓存返回指定对象所需的时间。
快速的置换策略通常会保留较少的置换信息,甚⾄不保留信息,来减少维护该信息所需要的时间。
每种置换策略都是在命中率和置换之间妥协。
先进先出算法(FIFO)如上图,在⼀个队列中,如果队列未满,添加资源时添加在末尾,如果队列资源已经满了,那么再添加资源时需要先将队列头部的资源移除,腾出空间后再将待添加的资源加⾄队列尾。
代码实现:public class FIFO implements Cacheable {private int maxLength = 0;private Queue<Object> mQueue = null;public FIFO(int _maxLength) {... ...}@Overridepublic void offer(Object object) {if (mQueue == null) {throw new NullPointerException("策略队列对象为空");}// check is need swap or notif (mQueue.size() == maxLength) {clean();}mQueue.offer(object);}@Overridepublic void visitting(Object object) {System.out.println("Visited " + object);}private void clean() {mQueue.poll();}}最久未使⽤算法(LRU)最久未使⽤算法图⽰:对⽐FIFO原理图和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.总结以上所述的几种页面置换算法是操作系统中常见的算法。
它们各有优点和缺点,在实际应用中,需要根据实际情况进行选择。
在选择算法后,还需要对其进行适当的调整,以满足实际需求。
列举5种页置换算法
列举5种页置换算法
1. 先进先出(First-In-First-Out,FIFO)算法:最早进入内存的页将被替换出去,是最简单的页面置换算法,但也存在缺点,即无法区分页的重要性和频繁使用程度。
2. 最近最久未使用(Least Recently Used,LRU)算法:根据页的最近使用时间来进行置换,即替换最久未被使用的页,相对于FIFO算法,能更好地利用页的使用频率。
3. 最不经常使用(Least Frequently Used,LFU)算法:根据页的使用次数来进行置换,即替换使用次数最少的页,可以更好地适应动态变化的访问模式。
4. 最佳置换(Optimal)算法:根据将来的访问模式进行置换,即替换将来不再使用的页,由于需要预先预测访问模式,实现较为困难。
5. 时钟(Clock)算法:将页的状态标记为是否被访问过,以一个类似时钟的数据结构进行循环检测,置换未被访问过的页。
操作系统-页面置换算法课件
第一章 操作系统引论
图5-3 利用最佳页面置换算法时的置换图
3
第一章 操作系统引论
2. 先进先出(FIFO)页面置换算法 FIFO算法是最早出现的置换算法。该算法总是淘汰最先 进入内存的页面,即选择在内存中驻留时间最久的页面予以 淘汰。该算法实现简单,只需把一个进程已调入内存的页面 按先后次序链接成一个队列,并设置一个指针,称为替换指 针,使它总是指向最老的页面。但该算法与进程实际运行的 规律不相适应,因为在进程中,有些页面经常被访问,比如, 含有全局变量、常用函数、例程等的页面,FIFO算法并不能 保证这些页面不被淘汰。
9
第一章 操作系统引论
图5-6 某进程具有8个页面时的LRU访问情况
10
第一章 操作系统引论
2) 栈 可利用一个特殊的栈保存当前使用的各个页面的页面号。 每当进程访问某页面时,便将该页面的页面号从栈中移出, 将它压入栈顶。因此,栈顶始终是最新被访问页面的编号, 而栈底则是最近最久未使用页面的页面号。假定现有一进程, 它分有五个物理块,所访问的页面的页面号序列为:
4
第一章 操作系统引论
图5-4 利用FIFO置换算法时的置换图
5
第一章 操作系统引论
5.3.2 最近最久未使用和最少使用置换算法 1. LRU(Least Recently Used)置换算法的描述 FIFO置换算法的性能之所以较差,是因为它所依据的条
件是各个页面调入内存的时间,而页面调入的先后并不能反 映页面的使用情况。最近最久未使用(LRU)的页面置换算法 是根据页面调入内存后的使用情况做出决策的。
1
第一章 操作系统引论
5.3.1 最佳置换算法和先进先出置换算法 1. 最佳(Optimal)置换算法 最佳置换算法是由Belady于1966年提出的一种理论上的
fifo 页面置换算法
fifo 页面置换算法页面置换算法是操作系统中一种重要的内存管理技术,用于决定当内存中某个时间点所包含的页面(即帧)数量大于物理内存容量时,应该淘汰哪个页面,以便为新的页面腾出空间。
FIFO (FirstInFirstOut,先进先出)页面置换算法是一种常见的算法,其基本思想是优先淘汰最先进入内存的页面。
一、算法原理FIFO页面置换算法的基本原理是,当需要为新的页面分配内存时,选择最早进入内存的页面进行淘汰。
这种算法的优点是实现简单,缺点是对频繁调用的页面影响较大,因为这些页面最先进入内存,所以被淘汰的可能性也较大。
但是它能够确保被淘汰的页面是最早进入内存的页面,因此它能够提供一定的公平性。
二、算法步骤FIFO页面置换算法的实施步骤如下:1.记录每个页面进入和离开内存的时间;2.当需要为新的页面分配内存时,比较该页面与其最先进入内存的时间;3.优先淘汰最先进入内存的页面;4.将新页面放入空出的帧中。
三、算法优缺点1.优点:a.实现简单,易于实现;b.在许多场景下能提供较好的性能;c.有利于保持页面的有序性。
2.缺点:a.频繁调用的页面被淘汰的可能性较大,可能导致频繁的页面加载和卸载操作;b.对于某些应用场景可能不够高效,因为一些页面可能长时间在内存中占据空间,而不会被频繁使用。
因此需要对其进行优化,以便在减少页面的浪费和提高系统性能之间找到平衡。
四、应用场景FIFO页面置换算法适用于各种操作系统和应用程序,包括但不限于Web服务器、数据库系统、桌面环境等。
它尤其适用于那些对响应速度要求较高且对内存使用效率要求不高的场景。
例如,一些网页浏览、邮件阅读等应用场景,由于页面加载频率较高,FIFO算法可能会影响性能。
五、总结总的来说,FIFO页面置换算法是一种简单易行的内存管理技术,但在实际应用中需要根据具体场景进行优化。
在实际操作中,需要根据应用的特点和需求选择合适的页面置换算法,以提高系统的性能和稳定性。
操作系统——模拟页面置换算法(FIFO——先入先出、LRU——最近最少使用、LFU——最近。。。
操作系统——模拟页⾯置换算法(FIFO——先⼊先出、LRU——最近最少使⽤、LFU——最近。
操作系统——模拟页⾯置换算法(FIFO——先⼊先出、LRU——最近最少使⽤、LFU——最近最不常使⽤),计算置换率(包含程序框图)导语:1. FIFO页⾯置换算法:最简单的页⾯置换算法。
这种算法的基本思想是:当需要淘汰⼀个页⾯时,总是选择驻留主存时间最长的页⾯进⾏淘汰,即先进⼊主存的页⾯先淘汰。
(看时间)2. LRU页⾯置换算法:最近最少使⽤,简单来说就是将数据块中,每次使⽤过的数据放在数据块的最前端,然后将存在的时间最长的,也就是数据块的末端的数据置换掉。
(看时间)3. LFU页⾯置换算法:近期最少使⽤算法,选择近期最少访问的页⾯作为被替换的页⾯,如果⼀个数据在最近⼀段时间内使⽤次数很少,那么在将来⼀段时间内被使⽤的可能性也很⼩。
(看次数)4. 置换率与与缺页率不同。
置换率⽤置换次数算,缺页率⽤缺页中断次数算。
FIFO页⾯置换算法:Linux效果图(采⽤UOS + VScode + g++)程序框图C++代码(FIFO):#include<iostream>using namespace std;static int mnum;//物理块数static int pnum;//页⾯⾛向static int count=0;//页⾯置换次数static int *analogblock;//模拟物理块static int *block;//物理块static int *process;//随机页⾯访问序列int judge(int a[],int n,int x) //判断数组中是否已有x,若有返回其下标值,没有则返回-1 {int i;for (i=0;i<n;i++)if(x==a[i])return i;return -1;}void replace(int y,int mnum,int x)//⽤于物理块页⾯置换,y是⽤来置换的页⾯,x是被置换的页⾯ {int i;for (i=0;i<mnum;i++)if(x==block[i])block[i]=y;}int main() {int i;int maxanalogblock=-1;//模仿队列的定义int x;cout<<"请输⼊页框⼤⼩物理块数:\n";cin>>mnum;if(mnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}cout<<"⾃动⽣成的内存块需求序列个数:\n";cin>>pnum;if(pnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}analogblock=new int[mnum];block=new int[mnum];process=new int[pnum];for (i=0;i<mnum;i++) analogblock[i]=-1;for (i=0;i<mnum;i++) block[i]=-1;///////////////////////随机产⽣页⾯⾛向序列cout<<"产⽣随机序列如下:\n";srand( (unsigned)time( NULL ) );//以time函数值(即当前时间)作为种⼦数,保证两次产⽣序列的随机性for (i=0; i<pnum; i++) {process[i] = rand()%10;cout<<process[i]<<" ";}cout<<endl;//////////////////////cout<<"先进先出(FIFO)页⾯置换算法,结果: \n\n";//////////////////////for (x=0;x<pnum;x++) //⾃动读数 {//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}//////////////////////////maxanalogblock++;//读数后maxanalogblock⾃动+1if(maxanalogblock<mnum) //若在物理块范围内 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {analogblock[maxanalogblock]=process[x];//新元素从尾部插⼊block[maxanalogblock]=process[x];//新元素从尾部插⼊cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断调⼊页⾯"<<process[x]<<endl;} else //若数组中存在待插⼊元素 {maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在直接访问"<<endl;}} else //超过物理块数的元素 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {//队列法插⼊(尾部元素出,新元素从头部⼊)cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断页⾯"<<process[x]<<"置换出页⾯"<<analogblock[0]<<endl; replace(process[x],mnum,analogblock[0]);//置换物理块中页⾯for (i=0;i<mnum-1;i++)LRU 页⾯置换算法:Linux 效果图(采⽤UOS + VScode + g++)程序框图C++代码(LRU): analogblock[i]=analogblock[i+1];analogblock[mnum-1]=process[x];//////////////////maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值count++;} else //若数组中存在待插⼊元素 {maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在 直接访问"<<endl;}}}//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1) cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}cout<<endl<<"页⾯换算次数为:"<<count<<endl;cout<<"置换率为:"<<(float)count/pnum<<endl;return 0;}//g++ test71.cpp -o test71 -lpthread&&./test71#include<iostream>using namespace std;static int mnum;//物理块数static int pnum;//页⾯⾛向static int count=0;//页⾯置换次数static int *analogblock;//模拟物理块static int *block;//物理块static int *process;//随机页⾯访问序列int judge(int a[],int n,int x) //判断数组中是否已有x ,若有返回其下标值,没有则返回-1 {int i;for (i=0;i<n;i++)if(x==a[i])return i;return -1;}void replace(int y,int mnum,int x)//⽤于物理块页⾯置换,y是⽤来置换的页⾯,x是被置换的页⾯ { int i;for (i=0;i<mnum;i++)if(x==block[i])block[i]=y;}void move(int a[],int n,int i) //移动下标为i的元素到尾部 {int j;int m=a[i];for (j=i;j<n-1;j++)a[j]=a[j+1];a[n-1]=m;}int main() {int i;int maxanalogblock=-1;//模仿栈的定义int x;cout<<"请输⼊页框⼤⼩物理块数:\n";cin>>mnum;if(mnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}cout<<"⾃动⽣成的内存块需求序列个数:\n";cin>>pnum;if(pnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}analogblock=new int[mnum];block=new int[mnum];process=new int[pnum];for (i=0;i<mnum;i++) analogblock[i]=-1;///////////////////////随机产⽣页⾯⾛向序列cout<<"产⽣随机序列如下:\n";srand( (unsigned)time( NULL ) );//以time函数值(即当前时间)作为种⼦数,保证两次产⽣序列的随机性for (i=0; i<pnum; i++) {process[i] = rand()%10;cout<<process[i]<<" ";}cout<<endl;//////////////////////cout<<"最近最少使⽤(LRU)页⾯置换算法,结果: \n\n";//////////////////////for (x=0;x<pnum;x++) //⾃动读数 {//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}//////////////////////////maxanalogblock++;//读数后maxanalogblock⾃动+1LFU 页⾯置换算法:Linux 效果图(采⽤UOS + VScode + g++)程序框图 if(maxanalogblock<mnum) //若在物理块范围内 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {analogblock[maxanalogblock]=process[x];//新元素从尾部插⼊block[maxanalogblock]=process[x];//新元素从尾部插⼊cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断 调⼊页⾯"<<process[x]<<endl;} else //若数组中存在待插⼊元素 {move(analogblock,maxanalogblock,judge(analogblock,mnum,process[x]));//移动下标为i 的元素到尾部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在 直接访问"<<endl;}} else //超过物理块数的元素 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {//栈法插⼊(第⼀个元素出,后⾯元素前移,新元素从尾部⼊)cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断 页⾯"<<process[x]<<"置换出页⾯"<<analogblock[0]<<endl; replace(process[x],mnum,analogblock[0]);//物理块中页⾯置换for (i=0;i<mnum-1;i++)analogblock[i]=analogblock[i+1];analogblock[mnum-1]=process[x];//////////////////maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值count++;} else //若数组中存在待插⼊元素 {move(analogblock,mnum,judge(analogblock,mnum,process[x]));//移动下标为i 的元素到尾部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在 直接访问"<<endl;}}}//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}cout<<endl<<"页⾯换算次数为:"<<count<<endl;cout<<"置换率为:"<<(float)count/pnum<<endl;return 0;}//g++ test72.cpp -o test72 -lpthread&&./test72C++代码(LFU):#include<iostream>using namespace std;static int mnum;//物理块数static int pnum;//页⾯⾛向static int count=0;//页⾯置换次数static int **analogblock;//模拟物理块static int *block;//物理块static int *process;//随机页⾯访问序列int judge(int *a[],int n,int x) //判断数组中是否已有x,若有返回其下标值,没有则返回-1 {int i;for (i=0;i<n;i++)if(x==a[i][0])return i;return -1;}void replace(int y,int mnum,int x)//⽤于物理块页⾯置换,y是⽤来置换的页⾯,x是被置换的页⾯ { int i;for (i=0;i<mnum;i++)if(x==block[i])block[i]=y;}void move(int *a[],int n,int i) //移动下标为i的元素,⽐较访问次数次多少进⾏前进 {int j;int m=a[i][0];int m2=a[i][1];for (j=i;j<n-1;j++) {if(m2>=a[j+1][1]) {a[j][0]=a[j+1][0];a[j][1]=a[j+1][1];a[j+1][0]=m;a[j+1][1]=m2;}}}int main() {int i;int maxanalogblock=-1;//模仿栈的定义int x;//动态数组初始化cout<<"请输⼊页框⼤⼩物理块数:\n";cin>>mnum;if(mnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}cout<<"⾃动⽣成的内存块需求序列个数:\n";cin>>pnum;if(pnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}analogblock=(int**) (new int[mnum]);block=new int[mnum];process=new int[pnum];for (i=0;i<mnum;i++) analogblock[i]=(int*) new int[2];//⽤于保存页⾯号和访问次数for (i = 0; i < mnum; i++) {analogblock[i][0]=-1;analogblock[i][1]=0;}///////////////////////随机产⽣页⾯⾛向序列cout<<"产⽣随机序列如下:\n";srand( (unsigned)time( NULL ) );//以time函数值(即当前时间)作为种⼦数,保证两次产⽣序列的随机性for (i=0; i<pnum; i++) {process[i] = rand()%10;cout<<process[i]<<" ";}cout<<endl;//////////////////////cout<<"最近最不常使⽤(LFU)页⾯置换算法,结果: \n\n";//////////////////////for (x=0;x<pnum;x++) //⾃动读数 {//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i][0]!=-1)cout<<analogblock[i][0]<<" ";//<<"访问次数"<<analogblock[i][1]<<" "}//////////////////////////maxanalogblock++;//读数后maxanalogblock⾃动+1if(maxanalogblock<mnum) //若在物理块范围内 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {analogblock[0][0]=process[x];//新元素从头部插⼊analogblock[0][1]=1;block[maxanalogblock]=process[x];//新元素从尾部插⼊move(analogblock,mnum,0);//移动下标为i的元素到相同访问次数页⾯的顶部cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断调⼊页⾯"<<process[x]<<endl;} else //若数组中存在待插⼊元素 {// move(analogblock,maxanalogblock,judge(analogblock,mnum,process[x]));//移动下标为i的元素到尾部analogblock[judge(analogblock,mnum,process[x])][1]++;move(analogblock,mnum,judge(analogblock,mnum,process[x]));//移动下标为i的元素到相同访问次数页⾯的顶部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在直接访问"<<endl;}} else //超过物理块数的元素 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {//栈法插⼊(新元素从头部⼊,替换掉头部)cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断页⾯"<<process[x]<<"置换出页⾯"<<analogblock[0][0]<<endl; replace(process[x],mnum,analogblock[0][0]);//物理块中页⾯置换analogblock[0][0]=process[x];analogblock[0][1]=1;move(analogblock,mnum,0);//移动下标为i的元素相同访问次数页⾯的顶部//////////////////maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值count++;} else //若数组中存在待插⼊元素 {analogblock[judge(analogblock,mnum,process[x])][1]++;move(analogblock,mnum,judge(analogblock,mnum,process[x]));//移动下标为i的元素到相同访问次数页⾯的顶部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在直接访问"<<endl; }}}//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i][0]!=-1)cout<<analogblock[i][0]<<" ";}cout<<endl<<"页⾯换算次数为:"<<count<<endl;cout<<"置换率为:"<<(float)count/pnum<<endl;return 0;}//g++ test73.cpp -o test73 -lpthread&&./test73。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
7 4
0 7 4
7 0 4
算法思想:最近最久未使用(LRU) 置换算法,是根据页面调入内存后 的使用情况进行决策的。由于无法 预测各页面将来的使用情况,只能 利用“最近的过去”作为“最近的 将来”的近似,因此,LRU置换算法 是选择最近最久未使用的页面予以 淘汰。该算法赋予每个页面一个访 问字段,用来记录一个页面自上次 被访问以来所经历的时间t,,当须淘 汰一个页面时,选择现有页面中其t 值最大的,即最近最久未使用的页 面予以淘汰。
实例(opt置换算法)
问题描述 主流页面内存数:3 缺页中断时间:20us 页号序列: 内存存取时间:8us 访问快表时间:1us
7、0、1、2、0、3、0、4、2、3、0、3、2、1、2、0、1、7、0、1
实例(opt置换算法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
页面置换次数:9次
所需时间:9*(20+8*3)+11*(1+8)=495us
OPT算法思想: 选择的被淘汰页面,将是以后永不 使用的或许是在最长(未来)时间内不 再被访问的页面。采用最佳置换算 法,通常可保证获得最低的缺页率。 但由于人目前还无法预知一个进程 在内存的若干个页面中,哪一个页 面是未来最长时间内不再被访问的, 因而该算法是无法实现的,便可以 利用此算法来评价其它算法。
LRU最近最久未使用算法
• 淘汰页面标准:页面调入内存后的使用频率。 • 优点:内存页面数越多,命中率越高 • 缺点:硬件支持、寄存器或栈
LRU最近最久未使用算法
页面置换次数:12
所需时间:12*(20+8*3)+8*(1+8)=600us
LRU最近最久未使用算法_寄存器
LRU最近最久未使用算法_栈
页面置换算法
组长:祖琪玮
组员:要笑娟、徐朝阳 藤真久、金少鹏
项目设计思路
• 界面:MFC 后台语言:C++ 工具:vs2010 • 流程:分析问题设计算法设计界面分工合作 • 注:现在处于设计算法的位置,算法已经理解,下一步进行界面的
设计,以下为算法分析。
OPT最佳置换算法
• • • •
淘汰页面标准:以后用不使用或在最长(未来)时间内不再被访问。 优点:缺页率低 缺点:理想状况、不实用 作用:对可实现算法的性能进行衡量比较,即越接近越好。FIFO先进来自出置换算法• • • •
淘汰页面标准:选择在内存中驻留时间最久的淘汰。
优点:实现逻辑简单
实例:
队列+指针
缺点:缺页率高,页面调入顺序不能反映页面使用情况
页面置换次数:15
所需时间:15*(20+8*3)+9*(1+8)=741us
算法思想:该算法总是淘 汰最先进入内存的页面, 即选择在内存中驻留时间 最久的页面予以淘汰。该 算法实现简单只需把一个 进程已调入内存的页面, 按先后次序链接成一个队 列,并设置一个指针,称 为替换指针,使它总是指 向最老的页面。
HANK
Y
OU!
--制作人:要笑娟
LFU最少使用置换算法
• 页面淘汰标准:最近时期、使用最少 • 缺点:页面访问频率不准确、硬件支持(寄存器) • 特点:在内存中的每个页面上设置移位寄存器,记录该页面被访的
频率。
• LFU&LRU:LRU比较寄存器内数字大小
LFU比较寄存器内R1+…+Ri+Rj…+Rn
• 备注:LFU页面访问图与LRU页面访问图完全一样,在此不再赘述