ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:1.92MB ,
资源ID:12771390      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-12771390.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统内存分配与回收实验报告.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

操作系统内存分配与回收实验报告.docx

1、操作系统内存分配与回收实验报告 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称: 内存分配与回收 专业名称: 计算机科学与技术班 级: 计科1503 * *学号(8位): * *实验日期: 2016年5月23日-2016年6月6日一. 实验目的及实验环境1.实验目的掌握内存分配FF,BF,WF策略及实现的思路;掌握内存回收过程及实现思路;实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。2.实验环境 (1)硬件 CPU:I7-6500 内存:8G 显示器:笔记本显示器 硬盘空间:1TB (2)软件 虚拟机名称及版本:Vmware 操作系统名

2、称及版本:Ubuntu Kylin 16.04 编译器:gcc二. 实验内容1、实验前准备工作阅读参考资料,掌握操作系统内存管理的过程,并熟悉FF,BF,WF内存分配策略以及内存回收策略。2、实验内容 根据下发ppt内容,内存分配与回收程序要求完成如下功能,具体详细设计要求见ppt。1 -Set memory size (default=1024)/设置内存大小2 - Select memory allocation algorithm/选择内存分配算法FF、BF、WF3 - New process/创建新进程,分配内存4 - Terminate a process/终止进程,回收内存5 -

3、Display memory usage/显示内存当前使用情况0 Exit/程序退出三方案设计 1功能模块图及解释2核心数据结构及解释struct free_block_type /空闲块 int size; int start_addr; struct free_block_type *next;struct allocated_block /已分配的内存块 int pid; int size; int start_addr; char process_namePROCESS_NAME_LEN; struct allocated_block *next;;1.Set memory size

4、(default=1024):这个模块是用来设置内存大小的,从键盘获取一个数字,并将它赋值给内存大小;若没有设置,则默认内存的大小为1024。2.Set_algorithm:这个模块是用来设置分配算法的,共有三种算法:首次循环适配算法、最好适配算法、最差适配算法。从键盘输入一种算法前的序号,根据算法点用不同的函数对内存进行分配;3.New_process:此模块是用来创建进程的。从键盘输入进程号,调用fork()创建进程并为其分配一定大小的内存,若分配成功,则将其连接到已分配链表中,否则分配失败;4.Kill_process:此模块是用来杀死进程的。从键盘输入一个进程号,先调用find_pro

5、cess()函数进行查找,若找到,则调用kill()函数将其杀死并释放内存空间。5.Display_mem_usage:此模块是用来显示内存的使用情况的。将每个进程的内存使用情况显示出来,包括起始地址和内存大小;6.Do_exit:这个模块是用来结束程序的,直接调用exit()实现。3主要算法流程图及解释算法调用图 四测试数据及运行结果1正常测试数据(3组)及运行结果;2非正常测试数据(2组)及运行结果。五总结1实验过程中遇到的问题及解决办法; 实验过程中不会实现最佳适应算法,然后通过网上查阅别人的算法,自己研究,解决了这个问题。2对设计及调试过程的心得体会。这次实验让我充分了解了内存管理的机

6、制,进一步加深了对计算机的了解,对于以后系统的研究学习计算机起到了至关重要的作用。六附录:源代码(电子版)#include #include #include /*常量定义*/#define PROCESS_NAME_LEN 32 /*进程名长度*/#define MIN_SLICE 10 /*最小碎片的大小*/#define DEFAULT_MEM_SIZE 1024 /*内存大小*/#define DEFAULT_MEM_START 0 /*起始位置*/* 内存分配算法 */#define MA_FF 1#define MA_BF 2#define MA_WF 3/*描述每一个空闲块的数据

7、结构*/struct free_block_type int size; int start_addr; struct free_block_type *next;/*每个进程分配到的内存块的描述*/struct allocated_block int pid; int size; int start_addr; char process_namePROCESS_NAME_LEN; struct allocated_block *next;/*指向内存中空闲块链表的首指针*/struct free_block_type *free_block;/*进程分配内存块链表的首指针*/struct a

8、llocated_block *allocated_block_head = NULL;int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/int ma_algorithm = MA_FF; /*当前分配算法*/static int pid = 0; /*初始pid*/int flag = 0; /*设置内存大小标志,防止重复设置*/void display_menu();void do_exit();struct free_block_type *init_free_block(int mem_size);void set_mem_size();void set_a

9、lgorithm();void new_process();void kill_process();void display_mem_usage();void rearrange(int choice);void abc();void rearrage_BF();void rearrage_WF();main() char choice; pid=0; free_block = init_free_block(mem_size); /初始化空闲区 display_menu(); while(1) printf(Please choice: ); fflush(stdin); choice=ge

10、tchar(); /获取用户输入 switch(choice) case 1: set_mem_size(); /设置内存大小break; case 2: set_algorithm();/设置算法flag=1;break; case 3: new_process();/创建新进程flag=1; break; case 4: kill_process();/删除进程flag=1; break; case 5: display_mem_usage();/显示内存使用flag=1; break; case 0:do_exit();/释放链表并退出exit(0); default: break; c

11、hoice=getchar(); /紧缩处理void free_memory_rearrage(int memory_reduce_size,int allocated_size) struct free_block_type *p1,*p2; struct allocated_block *a1,*a2; if(memory_reduce_size!=0) /分配完还有小块空间 p1=free_block; p2=p1-next; p1-start_addr=0; p1-size=memory_reduce_size; p1-next=NULL; mem_size=memory_reduce

12、_size; / else p2=free_block; free_block=NULL; mem_size=0; while(p2!=NULL)/释放节点 p1=p2; p2=p2-next; free(p1); /allocated_block 重新修改链接 a1=(struct allocated_block *)malloc(sizeof(struct allocated_block); a1-pid=pid; a1-size=allocated_size; a1-start_addr=memory_reduce_size; /已申请的开始地址,从memory_reduce_size开

13、始 sprintf(a1-process_name, PROCESS-%02d, pid); a1-next=allocated_block_head; a2=allocated_block_head; allocated_block_head=a1; while(a2!=NULL) a2-start_addr=a1-start_addr+a1-size; a1=a2; a2=a2-next; int allocate_mem(struct allocated_block *ab) struct free_block_type *fbt, *pre; int request_size=ab-s

14、ize; /int memory_count;/计算剩余分区总内存大小 fbt = pre = free_block; while(pre!=NULL)&(request_sizepre-size)/遍历查找匹配空白区 /memory_count+=pre-size; fbt=pre; pre=pre-next; if(!pre) /pre=pre-next结尾 if(mem_size=request_size)/*memory_count*/ if(mem_size=request_size+MIN_SLICE) free_memory_rearrage(mem_size-request_s

15、ize,request_size); /采用紧缩技术 else free_memory_rearrage(0,mem_size); /采用紧缩技术,空间全部分配 return 0;/全部重定位,不返回上级 else return -1;/分配失败! else /内存能满足 request_sizesize if(pre-size-request_size)MIN_SLICE)/找到可满足空闲分区且分配后剩余空间足够大,则分割 pre-size=pre-size-request_size; ab-start_addr=pre-start_addr+pre-size; else/找到可满足空闲分区

16、且但分配后剩余空间比较小,则一起分配,删除该节点 if(pre=fbt) fbt=pre-next; free_block=fbt; else fbt-next=pre-next; ab-start_addr=pre-start_addr; ab-size=pre-size; free(pre);/释放节点 mem_size-=ab-size;/. rearrange(ma_algorithm);/分配成功,按照相应算法排序 return 1;void new_process() struct allocated_block *ab; int size; int ret;/*ret=1表示从空

17、闲分区分配空间成功*/ if(mem_size=0) printf(内存全部分配!无法创建新进程,请先释放其他进程!n); return; ab=(struct allocated_block *)malloc(sizeof(struct allocated_block); if(ab=NULL) printf(No Mem!n); exit(1); ab-next=NULL; pid+; sprintf(ab-process_name,PROCESS-%02d,pid);/字符串格式化 ab-pid=pid; while(1) printf(Please input the memory f

18、or %s(0-%d):,ab-process_name,mem_size); scanf(%d,&size); if(size0) ab-size=size; break; printf(Please input again!n); ret=allocate_mem(ab);/从空闲内存分配空间 /*如果此时allocated_block_head尚未赋值,则赋值*/ if(ret=1) &(allocated_block_head = NULL) allocated_block_head=ab; else if(ret=1) /*分配成功,将该已分配块的描述插入已分配链表(头插)*/ ab

19、-next=allocated_block_head; allocated_block_head=ab; else if(ret=-1)/*分配不成功*/ printf(Allocation failn); free(ab); return; printf(Allocation Success!n);struct allocated_block *find_process(int pid) struct allocated_block *p; p=allocated_block_head; while(p) if(p-pid=pid) return p; p=p-next; return p;

20、/*释放ab所表示的分配区*/int free_mem(struct allocated_block *ab) int algorithm = ma_algorithm; struct free_block_type *fbt,*pre,*work; mem_size+=ab-size; fbt=(struct free_block_type *)malloc(sizeof(struct free_block_type); if(!fbt) return -1; fbt-size = ab-size; fbt-start_addr=ab-start_addr; fbt-next=NULL; r

21、earrange(MA_FF); pre=NULL; work=free_block; /查找插入位置 while(work!=NULL)&(fbt-start_addrwork-start_addr) pre=work; work=work-next; if(!pre)/插入开始位置 if (!work) free_block=fbt; / else fbt-next=work; free_block=fbt; if(fbt-start_addr+fbt-size=work-start_addr)/2) fbt-next=work-next; fbt-size=fbt-size+work-s

22、ize; free(work); else if(!work) pre-next=fbt; if(fbt-start_addr=pre-start_addr+pre-size)/1) pre-next=work; pre-size=fbt-size+pre-size; free(fbt); else fbt-next=work; pre-next=fbt; / 检查并合并相邻的空闲分区 if(fbt-start_addr= pre-start_addr+pre-size)&(fbt-start_addr+fbt-size = work-start_addr)/3) pre-next=work-

23、next; pre-size=pre-size+fbt-size+work-size; free(fbt); free(work); else if(fbt-start_addr= pre-start_addr+pre-size)/1) pre-next=work; pre-size=pre-size+fbt-size; free(fbt); else if(work-start_addr=fbt-start_addr+fbt-size)/2 fbt-next=work-next; fbt-size=work-size+fbt-size; free(work); / 将空闲链表重新按照当前算法

24、排序 rearrange(ma_algorithm); return 1;/*释放ab数据结构节点*/void dispose(struct allocated_block *free_ab) struct allocated_block *pre,*ab; if(free_ab=allocated_block_head)/*如果要释放第一个节点*/ allocated_block_head=free_ab-next; free(free_ab); return ; pre=allocated_block_head; ab=allocated_block_head-next; while(ab

25、!=free_ab) pre=ab; ab=ab-next; pre-next=ab-next; free(ab);void kill_process() struct allocated_block *ab; int pid; printf(Kill process,input pid = ); scanf(%d,&pid); ab=find_process(pid); if(ab!=NULL) free_mem(ab);/*释放ab所表示的分配区*/ dispose(ab);/*释放ab数据结构节点*/ printf(Kill Process Success!n); return; pri

26、ntf(Kill Process Failure!n);/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */void display_mem_usage() struct free_block_type *fbt=free_block; struct allocated_block *ab=allocated_block_head; /* 显示空闲区 */ printf(-n); if(fbt=NULL) printf(内存全部分配!n); else printf(Free Memory:n); printf(%20s %20sn, tstart_addr, size); wh

27、ile(fbt!=NULL) printf(%20d %20dn, fbt-start_addr, fbt-size); fbt=fbt-next; printf(-n); /* 显示已分配区 */ if(ab=NULL) printf(尚未开始分配!n); else printf(nUsed Memory:n); printf(%10s %20s %10s %10sn, tPID, ProcessName, start_addr , size); while(ab!=NULL) printf(%10d %20s %10d %10dn, ab-pid, ab-process_name, ab-start_addr, ab-size); ab=ab-next; pr

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2