北交大操作系统作业-内存管理器实验(10页).doc

上传人:1595****071 文档编号:35922473 上传时间:2022-08-24 格式:DOC 页数:9 大小:316.50KB
返回 下载 相关 举报
北交大操作系统作业-内存管理器实验(10页).doc_第1页
第1页 / 共9页
北交大操作系统作业-内存管理器实验(10页).doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《北交大操作系统作业-内存管理器实验(10页).doc》由会员分享,可在线阅读,更多相关《北交大操作系统作业-内存管理器实验(10页).doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-北交大操作系统作业-内存管理器实验-第 9 页实验三 内存管理1一实验目的1二实验内容1三实验设计1四模拟实验23579五实验结果12六实验总结15实验三 内存管理一实验目的构造一个没有虚存功能的内存管理系统,并进行测试和对不同分配策略的性能展开比较评估。本次实验,选择的分配策略:First-fit 和 next-fit二实验内容1、设计一个内存管理器,支持至少两种分配策略(本实验使用firstfit策略和nextfit策略);2、分别对不同的策略进行性能评估三实验设计unsigned char mm65536;2. 用户接口用户接口函数:int mm_init() /初始化int mm_r

2、equest(int n) /申请空间void mm_release(int p) /释放空间3计算请求尺寸srand(unsigned char)time(NULL);tmp = (rand() % 1024) + 1; /最大申请10244.选择待释放的块tmp = (rand() % j);while(ptmp = -1)tmp = rand() % j;requestsize = requestsize - BinToInt(&mmptmp + 4);mm_release(ptmp);cout 释放指针 ptmp endl;ptmp = -1;四模拟实验实现两个版本的内存管理器,分配策

3、略分别为:first-fit和next-fit#include #include #include #include #include first.husing namespace std;int main()int i;int j = 0; /分配指针数int p1000; /用于存放分配出的指针int tmp;int requestsize = 0; /统计申请空间int k = 0; /统计搜索步数srand(unsigned char)time(NULL);step = 0;mm_init();for(i = 0; i 30; i+) /模拟30步cout 第 i + 1 步 endl

4、;dotmp = (rand() % 1024) + 1; /最大申请1024cout 申请空间 tmp 字节 endl;pj = mm_request(tmp);if(pj != -1)requestsize = requestsize+tmp;k = k + step;cout 分配指针 pj endl;cout endl;j+;elsecout 剩余空间不足,分配失败 endl;while(pj != -1);tmp = (rand() % j);while(ptmp = -1)tmp = rand() % j;requestsize = requestsize - BinToInt(&

5、mmptmp + 4);mm_release(ptmp);cout 释放指针 ptmp endl;ptmp = -1;/以下为性能统计指标cout endl;cout 平均申请空间: (double)requestsize / (double)j 字节 endl;cout 平均空间利用率: (double)requestsize/(double)65536 endl;cout 平均搜索步数: (double)k/(double)j endl;cout endl;if(i + 1) % 5 = 0)system(pause);unsigned char mm65536;int step; /记录

6、搜索步数int BinToInt(unsigned char *s) /把char类型变成intint i;char tmp4;int t;for(i = 0; i 4; i+)tmp3 - i = si;memcpy(&t,tmp,4);return t;void IntToBin(int s, unsigned char *t) /把int类型变成charint i;char tmp4;memcpy(tmp,&s,4);for(i = 0; i =BinToInt(&mmpointer+4) /pointer+4 表示块大小/mmpointer+8=1 状态位是一,说明这一块已经被分配/n

7、+26 申请的空间+管理开销pointer=BinToInt(&mmpointer+BinToInt(&mmpointer+4)-4); /找到后向指针if(mmpointer+8 != 1)step+;/非空闲块不在链内,不计步数if(pointer = -1)return -1;mmpointer + 8 = 1; /修改本块标志位IntToBin(pointer + 4 + 4 + 1 + n + 4, &mmpointer + 9 + n); /修改本块后向指针IntToBin(pointer, &mmpointer + 4 + 4 + 1 + n + 4); /修改后块前向指针Int

8、ToBin(BinToInt(&mmpointer + 4) - n - 13, &mmpointer + 4 + 4 + 1 + n + 4 + 4); /修改后块大小IntToBin(n + 13,&mmpointer + 4); /修改本块大小return pointer;void mm_release(int p)int pre;int bac;pre = BinToInt(&mmp);bac = BinToInt(&mmp + BinToInt(&mmp + 4) - 4);mmp + 8 = 0; /修改本块标志位if(BinToInt(&mmbac+8) = 0) /如果后块未使

9、用IntToBin(0,&mmp+BinToInt(&mmp + 4) - 4); /清空本块后向指针IntToBin(0,&mmbac); /清空后块前向指针IntToBin(BinToInt(&mmp + 4) + BinToInt(&mmbac + 4), &mmp + 4); /修改本块大小if(BinToInt(&mmbac + BinToInt(&mmbac + 4) - 4) != -1) /如果后块不是最后一块IntToBin(p, &mmBinToInt(&mmbac + BinToInt(&mmbac + 4) - 4); /修改后块的后块前向指针IntToBin(0, &

10、mmbac + 4); /清空后块大小if(pre = -1)return;if(BinToInt(&mmpre + 8) = 0) /如果前块未使用IntToBin(0, &mmpre + BinToInt(&mmpre + 4) - 4); /清空前块后向指针IntToBin(BinToInt(&mmpre + 4) + BinToInt(&mmp + 4), &mmpre + 4); /修改前块大小IntToBin(pre, &mmBinToInt(&mmp + BinToInt(&mmp + 4) - 4); /修改后块前向指针IntToBin(0, &mmp + 4); /清空本块大

11、小IntToBin(0, &mmp); /清空本块前向指针#include #include #include #include #include next.husing namespace std;int main()int i;int j = 0; /分配指针数int p1000; /用于存放分配出的指针int tmp;int requestsize = 0; /统计申请空间int k = 0; /统计搜索步数srand(unsigned char)time(NULL);step = 0;next = 0;end = -1;mm_init();for(i = 0; i 30; i+)/模拟

12、30步cout 这是第 i + 1 步 endl;dotmp = (rand() % 1024) + 1; /最大申请1024cout 申请空间 tmp 字节 endl;pj = mm_request(tmp);if(pj != -1)requestsize = requestsize + tmp;k = k + step;cout 分配指针: pj endl;cout endl;j+;elsecout 剩余空间不足,分配失败。 endl;while(pj != -1);tmp = (rand() % j);while(ptmp = -1)tmp = rand() % j;requestsiz

13、e = requestsize - BinToInt(&mmptmp + 4);mm_release(ptmp);cout 释放指针: ptmp endl;ptmp = -1;/以下为性能统计指标cout endl;cout 平均申请空间: (double)requestsize/(double)j 字节 endl;cout 平均空间利用率: (double)requestsize/(double)65536 endl;cout 平均搜索步数: (double)k/(double)j endl;cout endl;if(i + 1) % 5 = 0)system(pause);unsigned

14、 char mm65536;int step;int next;int end;int BinToInt(unsigned char *s)int i;char tmp4;int t;for(i = 0; i 4; i+)tmp3 - i = si;memcpy(&t,tmp,4);return t;void IntToBin(int s, unsigned char *t)int i;char tmp4;memcpy(tmp,&s,4);for(i = 0; i 4; i+)ti = tmp3 - i;int mm_init()memset(mm, 0, 65536);IntToBin(-1

15、, mm);IntToBin(65536, &mm4);IntToBin(-1, &mm65536-4);return 0;int mm_request(int n)/四字节前向指针、四字节块大小、一字节状态、N字节可用内存、四字节后向指针int pointer;step = 0;pointer = next;while(pointer != -1)if(mmpointer + 8 != 1) & (n + 26) BinToInt(&mmpointer + 4)break;pointer = BinToInt(&mmpointer + BinToInt(&mmpointer + 4) - 4

16、);/step+;if(mmpointer + 8 != 1)step+;if(pointer = -1)pointer = 0;while(pointer != end)if(mmpointer + 8 != 1) & (n + 26) BinToInt(&mmpointer + 4)break;pointer = BinToInt(&mmpointer + BinToInt(&mmpointer + 4) - 4);if(mmpointer + 8 != 1)step+;/step+;if(pointer = end)return -1;mmpointer+8 = 1; /修改本块标志位I

17、ntToBin(pointer + 4 + 4 + 1 + n + 4, &mmpointer + 9 + n); /修改本块后向指针IntToBin(pointer, &mmpointer + 4 + 4 + 1 + n + 4); /修改后块前向指针IntToBin(BinToInt(&mmpointer + 4) - n - 13, &mmpointer + 4 + 4 + 1 + n + 4 + 4); /修改后块大小IntToBin(n + 13, &mmpointer + 4); /修改本块大小end = pointer;next = pointer + 4 + 4 + 1 + n

18、 + 4;return pointer;void mm_release(int p)int pre;int bac;pre = BinToInt(&mmp);bac = BinToInt(&mmp + BinToInt(&mmp + 4) - 4);mmp + 8 = 0; /修改本块标志位if(BinToInt(&mmbac + 8) = 0) /如果后块未使用IntToBin(0, &mmp + BinToInt(&mmp + 4) - 4); /清空本块后向指针IntToBin(0, &mmbac); /清空后块前向指针IntToBin(BinToInt(&mmp + 4) + BinT

19、oInt(&mmbac + 4), &mmp + 4); /修改本块大小if(BinToInt(&mmbac + BinToInt(&mmbac + 4) - 4) != -1) /如果后块不是最后一块IntToBin(p, &mmBinToInt(&mmbac + BinToInt(&mmbac + 4) - 4); /修改后块的后块前向指针IntToBin(0, &mmbac + 4); /清空后块大小if(pre = -1)return;if(BinToInt(&mmpre + 8) = 0) /如果前块未使用IntToBin(0, &mmpre + BinToInt(&mmpre +

20、4) - 4); /清空前块后向指针IntToBin(0, &mmp); /清空本块前向指针IntToBin(BinToInt(&mmpre + 4) + BinToInt(&mmp + 4), &mmpre + 4); /修改前块大小IntToBin(pre, &mmBinToInt(&mmp + BinToInt(&mmp + 4) - 4); /修改后块前向指针IntToBin(0, &mmp + 4); /清空本块大小五实验结果1 .实现的两种分配策略:first-fit 和 next-fit2. 设计测试程序,收集实验数据:First-fit 运行结果:Next-fit 运行结果:3

21、 分析实验数据First-fit:步数51015202530平均请求尺寸(字节)平均内存利用率平均搜索步数通过图表可以看出:随着步数的增加,平均请求尺寸(字节)逐渐变小:这是因为随着对空间的分配和释放,碎片开始出现,而且越来越多,导致能分配的最大空间减小。平均内存利用率逐渐降低:随着碎片的产生,很多碎片由于太小而无法利用,最终导致平均内存利用率降低。平均搜索步数逐渐增加:随着碎片数量的增加,找到合适的可分配的块越来越困难,导致平均搜索步数增加。Next-fit步数51015202530平均请求尺寸(字节)平均内存利用率平均搜索步数0通过图表可以看出,first-fit 的分析结果同样适用于next-fit 。六实验总结通过分析first-fit 和 next-fit 两个表格,两种分配策略的平均请求尺寸和平均内存利用率差不多一致。但是在平均搜索步数上,next-fit 要明显优于 first-fit,原因是first-fit 每次都是从头开始找,而next-fit是从上一次成功的位置开始找,所以从表格上看,next-fit 方法好于first-fit方法。但是表格中所显示的实验次数较少,我分析,随着实验次数的增加,两种分配策略的平均搜索步骤也会趋于接近,因为随着碎片的产生,搜索步数就渐渐与查找的起始位置无关了。

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

当前位置:首页 > 教育专区 > 单元课程

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

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