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

页面置换算法大题
摘要:
一、页面置换算法概述
二、页面置换算法的分类
三、页面置换算法的优缺点分析
四、常见的页面置换算法及其应用
五、总结
正文:
一、页面置换算法概述
页面置换算法,是计算机操作系统中的一种内存管理技术。
它的主要作用是在内存有限的情况下,对内存中的页面进行有效管理,以便在需要时,能够迅速地调用所需的页面,提高系统的运行效率。
二、页面置换算法的分类
根据页面置换的原则,可以将页面置换算法分为以下几类:
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次缺页中断时被置换掉了。
页面置换算法

页面置换算法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-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)。
问题:
某计算机系统采用请求页虚拟存储方案管理内存,并将页大小设置为1KB,支持最大1M的寻址空间。
如果某一进程向操作系统申请20KB 的内存空间,页表内容如下:
回答下列问题:
1)若指令访问的数据的逻辑地址分别为0x01C00,0x0C700和0x03200 。
则系统将如何处理这些地址?
2)若采用固定分配局部置换策略,存储管理程序分配给该进程4个帧,其页访问流为:
1、3、4、5、
2、
3、
4、8、6、7、
5、
6、
7、6、5、4、2
请给出采用LRU算法和时钟算法时的缺页率。
由问题要求得知,该计算机系统中每个进程可获得最多1024个页面,若某进程向操作系统申请20KB的内存空间,则表示该进程需要20个页框的存储空间。
根据页表提供的信息,该进程获得的页框数目只有四个,分别存储进程空间的第0、2、3、4页。
系统支持1M寻址空间,则系统逻辑地址需要20个二进制位表示,页大小为1KB,则表示页内偏移地址需要10个二进制位表示。
因此,页号使用剩余的10位表示。
1)地址0X01C00 对应的二进制值为(0001,1100,0000,0000),低十位表示页内偏移地址,高十位为页号,所以,该地址对应的页号为7,根据题示,7页不在内存,所以,对地址0X01C00的寻址会导致缺页中断的产生。
地址0X0C700对应的二进制值为(1100,0111,0000,0000),该地址对应的页号为49,根据题示,进程只有20个页面,所以对地址0X0C700的寻址会导致越界中断的产生。
地址0x03200对应的二进制值为(0011,0010,0000,0000),该地址对应的页号为12,根据题示,第12页不在内存,所以,对地址0X03200的寻址也会导致缺页中断的产生。
2)LRU算法和时钟算法如下图所示:
访问位与修改位变化情况
(红色部分为指针位置):
由上图所得,LRU算法和时钟算法最后保留在页框中的页面分别是:。