内存管理实验

上传人:hy****d 文档编号:243306791 上传时间:2024-09-20 格式:PPT 页数:22 大小:93.50KB
返回 下载 相关 举报
内存管理实验_第1页
第1页 / 共22页
内存管理实验_第2页
第2页 / 共22页
内存管理实验_第3页
第3页 / 共22页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,操作系统,内存管理,1,1.,功能介绍,1 - Set memory size (default=1024),2 - Select memory allocation algorithm,3 - New process,4 - Terminate a process,5 - Display memory usage,0 - Exit,2,2.,主要数据结构,-1,内存空闲分区的描述,/*,描述每一个空闲块的数据结构*,/,struct free_block_type,int size;,int start_addr;,struct free_block_type *next;,;,/*,指向内存中空闲块链表的首指针*,/,struct free_block_type *free_block;,3,2.,主要数据结构,- 2,描述已分配的内存块,/*,每个进程分配到的内存块的描述*,/,struct allocated_block,int pid; int size;,int start_addr;,char process_namePROCESS_NAME_LEN;,struct allocated_block *next;,;,/*,进程分配内存块链表的首指针*,/,struct allocated_block *allocated_block_head = NULL;,4,2.,主要数据结构, 3,常量定义,#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,int mem_size=DEFAULT_MEM_SIZE;,/*,内存大小*,/,int ma_algorithm = MA_FF;,/*,当前分配算法*,/,static int pid = 0;,/*,初始,pid*/,int flag = 0,;,/*,设置内存大小标志*,/,5,3.,主要模块介绍,6,main(),函数,main(),char choice; pid=0;,free_block = init_free_block(mem_size);,/,初始化空闲区,while(1) ,display_menu();,/,显示菜单,fflush(stdin);,choice=getchar();,/,获取用户输入,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; ,7,init_free_block(int mem_size);,/*,初始化空闲块,默认为一块,可以指定大小及起始地址*,/,struct free_block_type* init_free_block(int mem_size),struct free_block_type *fb;,fb=(struct free_block_type *)malloc(sizeof(struct free_block_type);,if(fb=NULL),printf(No memn);,return NULL;,fb-size = mem_size;,fb-start_addr = DEFAULT_MEM_START;,fb-next = NULL;,return fb;,8,display_menu(),/*,显示菜单*,/,display_menu(),printf(n);,printf(1 - Set memory size (default=%d)n, DEFAULT_MEM_SIZE);,printf(2 - Select memory allocation algorithmn);,printf(3 - New process n);,printf(4 - Terminate a process n);,printf(5 - Display memory usage n);,printf(0 - Exitn);,9,set_mem_size();,/*,设置内存的大小*,/,set_mem_size(),int size;,if(flag!=0),/,防止重复设置,printf(Cannot set memory size againn);,return 0;,printf(Total memory size =);,scanf(%d, ,if(size0) ,mem_size = size;,free_block-size = mem_size;,flag=1; return 1;,10,set_algorithm(),/*,设置当前的分配算法 *,/,set_algorithm(),int algorithm;,printf(t1 - First Fitn);,printf(t2 - Best Fit n);,printf(t3 - Worst Fit n);,scanf(%d, ,if(algorithm=1 & algorithm next = NULL;,pid+;,sprintf(ab-process_name, PROCESS-%02d, pid);,ab-pid = pid;,printf(Memory for %s:, ab-process_name);,scanf(%d, ,if(size0) ab-size=size;,ret = allocate_mem(ab);,/*,从空闲区分配内存,,ret=1,表示分配,ok*/,14,new_process() - cont.,/*,如果此时,allocated_block_head,尚未赋值,则赋值*,/,if(ret=1) &(allocated_block_head = NULL),allocated_block_head=ab;,return 1; ,/*,分配成功,将该已分配块的描述插入已分配链表*,/,else if (ret=1) ,ab-next=allocated_block_head;,allocated_block_head=ab;,return 2; ,else if(ret=-1),/*,分配不成功*,/,printf(Allocation failn);,free(ab);,return -1;,return 3;,15,int allocate_mem,(struct allocated_block *ab),/*,分配内存模块*,/,int allocate_mem(struct allocated_block *ab),struct free_block_type *fbt, *pre;,int request_size=ab-size;,fbt = pre = free_block;,/,根据当前算法在空闲分区链表中搜索合适空闲分区进行分配,分配时注意以下情况:,/ 1.,找到可满足空闲分区且分配后剩余空间足够大,则分割,/ 2.,找到可满足空闲分区且但分配后剩余空间比较小,则一起分配,/ 3.,找不可满足需要的空闲分区但空闲分区之和能满足需要,则采用内存紧缩技术,进行空闲分区的合并,然后再分配,/ 4.,在成功分配内存后,应保持空闲分区按照相应算法有序,/ 5.,分配成功则返回,1,,否则返回,-1,请自行补充。,16,kill_process(),/*,删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*,/,kill_process(),struct allocated_block *ab;,int pid;,printf(Kill Process, pid=);,scanf(%d, ,ab=find_process(pid);,if(ab!=NULL),free_mem(ab);,/*,释放,ab,所表示的分配区*,/,dispose(ab);,/*,释放,ab,数据结构节点*,/,17,int free_mem (struct allocated_block *ab),/*,将,ab,所表示的已分配区归还,并进行可能的合并*,/,int free_mem(struct allocated_block *ab),int algorithm = ma_algorithm;,struct free_block_type *fbt, *pre, *work;,fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type);,if(!fbt) return -1;,/,进行可能的合并,基本策略如下,/ 1.,将新释放的结点插入到空闲分区队列末尾,/ 2.,对空闲链表按照地址有序排列,/ 3.,检查并合并相邻的空闲分区,/ 4.,将空闲链表重新按照当前算法排序,请自行补充,return 1;,18,i,nt,dispose,(struct allocated_block *free_ab),/*,释放,ab,数据结构节点*,/,int dispose(struct allocated_block *free_ab),struct allocated_block *pre, *ab;,if(free_ab = allocated_block_head) /*,如果要释放第一个节点*,/,allocated_block_head = allocated_block_head-next;,free(free_ab);,return 1;,pre = allocated_block_head;,ab = allocated_block_head-next;,while(ab!=free_ab) pre = ab; ab = ab-next; ,pre-next = ab-next;,free(ab);,return 2;,19,display_mem_usage(),/*,显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 *,/,display_mem_usage(),struct free_block_type *fbt=free_block;,struct allocated_block *ab=allocated_block_head;,if(fbt=NULL) return(-1);,printf(-n);,/*,显示空闲区 *,/,printf(Free Memory:n);,printf(%20s %20sn, start_addr, size);,while(fbt!=NULL),printf(%20d %20dn, fbt-start_addr, fbt-size);,fbt=fbt-next;,20,display_mem_usage,() -cont,/*,显示已分配区 *,/,printf(nUsed Memory:n);,printf(%10s %20s %10s %10sn, PID, 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;,printf(-n);,return 0;,21,4.,实验要求,掌握内存分配,FF,,,BF,,,WF,策略及实现的思路;,掌握内存回收过程及实现思路;,参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。,22,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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