内存管理、分配与回收模拟实验(共43页)

上传人:6**** 文档编号:50337056 上传时间:2022-01-20 格式:DOCX 页数:43 大小:669.97KB
收藏 版权申诉 举报 下载
内存管理、分配与回收模拟实验(共43页)_第1页
第1页 / 共43页
内存管理、分配与回收模拟实验(共43页)_第2页
第2页 / 共43页
内存管理、分配与回收模拟实验(共43页)_第3页
第3页 / 共43页
资源描述:

《内存管理、分配与回收模拟实验(共43页)》由会员分享,可在线阅读,更多相关《内存管理、分配与回收模拟实验(共43页)(43页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上姓名学号实验成绩专心-专注-专业华中师范大学计算机科学系实 验 报 告 书实验题目:内存管理、分配与回收 课程名称: 操作系统 主讲教师: 辅导教师: 课程编号: 班 级: 实验时间: 一、实验目的:(1)掌握内存分区管理的基本思想,理解内存分配表。(2)深入理解可变分区的内存分配策略,掌握首先适应算法、最佳适应算法和最坏适应算法。(3)掌握内存碎片产生的途径以及解决碎片的方法拼接技术。(4)实现分区的回收。针对内存管理的相关活动,研究内存空闲队列的动态组织与管理问题,以及在此基础上执行的内存分配与回收活动。二、实验内容:本实验将利用伙伴系统来组织内存空闲块队列和已使

2、用内存块队列。从初始化快照、某一组作业申请内存块前的快照、分配成功后的快照等状态出发,结合内存分配原语(算法)和内存回收原语(算法)的实现,结合实际内存块的动态分配与回收情况(某一快照),研究内存空闲块队列的组织、变化及其队列管理方面的问题。具体内容如下:(1)实现内存分配算法和内存回收算法。(2)以伙伴系统的组织方式管理内存空闲队列和已使用内存块队列,具体的组织策略应分别考虑首次适应策略、最佳适应策略和最坏适应策略。(3)考虑在某一内存使用一段时间的快照,给出一组作业的内存申请,判断该申请是否可以被满足。3、 实验要求(1) 分配算法中切割空闲区是从低地址开始;(2) 需考虑门限值情况,门限

3、值是指切割空闲区后剩下的区域若小于一个用户给定的值时,就不切割该空闲区,统统分给申请者,这个值由用户指定;(3)回收算法需要考虑上邻、下邻、上下邻和不相邻四种情况。四、实验环境:实践平台:windows编写环境:CodeBlocks编译器:g+五、实验设计原理(1)可变分区基本思想可变分区是指系统不预先划分固定分区,而是在装入程序时划分,使程序分配的大小正好等于程序的需求量,且分区的个数是可变的,这样有较大的灵活性,较之固定分区能获得更好的内存利用率。其状态如图所示: (2)内存分配表内存分配表由两张表格组成:一张是已分配表,记录已装入的程序在内存中占用分区的起始地址和长度,并表之位指出占用分

4、区的程序名;另一张是空闲区表,记录内存中可供分配的空闲区的起始地址和长度,用标志位指出该分区是未分配的空闲区。其基本结构如图所示: (3)分配策略1 首次适应算法(First Fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。2 最佳适应算法(Best Fit):从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表

5、(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。3 最差适应算法(Worst Fit):从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中的结点大小趋于均匀,适用于请求分配的内存大小范围较窄的系统。为适应此算法,空闲分区表(空闲区链)中的空闲分区按大小从大到小进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留小的空闲区,尽量减少小的碎片产生。(4)碎片拼接采用可变分区存储管理方案后,经过一段时间的分配回收,内存中会存在很多很小的空闲块。需要在适当时刻进行碎片整理,通过内存

6、中移动程序,把所有空闲碎片合并成一个连续的大空闲区且放在内存的一端,而把所有程序占用区放在内存另一端。(5) 分区的回收当用户执行结束后,系统要收回已经使用完毕的分区,将其记录在空闲区表中。一般情况下应考虑四种情况:1. 回收分区的上邻分区是空闲的,需要将这两个相邻的空闲分区合并成一个更大的空闲区,然后修改空闲区表。2. 回收分区的下邻分区是空闲的,需要将这两个相邻的空闲分区合并成一个更大的空闲区,然后修改空闲区表。3. 回收分区上下邻区都是空闲的,需要将三者合并成一个更大的空闲区,然后修改空闲表。4. 回收区的上邻下邻区都不是空闲的,则直接将空闲区记录在空闲表中。五、实验详细实现过程与算法流

7、程(一)数据结构1. 作业结构本实验的重点是对内存的管理、分配与回收,所以作业的内部结构简单,仅包含:进程名(name)、程序大小(size)和内部指针(next),其结构如图:2. 分配表结构本实验的分配表结构包含:进程名兼区名(name)、地址(address)、程序大小(size)、状态(state)和内部指针(next),其结构如图:2. 队列结构作业队列(joblist)、占用表队列(occupiedlist)和空闲表队列(blanklist)。其结构如图所示:(2) 程序结构思维导图6、 实验测试与过程分析(1) 实验数据内存大小设置为1024k。进行CreateJob操作后,由计

8、算机随机生成一个作业,每生成一个作业,作业名累次加1,作业大小随机设置位200k500k大小,其结构如图所示:(2) 测试首先适应算法(FF)1 创建5个作业,作业队列、空闲表队列、占用队列如图所示:2 分配内存直至内存不足:3 依次终止JOB2、 JOB1、JOB3对FF算法进行了多组测试,仅记录了一组测试结果。通过多组测试的结果分析,每次划分内存空间,均是从低地址处开始划分,在结束作业,收回内存时,根据相邻情况与否,进行合并后在按地址升序插入到空闲队列中。(3) 最佳适应算法(BF)1 创建5个作业,作业队列、空闲表队列、占用队列如图所示:2 分配内存直至不足:3 终止作业JOB2、JOB

9、1:对BF算法进行了多组测试,仅记录了一组测试结果。通过多组测试的结果分析,每次划分内存空间,均是从低地址处开始划分,在结束作业,收回内存时,根据相邻情况与否,进行合并后按照空闲块的大小升序插入空闲队列中。(4) 最坏适应算法(BF)1 创建5个作业,作业队列、空闲表队列、占用队列如图所示:2 分配内存直至不足:3 终止作业JOB2、JOB1: 对WF算法进行了多组测试,仅记录了一组测试结果。通过多组测试的结果分析,每次划分内存空间,均是从低地址处开始划分,在结束作业,收回内存时,根据相邻情况与否,进行合并后按照空闲块的大小降序插入空闲队列中。六、实验结果分析(问题的发现、分析、解决方案与创新

10、)1. 在设计分配表数据结构的时候,起初考虑了顺序表结构,发现在执行整个内存的分配与回收的过程中,需要较多地进行删除、插入操作,顺序表并不合适,遂改为链表结构,实现相关的链表操作。2. 因为设计了链表的数据结构,对不同算法中占用表和空闲表中块的排序极为困难,换一种思路,便是在回收合并的时候,如果有相邻的空闲块,把它们摘取下来,进行合并,把合并后的结果再插入到空闲表中,这样的方式与之前想过的在空闲表原有的块上合并相邻空闲块更为简单,容易实现,十分地方便。3. 在考虑到浏览结果的方便性和直观性,通过相应的格式控制,以表格的形式展现各个队列的状态,各个作业在何种操作后进入何种队列有了清晰的直观的追踪

11、,充分地展示内存分配过程。7、 源程序(加注释)见附页8、 实验体会与改进意见(1)实验体会1.本次实验主要是熟悉内存管理的相关概念及内存管理的各部分内容,并明确内存管理中所运用到的数据结构、控制机制的基本原理,代码实现了三种内存分配策略,分区的回收,代码实现了实验所需要的各种队列的部分基本操作,实现代码复用。2.通过编程自行模拟了操作系统的内存分配与回收,充分理解了分配表的重要作用,更深入了其中的逻辑过程,而且对自己的编程能力也有所提高。(2)改进意见1.由于一些其他原因,本实验中对碎片整合问题没有实现。现主要描述一下实现思路:可设置一个fragdisposal函数来处理碎片整合问题,设置一

12、个指针reoccupied,从占用队列(blanklist)中依次取出空闲块加入到reoccupied指针后,形成新的占用队列。对于空闲队列删除原有队列块,新的空闲队列只有一个空闲块,其地址为占用队列最后一个占用块的address+size。2.本实验中计算机生成的作业大小范围为200k500k,内存区大小为1024k,则会出现,则大部分可能出现内存区只能存放2到3个的作业,可以适当的调小作业大小范围或者调大内存大小,从而观察多个作业的内存管理、分配和回收的情况,更细致地对内存管理进行追踪。附页:实验三.cpp#include#include#include#define MAX_MEMARY

13、 1024#define MIN 100#define FREE 0#define BUSY 1/作业结构typedef struct JOB int name; /进程名 int size; /大小 struct JOB *next; /指针JOB;/分配结构typedef struct M_JOB int name; /进程名 int address; /地址 int size; /大小 int state; /状态 struct M_JOB *next; /指针M_JOB;int n;/JOB队列结构typedef struct Queue_JOB JOB *head; JOB *tai

14、l; int len;Queue;/作业队列Queue_JOB joblist;/M_JOB队列结构typedef struct Queue_M_JOB M_JOB *head; M_JOB *tail; int len;Queue_M_JOB;/占用、空闲队列Queue_M_JOB occupiedlist, blanklist;void MainMenu() system(cls); printf(t _ n); printf(t| |n); printf(t| MainMenu |n); printf(t| |n); printf(t| Use FF press1 |n); printf

15、(t| |n); printf(t| Use BF press2 |n); printf(t| |n); printf(t| Use WF press3 |n); printf(t| |n); printf(t| Exit press0 |n); printf(t| |n); printf(t|_|n);void SubMenu() system(cls); printf(t _ n); printf(t| |n); printf(t| SubMenu |n); printf(t| |n); printf(t| Create Job press1 |n); printf(t| |n); pri

16、ntf(t| Distribute Memory press2 |n); printf(t| |n); printf(t| End Job press3 |n); printf(t| |n); printf(t| Exit press0 |n); printf(t| |n); printf(t|_|n);/创建作业插入作业队列尾void CreateJob() JOB *p; p = new JOB(); p-name = +n; p-size = rand() % 300 + 200; p-next = NULL; if(joblist.head = NULL) joblist.head =

17、 p; joblist.tail = p; joblist.len+; else joblist.tail-next = p; joblist.tail = p; joblist.len+; /取出作业队列队首元素JOB *PopFromJobList() JOB *q; if(joblist.len = 0) printf(the job list is empty!n); else q = joblist.head; joblist.head = joblist.head-next; joblist.len-; return q;/打印作业队列void PrintJobList() JOB

18、 *p; p = joblist.head; printf(nt#job list:n); if(joblist.len = 0) printf(tjob list is empty!n); else printf(t-n); printf(t|namet|sizet|n); printf(t-n); while(p != NULL) printf(t|JOB%dt|%dkt|n, p-name, p-size); p = p-next; printf(t-n); /打印空闲表void PrintBlankList() M_JOB *p; p = blanklist.head-next; pr

19、intf(nt#blank list:n); if(blanklist.len = 0) printf(tblank list is empty!n); else printf(t-n); printf(t|namet|address|sizet|n); printf(t-n); while(p != NULL) printf(t|JOB%dt|%dt|%dkt|n, p-name, p-address, p-size); p = p-next; printf(t-n); /打印占用表void PrintOccupiedList() M_JOB *p; p = occupiedlist.hea

20、d-next; printf(nt#occupied list:n); if(occupiedlist.len = 0) printf(toccupied list is empty!n); else printf(t-n); printf(t|namet|address|sizet|n); printf(t-n); while(p != NULL) printf(t|JOB%dt|%dt|%dkt|n, p-name, p-address, p-size); p = p-next; printf(t-n); /初始化各队列void InitList() /初始空闲块 M_JOB *q = n

21、ew M_JOB(); q-name = 0; q-address = 0; q-size = MAX_MEMARY; q-state = FREE; q-next = NULL; /初始空闲块入空闲队列 blanklist.head = new M_JOB(); blanklist.head-next = q; blanklist.tail = q; blanklist.len+; /初始化占用队列 occupiedlist.head = new M_JOB(); occupiedlist.head-next = NULL; occupiedlist.tail = occupiedlist.

22、head; occupiedlist.len = 0;/加入到占用队列void AddToOccupiedList(M_JOB *point) M_JOB *q = occupiedlist.head-next, *s = occupiedlist.head; /如果空,加入到队首 if(q = NULL) occupiedlist.head-next = point; occupiedlist.len+; return; /按地址升序排列占用队列 while(q != NULL) if(point-address address) point-next = q; s-next = point

23、; occupiedlist.len+; break; s = q; q = q-next; /如果地址大于前面元素,则加入到队列尾 if(q = NULL) s-next = point; occupiedlist.len+; void InsertIntoBlankList(M_JOB *point, int i) M_JOB *q = blanklist.head-next, *s = blanklist.head; /如果空,加入到队首 if(q = NULL) blanklist.head-next = point; blanklist.len+; return; while(q !

24、= NULL) /首先适应算法插入空闲队列中 if(point-address address & i = 1) point-next = q; s-next = point; blanklist.len+; return; /最佳适应算法插入空闲队列中 else if(point-size size & i = 2) point-next = q; s-next = point; blanklist.len+; return; /最坏适应算法插入空闲队列中 else if(point-size q-size & i = 3) point-next = q; s-next = point; b

25、lanklist.len+; return; else s = q; q = q-next; /插入队尾 if(q = NULL) s-next = point; blanklist.len+; return; /按相应算法分配内存void Distribute(int i) M_JOB *q = blanklist.head-next, *s = blanklist.head; M_JOB *p = new M_JOB(); /空闲队列空,内存不足 if(q = NULL) printf(ntTip:not enough memory!n); return; /从作业队列中取出作业 JOB

26、*pjob = PopFromJobList(); while(q != NULL) if(q-size = pjob-size) /如果分配后剩余大小不足100k就全部分配给该作业 if(q-size - pjob-size next = q-next; blanklist.len-; q-name = pjob-name; q-state = BUSY; q-next = NULL; AddToOccupiedList(q); break; /否则进行切割 else p-name = pjob-name; p-address = q-address; p-size = pjob-size;

27、 p-state = BUSY; p-next = NULL; /占用的内存进占用表 AddToOccupiedList(p); q-name = 0; q-address = q-address + pjob-size; q-size = q-size - pjob-size; q-state = FREE; s-next = q-next; blanklist.len-; /剩下的空闲内存重新按算法插入空闲表 InsertIntoBlankList(q, i); break; s = q; q = q-next; /没有满足大小的空闲块则内存不足, /将取出的作业重新加入到作业队列队首 i

28、f(q = NULL) printf(ntTip:not enough memory!n); pjob-next = joblist.head; joblist.head = pjob; joblist.len+; /从占用队列中取出占用块M_JOB *PopFromOccupiedList(int id) M_JOB *q = occupiedlist.head-next, *s = occupiedlist.head; if(occupiedlist.len = 0) printf(ntTip:the occupied list is empty!n); return NULL; whil

29、e(q != NULL) if(q-name = id) s-next = q-next; q-name = 0; q-state = FREE; q-next = NULL; occupiedlist.len-; return q; s = q; q = q-next; if(q = NULL) printf(ntTip:can not find the job!n); return NULL;/空闲块合并M_JOB *Merge(M_JOB *point) M_JOB *q = blanklist.head-next, *s = blanklist.head; M_JOB *x, *y;

30、M_JOB *merged = new M_JOB(); /如果空闲表为空,无需合并直接返回point空闲快 if(q = NULL) return point; while(q != NULL) /指向可以合并的单元 if(point-address + point-size = q-address | q-address + q-size = point-address) /指向可合并单元 /邻下找邻上 if(point-address + point-size = q-address) x = q; s-next = q-next; q = q-next; blanklist.len-;

31、 if(q = NULL) point-name = 0; /point-address = point-address; point-size = x-size + point-size; point-state = FREE; point-next = NULL; return point; else while(q != NULL) /查找是否邻上 if(q-address + q-size = point-address) y = q; s-next = q-next; blanklist.len-; point-name = 0; point-address = y-address;

32、 point-size = x-size + y-size + point-size; point-state = FREE; point-next = NULL; delete x; delete y; return point; s = q; q = q-next; /没有邻上则合并两个空闲块 if(q = NULL) point-name = 0; /point-address = point-address; point-size = x-size + point-size; point-state = FREE; point-next = NULL; return point; /邻

33、上找邻下 if(q-address + q-size = point-address) x = q; s-next = q-next; q = q-next; blanklist.len-; if(q = NULL) point-name = 0; point-address = x-address; point-size = x-size + point-size; point-state = FREE; point-next = NULL; return point; else while(q != NULL) /查找是否邻下 if(point-address + point-size =

34、 q-address) y = q; s-next = q-next; blanklist.len-; merged-name = 0; merged-address = x-address; merged-size = x-size + y-size + point-size; merged-state = FREE; merged-next = NULL; delete x; delete y; delete point; return merged; s = q; q = q-next; /没有邻下则合并两个空闲块 if(q = NULL) point-name = 0; point-a

35、ddress = x-address; point-size = x-size + point-size; point-state = FREE; point-next = NULL; return point; else s = q; q = q-next; return point;void EndJob(int i) printf(ntinput the number:); int id; M_JOB *pop, *merged; scanf(%d,&id); pop = PopFromOccupiedList(id); if(pop != NULL) merged = Merge(po

36、p); InsertIntoBlankList(merged, i); /首先适应算法void FF() int m; SubMenu(); printf(ntYour select:); while(scanf(%d, &m) != EOF) printf(t_n); if(m = 1) CreateJob(); else if(m = 2) Distribute(1); else if(m = 3) EndJob(1); else if(m = 0) break; else printf(tyour input is error, please input the correct numb

37、er!n); printf(ntYour select:); continue; PrintJobList(); PrintOccupiedList(); PrintBlankList(); printf(ntYour select:); /最佳适应算法void BF() int m; SubMenu(); printf(ntYour select:); while(scanf(%d, &m) != EOF) printf(t_n); if(m = 1) CreateJob(); else if(m = 2) Distribute(2); else if(m = 3) EndJob(2); e

38、lse if(m = 0) break; else printf(tyour input is error, please input the correct number!n); printf(ntYour select:); continue; PrintJobList(); PrintOccupiedList(); PrintBlankList(); printf(ntYour select:); /最坏适应算法void WF() int m; SubMenu(); printf(ntYour select:); while(scanf(%d, &m) != EOF) printf(t_

39、n); if(m = 1) CreateJob(); else if(m = 2) Distribute(3); else if(m = 3) EndJob(3); else if(m = 0) break; else printf(tyour input is error, please input the correct number!n); printf(ntYour select:); continue; PrintJobList(); PrintOccupiedList(); PrintBlankList(); printf(ntYour select:); /主函数int main() srand(unsigned)time(NULL); InitList(); int num; MainMenu(); printf(ntYour select:); while(scanf(%d, &num) != EOF) if(num = 1) FF(); else if(num = 2) BF(); else if(num = 3) WF(); else if(num = 0)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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