北京邮电大学操作系统第二次实验报告存储管理(共14页).docx

上传人:飞****2 文档编号:15185279 上传时间:2022-05-11 格式:DOCX 页数:14 大小:245.40KB
返回 下载 相关 举报
北京邮电大学操作系统第二次实验报告存储管理(共14页).docx_第1页
第1页 / 共14页
北京邮电大学操作系统第二次实验报告存储管理(共14页).docx_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《北京邮电大学操作系统第二次实验报告存储管理(共14页).docx》由会员分享,可在线阅读,更多相关《北京邮电大学操作系统第二次实验报告存储管理(共14页).docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上操作系统实验二.存储管理班级: 学号: 姓名: (一)实验目的:通过模拟实现内存分配的伙伴算法和请求页式存储管理的几种基本页面置换算法,了解存储技术的特点。掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。实验内容:实现一个内存管理的伙伴算法,实现内存块申请时的分配和释放后的回收。实验准备:用随机函数仿真进程进行内存申请,并且以较为随机的次序进行释放。对其碎片进行统计,当申请分配内存失败时区分实际空间不足和由于碎片而不能满足。 实现:1. 申请和释放序列的实现:采用随机数生成函数产生,13之间的随机数,1和2时代表产生申请内存块

2、的指令,3代表产生释放内存块的指令。这样就可以保证产生一个随机的申请释放序列,而且因为申请的概率比释放的概率大1倍,所以肯定能保证申请完内存。2. 申请的实现由随机数产生函数产生1到最大申请数量之间的一个值,代表申请的内存块。用一个bool数组储存内存块的使用情况。遍历数组查找是否有符合要求的连续内存块序列。如果有就把对应的数组的元素改为false,并把申请记录到一个矢量中用于释放。如果申请失败则返回失败的原因,有内存不足和没有足够的连续块两个原因。3. 释放的实现由随机数产生函数产生1到申请的总次数之间的一个值,来决定释放哪一次申请的内存。并根据矢量中记录的内存块的位置,和块数修改对应的数组

3、值。数据结构及核心函数:#define PAGENUM 100/总的块数#define MAXREQ 5/一次最多申请的块数#define produceNum(num) (rand()%num+1)class Memprivate:int memNum;bool memPAGENUM;/所有内存块vector occupied;public:Mem();int prodecuReq(void);int produceRel(void);void run(void);void showMem(void);void Mem:showMem(void);void Mem:run(void)sran

4、d(unsigned(time(0);while (true)int op = produceNum(3);if(op = 1 | op = 2)/这时产生申请块,概率是释放页面的两倍int size = produceNum(MAXREQ);/产生申请块的个数cout申请size块;bool flag;for(int i=0; i memNum)flag = false;break;flag = true;if(memi = true)for(int j = 0; jPAGENUM-1)flag = false;break;if(memj+i = false)/i = i + j + 1;f

5、lag = false;break;if(flag)int* temp = new int2;temp0 = i;temp1 = size;occupied.push_back(temp);for(int n = 0; n=size-1; n+)memi+n = false;break;if(flag)memNum = memNum - size;cout.申请成功,剩余memNum块endl;elseif(memNum size)cout.申请失败,内存不足endl;elsecout.申请失败,没有足够多的连续块endl;showMem();return;else/这时释放块if(occup

6、ied.size() = 0)continue;int page = produceNum(occupied.size();int*temp = occupiedpage-1;memNum = memNum + temp1;cout释放temp1块.剩余memNum块endl;for(int i = temp0; i=temp0+temp1-1; i+)memi = true;vector :iterator first = occupied.begin();occupied.erase(first+page-1);/_sleep(2000);/getchar(); 运行情况:1.一次最多申请

7、20块的请求情况2. 一次最多申请20块的请求失败时内存的使用情况4. 一次最多申请5块的请求情况2. 一次最多申请5块的请求失败时内存的使用情况总结:相对来说一次最多申请20块时比一次最多请求5块时,碎片情况要比较严重。最多申请20块因为没有足够的连续区域而停止的概率要比最多申请5块时因为没有足够的连续区域而停止的概率大。虽然有大块的区域没有分配,但是连续块的数量还是无法满足最多申请20块时的请求。(二)实验内容:设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。1) 最佳置换算法(Optimal)2) 先进先出法(Fisrt In First Out)3) 最近最久未使用(Le

8、ast Recently Used)4) 最不经常使用法(Least Frequently Used)其中,命中率页面失效次数页地址流长度。试对上述算法的性能加以较各:页面个数和命中率间的关系;同样情况下的命中率比较。实验准备:本实验中主要的流程:首先用srand( )和rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。实现:页面请求序列的产生:采用指导书上产生指令的方法,先产生一个0,1023之间的随机数m,然后将m加1作为第一个请求,然后产生一个0到m+2之间的随机数m1,作为第二条指令,接着将m1+1作为第三条指令。最后产生一个

9、m1+2,2047之间的随机数作为第四条指令。这样重复进行512次,一共产生了2048条指令。接着按照指令整除64的计算方法可以获得这条指令所在的页面号。这样便产生了2048个页面请求。最优置换:所有置换算法其他部分都基本相同,不同的是选择置换页面的部分。对于最优置换,发生页错误时,使用selectBest函数选择页面。传入start作为计算得而起始点。设置一个time数组用来记录内存中的每一个页,在start之后第一次出现时在页面请求数组里的下标。当然需要先将time数组初始化为INI(10000)作为初始值,这样就能代表内存中还没有页,能保证这个位置能被优先替换。在计算完time数组后,只

10、要在time数组中找出最大值,返回下标,这个下标就代表需要置换的内存中的页。先进先出置换:设置一个age数组用来记录内存中对应页的年龄,age数组初始化为INI,这样就能保证这些位置能够首先填充上页。每次置换只要在age数组里找出最大的值(即代表这个页来得最早),返回其下标,并把这个位置置成0即可。与最优置换不同的时,如果没有发生页错误,需要遍历age数组,把每一位都加1。最近最久未使用:需要设置一个useTime数组来记录上一次使用到现在的时间。初始化为INI,这样能保证初始的值是最大的,即会被优先换出去。每次置换时,只需要在useTime数组中找出最大的值(即上次使用时间距今最久),返回下

11、标,并把这个位置成0。每次发生命中时需要把除了命中页之外的所有页的useTime加1,命中页清零。每次页错误时,需要把除了被替换页之外的所有页的useTime加1。最不经常使用法:需要设置一个fru数组来记录内存中页被访问的次数。初始化为-1,保证这些位置能够马上被填充上。发生页错误时,只需要在fru数组中找出最小的值,然后返回其下标,并把对应位置成1。每次发生命中时,需要把命中页对应的fru加1。即提高其使用频率。数据结构及核心函数:#define INI 10000#define PAGENUM 20/内存页数int comm2048;class CreateReqpublic:Creat

12、eReq();int produceNum(int num);int CreateReq:produceNum(int num) return rand()%num;CreateReq:CreateReq()srand(unsigned(time(0);for(int i = 0; i=511; i+)int m = produceNum(1024);commi*4 = m + 1;int m1 = produceNum(m + 2);commi*4+1 = m1;commi*4+2 = m1 + 1;commi*4+3 = produceNum(2047-m1-2 + 1) + m1 + 2

13、;for(int i = 0; i=2047; i+)commi = commi/64;class controlprivate:int fruPAGENUM;int useTimePAGENUM;int agePAGENUM;int memBestPAGENUM;int memFifoPAGENUM;int memLruPAGENUM;int memLfuPAGENUM;float pfBest;float pfFifo;float pfLru;float pfLfu;float rateBest;float rateFifo;float rateLru;float rateLfu;publ

14、ic:control(void)pfBest = 0;pfFifo = 0;pfLru = 0;pfLfu = 0;for(int i=0; i=PAGENUM-1; i+)memBesti = INI;memFifoi = INI;memLrui = INI;memLfui = INI;agei = INI;useTimei = INI;frui = 0;int selectBest(int page,int start);int selectFifo();int selectLru();int selectLfu();void run(void);bool exist(int page,

15、int mem);void inc(int age);void control:inc(int age)for(int i=0; iPAGENUM-1; i+)agei+;bool control:exist(int page,int mem)for(int i=0; iPAGENUM-1; i+)if(page = memi)return true;return false;int control:selectBest(int page,int start)int big=0;int temp;int timePAGENUM;for(int i=0; i=PAGENUM-1; i+)/构建t

16、ime数组,记录这个页在后面的出现时间timei = INI;if(memBesti = INI)return i;for(int j=start+1; j=2047; j+)if(commj = memBesti)timei = j;break;for(int i=0; i=big)big = timei;temp = i;return temp;int control:selectFifo()int temp;int old = 0;for(int i=0; i=old)old = agei;temp = i;agetemp = 0;return temp;int control:sele

17、ctLru()int temp;int big = 0;for(int i=0; i=PAGENUM-1; i+)if(big=useTimei)big = useTimei;temp = i;useTimetemp = 0;return temp;int control:selectLfu()int temp;int small = 0;for(int i=0; i=frui)small = frui;temp = i;frutemp = 1;return temp;void control:run(void)for(int i=0; i=2047; i+)/getchar();if(!ex

18、ist(commi,memBest)/最优页置换pfBest+;memBestselectBest(commi,i) = commi;if(!exist(commi,memFifo)/Fifo页置换pfFifo+;memFifoselectFifo() = commi;if(!exist(commi,memLru)/lru页置换pfLru+;memLruselectLru() = commi;elsefor(int j=0; j=PAGENUM-1; j+)if(memLruj != commi)useTimej+;if(!exist(commi,memLfu)/lfu页置换pfLfu+;me

19、mLfuselectLru() = commi;elsefor(int j=0; j=PAGENUM-1; j+)if(memLfuj != commi)fruj+;inc(age);rateBest = 1 - pfBest/2047;rateFifo = 1 - pfFifo/2047;rateLru = 1 - pfLru/2047;rateLfu = 1 - pfLfu/2047;cout在内存能容纳PAGENUM页时,最优置换的命中率为rateBestendl;cout在内存能容纳PAGENUM页时,先进先出置换的命中率为rateFifoendl;cout在内存能容纳PAGENUM页时,最久未使用置换的命中率为rateLruendl;cout在内存能容纳PAGENUM页时,最不经常使用的命中率为rateLfuendl;getchar();void main(void)CreateReq a;control b;b.run();运行情况:1. 内存能容纳10页2. 内存能容纳20页3.内存能容纳30页专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁