《2022年操作系统大型实验报告 2》由会员分享,可在线阅读,更多相关《2022年操作系统大型实验报告 2(7页珍藏版)》请在金锄头文库上搜索。
1、操作系统大型实验报告姓名林丹学号200626410112 班级软件工程2+3(061) 得分一、实验目的:了解动态分区分配方式中使用的数据结构,熟悉最优分配算法,并进一步加深对动态扮区存储管理方式包括理解分配内存资源及回收资源及其实现过程的理解。二、实验环境:Win2000/WinXP VC+6.0 三、实验内容:(1)用C+ 语言分别实现采用最佳适应算法的动态分区分配过程excellent() 和回收过程 mfree() 。(2) 假设初试状态下,可用的内存空间为1024KB, 并初始化空闲区和已分配区(3) 每次分配和回收后显示空闲内存分区链情况(共有多个空闲分区,每个空闲分区的大小分别为
2、多大,以及空闲标记) 。(4) 回收内存时若存在连续的空闲结点则合并,处理释放内存产生的碎片。四实验代码及分析解释程序主要以数组形式实现,相关函数如下:1void initial() 初始化空间段(空闲区和已分配区),大小可自定。2void excellent() 采用最优算法分配内存, 。3void print() 输出已经分配和空闲资源情况。4void mfree() 回收内存,若存在连续的空闲结点则合并5void main() Main 主函数,实现整个过程;包括选择对作业的操作类型,选0 退出程序,选1 进行内存分配,选2 撤消某作业并回收资源选 3 输出已经分配和空闲资源情况。源程序
3、:#include #include #include /getch() #include #include #include const int MAXJOB=20; /定义最大作业数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - typedef struct node /结构体int start; int length; char tag20; job; job freesMAXJOB;/定义空闲区表int free_qua
4、ntity; job occupysMAXJOB;/定义已分配区表int occupy_quantity; /初始化函数void initial() int i; for(i=0;iMAXJOB;i+) freesi.start=0; freesi.length=1024; strcpy(freesi.tag,free); / 标识空闲区 free occupysi.start=0; occupysi.length=0; strcpy(occupysi.tag,); / 标识已分配区 free_quantity+; /occupy_quantity=0; /显示void print() int
5、 i; coutendl-endl; cout 当前空闲表 :endl; cout 起始地址长度状态 endl; for(i=0;ifree_quantity;i+) cout.setf(2); cout.width(12); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - coutfreesi.start; cout.width(10); coutfreesi.length; cout.width(8); coutfreesi
6、.tagendl; coutendl-endl; cout 当前已分配表 :endl; cout 起始地址长度作业名 endl; for(i=0;ioccupy_quantity;i+) cout.setf(2); cout.width(12); coutoccupysi.start; cout.width(10); coutoccupysi.length; cout.width(8); coutoccupysi.tagendl; void excellent() / 分配内存,给定作业采用最佳分配算法分配xk 大小的空间 (OPT) char job_name20; int job_leng
7、th; int i,flag; coutjob_namejob_length; flag=0; / 标记申请空间是否成功,0成功 ,1失败for(i=0;i=job_length) / 如果要申请的内存空间小于当前空闲区大小,则标记 flag=1 表示申请空间成功flag=1; if(flag=0)/ 标记是否满足申请要求 coutendl 对不起 ,当前没有能满足你申请长度的空闲内存,请稍候再试 endl; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7
8、页 - - - - - - - - - i-; for(int j=0;j=job_length)&(freesj.lengthjob_length)/空闲区大于要分配的空间大小 freesi.start+=job_length; / 修改空闲区的起始地址、长度freesi.length-=job_length; else /相等 for(j=i;jfree_quantity-1;j+) freesj=freesj+1; free_quantity-; cout 恭喜你 !内存空间成功:)endlendl; /撤消作业void mfree() char job_name20; int i,j,
9、flag,p=0; int start; int length; coutjob_name; flag=-1; / 标识是否存在要撤消的作业名,-1表示没有for(i=0;ioccupy_quantity;i+) if(!strcmp(occupysi.tag,job_name)/找到要撤消的作业(匹配 ) flag=i; / 找到匹配作业的下标start=occupysi.start; length=occupysi.length; if(flag=-1) cout 没有这个作业名endl; else / 找到作业名 ; /加入空闲表for(i=0;ifree_quantity;i+) if
10、(freesi.start+freesi.length)=start) / 寻找回收分区,上邻空闲区,下邻空闲区,三项合并 (0 1 0) if(i+1)free_quantity)&(freesi+1.start=start+length) freesi.length=freesi.length+freesi+1.length+length; for(j=i+1;jfree_quantity;j+) freesj=freesj+1; free_quantity-; p=1; else /上邻空闲区,下邻非空闲区,与上邻合并(0 1 1) freesi.length+=length; p=1;
11、 if(freesi.start=(start+length) / 上邻非空闲区, 下邻为空闲区, 与下邻合并 (1 1 0) or 1 0 1 freesi.start=start; freesi.length+=length; p=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - if(p=0) freesfree_quantity.start=start; freesfree_quantity.length=lengt
12、h; free_quantity+; /删除分配表中的该作业for(i=flag;ioccupy_quantity;i+) occupysi=occupysi+1; occupy_quantity-; void main() int flag=0; int t=1; int chioce=0; initial(); while(1) cout=endl; cout= 存储管理模拟系统=endl; cout=endl; cout= 1.申请空间 (最优适配法 ) =endl; cout= 2.撤消作业=endl; cout= 3.显示空闲表和分配表=endl; cout= 0.退出=endl;
13、cout=endl; coutchioce; switch(chioce) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - case 1: excellent(); /采用最优算法分配内存break; case 2: mfree(); /释放作业占有的内存break; case 3: print(); /显示内存分配情况break; case 0: exit(0); default: cout 你选择的操作有误,请重输!endl
14、; 五实验问题思考:(1)采用最佳适应算法,对内存的分配和回收速度有什么不同的影响?采用最佳适应算法,找到要分配的内存适合的最小的空闲区进行分配,在分配过程中,不需要寻找其他适合的空间给予分配,提高了分配及回收的速度。但在进行分配时,必须对整个空闲区间进行遍历,以找到适合的最小空间以分配,但这并不妨碍之后的合适空间的分配。(2)如何解决因碎片而造成内存分配速度降低的问题?程序中模拟作业回收,内存回收的时候上下邻合并,合理处理回收过程中产生的碎片,以作内存再分配,提高内存分配的速度,减少内存分配采用最佳适应算法时产生速度慢的问题。六实验总结在一般的操作系统中,进程量都不是很大,于是添加新作业及回收资源的时候都是遍历整个数组进行操作,这样也使算法易于实现. 采用最优分配算法, 寻找要适合分配的内存大小的最小块,提高内存的分配及回收速度。通过本次实验,我对操作系统的内存管理方法有了进一步的理解,熟悉了最优分配算法的,加深对操作系统存储管理机制的理解。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -