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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

模拟内存管理 最终.docx

1、模拟内存管理 最终理学院 模拟内存管理 实验报告年级 二 学号 2012518074 姓名 刘丹 成绩_专业 信息与计算科学 实验地点 理学院四楼机房 指导教师 姚斌 实验项目 用C语言实现模拟内存管理 实验日期2014年4月5月 一、实验目的1、通过本次试验体会操作系统中内存的分配模式;2、掌握内存分配的方法;3、学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;4、学会进行内存的申请释放和管理;二、实验问题描述用C+编程 模拟内存管理三、实验步骤功能(函数)设计:通过在C+上编程实现当一个进程被终止时内存的处理及内存的申请释放和管理。四、

2、实验结果(程序)及分析1、实验主要代码#include#include#include#define PROCESS_NAME_LEN 32 /进程名字长度 http:/yige.org/#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 /最坏适应算法/空闲分区的结构体typedef struct free_block_t

3、ype int size; int start_addr; struct free_block_type *next;free_block_type;free_block_type *free_block;/已分配分区的结构体typedef struct allocated_block int pid; int size; int start_addr; char process_namePROCESS_NAME_LEN; struct allocated_block *next; allocated_block;struct allocated_block *allocated_block_

4、head = NULL;int mem_size=DEFAULT_MEM_SIZE;int ma_algorithm = MA_FF;static int pid = 0;int flag = 0;/函数声明void display_menu();int set_mem_size();void set_algorithm();void rearrange(int algorithm);int new_process();int allocate_mem (struct allocated_block *ab);void kill_process();int free_mem (struct a

5、llocated_block *ab);int dispose (struct allocated_block *free_ab);int display_mem_usage();allocated_block * find_process(int pid);void rearrange_FF();void rearrange_BF();void rearrange_WF(); /初始化空闲分区free_block_type* init_free_block(int mem_size) free_block_type *fb; fb=(free_block_type *)malloc(size

6、of(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; /显示主菜单 void display_menu() printf(n); printf(4 - Terminate a process n); printf(5 - Display memory usage n); printf(0 - Exitn); /*设置内存大小*/ int set_mem_size

7、() int size; if(flag!=0) /*flag标志防止内存被再次设置*/ printf(Cannot set memory size againn); return 0; printf(Total memory size =); scanf(%d, &size); if(size0) mem_size = size; free_block-size = mem_size;/*设置初始大小为 1024*/ flag=1; return 1; /*选择当前算法*/ void set_algorithm() int algorithm; printf(t1 - First Fitn)

8、; printf(t2 - Best Fit n); printf(t3 - Worst Fit n); printf(Please input your choice : ); scanf(%d, &algorithm); if(algorithm=1 & algorithm start_addr; while(temp-next!=NULL) if(temp-next-start_addrnext-start_addr; p=temp; temp=temp-next; if(p!=NULL) temp=p-next; p-next=p-next-next; temp-next=free_b

9、lock; free_block=temp; head=free_block; p=head; temp=head-next; while(head-next!=NULL) current_min_addr=head-next-start_addr; while(temp-next!=NULL) if(temp-next-start_addrnext-start_addr; p=temp; temp=temp-next; if(p-next!=head-next) temp=p-next; p-next=p-next-next; temp-next=head-next; head-next=t

10、emp; head=head-next; temp=head-next; p=head; return ; /*最佳适应算法,按内存块的大小由小到大排序*/ void rearrange_BF() free_block_type *temp,*p=NULL; free_block_type *head=NULL; int current_min_size=free_block-size; temp=free_block; while(temp-next!=NULL) if(temp-next-sizenext-size; p=temp; temp=temp-next; if(p!=NULL)

11、temp=p-next; p-next=p-next-next; temp-next=free_block; free_block=temp; head=free_block; p=head; temp=head-next; while(head-next!=NULL) current_min_size=head-next-size; while(temp-next!=NULL) if(temp-next-sizenext-size; p=temp; temp=temp-next; if(p-next!=head-next) temp=p; p-next=p-next-next; temp-n

12、ext=head-next; head-next=temp; head=head-next; temp=head-next; p=head; /*最坏适应算法,按地址块的大小从大到小排序*/ void rearrange_WF() free_block_type *temp,*p=NULL; free_block_type *head=NULL; int current_max_size=free_block-size; temp=free_block; while(temp-next!=NULL) if(temp-next-sizecurrent_max_size) current_max_

13、size=temp-next-size; p=temp; temp=temp-next; if(p!=NULL) temp=p; p-next=p-next-next; temp-next=free_block; free_block=temp; head=free_block; p=head; temp=head-next; while(head-next!=NULL) current_max_size=head-next-size; while(temp-next!=NULL) if(temp-next-sizecurrent_max_size) current_max_size=temp

14、-next-size; p=temp; temp=temp-next; if(p-next!=head-next) temp=p-next; p-next=p-next-next; temp-next=head-next; head-next=temp; head=head-next; temp=head-next; p=head; return ; /创建一个新的进程 int new_process() struct allocated_block *ab; int size; int ret; ab=(struct allocated_block *)malloc(sizeof(struc

15、t allocated_block); if(!ab) exit(-5); ab-next = NULL; pid+; sprintf(ab-process_name, PROCESS-%02d, pid); ab-pid = pid; printf(Memory for %s:, ab-process_name); printf(Please input you want to allocate process size : ); scanf(%d, &size); if(size0) ab-size=size; ret = allocate_mem(ab); if(ret=1) &(all

16、ocated_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); pid-; free(ab); return -1; return 3; /内存分配 int allocate_mem(struct allocated_block *ab) free_block_type *fbt, *pre;

17、free_block_type *temp,*p,*p1; allocated_block *q; int request_size=ab-size; int sum=0; int max; fbt = pre = free_block; if(fbt) if(ma_algorithm=MA_WF) if(fbt=NULL|fbt-sizesizenext; if(fbt=NULL|fbt-sizenext!=NULL) sum=free_block-size; temp=free_block-next; while(temp!=NULL) sum+=temp-size; if(sum=req

18、uest_size) break; temp=temp-next; if(temp=NULL) return -1; else pre=free_block; max=free_block-start_addr; fbt=free_block; while(temp-next!=pre) if(maxstart_addr) max=pre-start_addr; fbt=pre; pre=pre-next; pre=free_block; while(pre!=temp-next) q=allocated_block_head; p=free_block; while(q!=NULL) if(

19、q-start_addrpre-start_addr) q-start_addr=q-start_addr-pre-size; q=q-next; while(p!=NULL) if(p-start_addrpre-start_addr) p-start_addr=p-start_addr-pre-size; p=p-next; pre=pre-next; pre=free_block; while(pre!=temp-next) p1=pre-next; if(pre=fbt) break; free(pre); pre=p1; q=allocated_block_head; free_bl

20、ock=fbt; free_block-start_addr=q-start_addr+q-size; free_block-size=sum; free_block-next=temp-next; if(free_block-size-request_sizesize=free_block-size; ab-start_addr=free_block-start_addr; pre=free_block; free_block=free_block-next; free(pre); else ab-start_addr=free_block-start_addr; free_block-st

21、art_addr=free_block-start_addr+request_size; free_block-size=free_block-size-request_size; else return -1; else if(fbt-size-request_sizesize=fbt-size; ab-start_addr=fbt-start_addr; if(pre-next=free_block) free_block=fbt-next; else pre-next=fbt-next; free_block=fbt-next; free(fbt); else ab-start_addr

22、=fbt-start_addr; fbt-start_addr=fbt-start_addr+request_size; fbt-size=fbt-size-request_size; rearrange(ma_algorithm); return 1; else printf(Free Memory already has been allocated over: ); return -1; /选择杀死一个进程 void kill_process() struct allocated_block *ab; int pid; printf(Kill Process, pid=); scanf(

23、%d, &pid); ab=find_process(pid); if(ab!=NULL) free_mem(ab); dispose(ab); /找到要杀死的进程的标号 allocated_block * find_process(int pid) allocated_block *abb; abb=allocated_block_head; if(abb-pid=pid) return abb; abb=allocated_block_head-next; while(abb-next!=NULL) if(abb-pid=pid) return abb; abb=abb-next; ret

24、urn abb; /释放杀死进程的内存块 int free_mem(struct allocated_block *ab) int algorithm = ma_algorithm; struct free_block_type *fbt, *pre; fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type); pre=(struct free_block_type*) malloc(sizeof(struct free_block_type); if(!fbt) return -1; fbt-start_addr=

25、ab-start_addr; fbt-size=ab-size; fbt-next=free_block; free_block=fbt; rearrange_FF(); pre-next=free_block; pre-size=0; while(pre-next&(pre-next-start_addr!=fbt-start_addr) pre=pre-next; if(pre-size!=0&fbt-next!=NULL) if(pre-start_addr+pre-size)=fbt-start_addr)&(fbt-start_addr+fbt-size)=fbt-next-start_addr) pre-size=pre-size+fbt-size+fbt-next-size; pre-next=fbt-next-next; free(fbt-next); free(fbt); else if(pre-start_addr+pre-size)=fbt-start_addr) pre-size=pre-size+fbt-size; pre-next=fbt-next; free(fbt); else if(fbt-s

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1