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