《内存管理实验.pdf》由会员分享,可在线阅读,更多相关《内存管理实验.pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分内存管理实验一实验目的一实验目的1.通过本次实验体会操作系统中内存的分配模式;2.掌握内存分配的方法;3.学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;4.掌握内存回收过程及实现方法;5.学会进行内存的申请释放和管理;6.掌握内存分配 FF,BF,WF 策略及实现的思路;二二.实验内容实验内容1.编写程序实现采用可变分区方法管理内存。2.在该实验中,采用可变分区方式完成对存储空间的管理。3.设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。4.在设计好的数据结构上设计
2、一个主存分配算法。5.在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分三概要设计三概要设计1 1功能模块图功能模块图Main()SetmemorysizeSelectmemoryallocationalgorithmNewprocessTerminatea processDisplaymemoryusageExit2 2各个模块详细的功能描述各个模块详细的功能描述主要数据结构:主要数据结构:struct free_bloc
3、k_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(default=1024):(1)Set memory size(default=1024):这个模块是用来设置内存大小的,从键盘获取一个数字,并将它赋值给内存大小;若没有设置,则默认内
4、存的大小为 1024。(2)Set_algorithm(2)Set_algorithm:这个模块是用来设置分配算法的,共有三种算法:首次循环适配算法、最好适配算法、最差适配算法。从键盘输入一种算法前的序号,根据算法点用不同的函 页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分数对内存进行分配;(3)New_process:(3)New_process:此模块是用来创建进程的。从键盘输入进程号,调用fork()创建进程并为其分配一定大小的内存,若分配成功,则将其连接到已分配链表中,否则分配失败;(4)Kill_process:(4)Kill_process:此模块是用来
5、杀死进程的。从键盘输入一个进程号,先调用 find_process()函数进行查找,若找到,则调用 kill()函数将其杀死并释放内存空间;(5)Display_mem_usage:(5)Display_mem_usage:此模块是用来显示内存的使用情况的。将每个进程的内存使用情况显示出来,包括起始地址和内存大小;(6)Do_exit:(6)Do_exit:这个模块是用来结束程序的,直接调用 exit()实现。四详细设计四详细设计1 1功能函数的调用关系图功能函数的调用关系图Set_mem_size()Set_algorithm()Main()New_process()Kill_process
6、()Display_mem_usage()Do_exit()Rearrange_FF()Rearrange_BF()Rearrange_WF()Allocate_mem()Free_mem()exit()页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分2 2各功能函数流程图各功能函数流程图开始Set_algorithm():Set_algorithm():显示算法选择菜单从键盘输入算法序号Switch()MA_FFMA_BFMA_WFNew_process():New_process():判断是否分配成功否是将此进程连接到已分配内存链表中结束从键盘获得一个进程号和为进
7、程的分配的内存大小Rearrange_FRearrange_WFSize0?是Allocate_mem()为进程分配内存 页脚内容页脚内容结束Rearrange_B开始段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分Allocate_memAllocate_mem()():开始是是Fbt-size-request_sizeMIN_SLICE否Fbt-size=request_sizeKill_process():Kill_process():将内存块分割后分配给进程将内存块整体分配给进程结束开始输入一个进程号Find_process()查找该进程是否找到?是Free_mem()释放内
8、存否结束 页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分五测试数据及运行结果五测试数据及运行结果显示菜单:显示菜单:设置内存空间大小:设置内存空间大小:创建进程:创建进程:杀死进程杀死进程 1 1:选择内存分配算法菜单:选择内存分配算法菜单:首次适应法:首次适应法:六调试情况设计技巧及体会六调试情况设计技巧及体会1.调试情况调试情况:第一步:对.c 文件进行编译,生成目标文件(.o 文件),使用的命令是 gcc-c a.c(a是文件名);第二步:编译.o 文件生成可执行文件(.exe 文件),使用的命令是 gcc-o a a.o(a是文件名);第三步:运行.exe
9、文件查看结果,使用的命令是./a(a 是文件名);2.2.设计技巧及体会设计技巧及体会这次实验让我们充分了解了内存分配的机制和管理内存的几种方法,从而更进一步对计算机操作系统有了更深的认识。虽然在这次实验的过程中遇到了很多问题,对内存理解的不深刻,不太清楚计算机系统中是如何对内存进行管理的,但是通过这次实验,现在已经清楚地知道了内存的管理机制,对内存理解的更加透彻。在以后的学习中能够更好的理解操作系统在计算机应用中起到的作用。页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分七源代码七源代码#include#include#define PROCESS_NAME_LEN
10、 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 3int mem_size=DEFAULT_MEM_SIZE;int ma_algorithm=MA_FF;static int pid=0;int flag=0;void display_menu(void);页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分struct free_block_type*init_free_b
11、lock(int mem_size);int set_mem_size();void set_algorithm();void rearrange(int algorithm);void rearrange_FF();void rearrange_BF();void rearrange_WF();void swap(int*a,int*b);int new_process();int display_mem_usage();void do_exit();void kill_process();int display_mem_usage();struct allocated_block*find
12、_process(int pid);struct free_block_typeint size;int start_addr;struct free_block_type*next;struct allocated_blockint pid;int size;int start_addr;char process_namePROCESS_NAME_LEN;struct allocated_block*next;struct free_block_type*free_block;struct allocated_block*allocated_block_head=NULL;int main(
13、void)char choice;pid=0;free_block=init_free_block(mem_size);for(;)display_menu();/fflush(stdin);choice=getchar();/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=
14、1;break;case 5:display_mem_usage();flag=1;break;case 0:do_exit();exit(0);default:break;return 0;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-s
15、tart_addr=DEFAULT_MEM_START;fb-next=NULL;return fb;int set_mem_size()int size;if(flag!=0)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;flag=1;return 1;void set_algorithm()页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分
16、int algorithm;printf(t1-First Fitn);printf(t2-Best Fitn);printf(t3-Worst Fitn);scanf(%d,&algorithm);if(algorithm=1&algorithmnext;while(work!=NULL)if(work-start_addrstart_addr)swap(&work-start_addr,&tmp-start_addr);swap(&work-size,&tmp-size);elsework=work-next;tmp=tmp-next;void rearrange_BF()struct f
17、ree_block_type*tmp,*work;printf(Rearrange free blocks for BFn);页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分 tmp=free_block;printf(%d,%dn,tmp-start_addr,tmp-size);while(tmp!=NULL)work=tmp-next;while(work!=NULL)if(work-sizesize)swap(&work-start_addr,&tmp-start_addr);swap(&work-size,&tmp-size);printf(start_ad
18、dr:%d,size:%dn,work-start_addr,work-size);else work=work-next;tmp=tmp-next;void rearrange_WF()struct free_block_type*tmp,*work;printf(Rearrange free blocks for FFn);tmp=free_block;printf(%d,%dn,tmp-start_addr,tmp-size);while(tmp!=NULL)work=tmp-next;while(work!=NULL)if(work-sizetmp-size)swap(&work-st
19、art_addr,&tmp-start_addr);swap(&work-size,&tmp-size);printf(start_addr:%d,size:%dn,work-start_addr,work-size);else work=work-next;tmp=tmp-next;页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分void swap(int*a,int*b)int temp;temp=*a;*a=*b;*b=temp;int new_process()struct allocated_block*ab;int size;int ret;ab=(str
20、uct allocated_block*)malloc(sizeof(struct 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);scanf(%d,&size);if(size0)ab-size=size;ret=allocate_mem(ab);if(ret=1)&(allocated_block_head=NULL)allocated_block_head
21、=ab;return 1;else if(ret=1)ab-next=allocated_block_head;allocated_block_head=ab;return 2;else if(ret=-1)printf(printf(Allocation failn);free(ab);return-1;return-3;页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分int allocate_mem(struct allocated_block*ab)struct free_block_type*fbt,*pre;int request_size=ab-size;
22、fbt=pre=free_block;while(fbt!=NULL)if(fbt-size=request_size)if(fbt-size-request_sizeMIN_SLICE)fbt-size=fbt-size-request_size;/ab-size=request_size;ab-start_addr=fbt-start_addr;fbt-start_addr=fbt-start_addr+request_size;printf(%d,%dn,ab-start_addr,ab-size);return 1;else/pre-next=fbt-next;ab-size=fbt-
23、size;ab-start_addr=fbt-start_addr;if(fbt=free_block)free_block=fbt-next;free(fbt);elsepre-next=fbt-next;free(fbt);printf(%d,%dn,ab-start_addr,ab-size);return 1;else pre=fbt;fbt=fbt-next;页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分return-1;void kill_process()struct allocated_block*ab;int pid;printf(Kill Pro
24、cess,pid=);scanf(%d,&pid);ab=find_process(pid);if(ab!=NULL)free_mem(ab);dispose(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;fbt-size=ab-size;fbt-start_a
25、ddr=ab-start_addr;fbt-next=free_block;free_block=fbt;rearrange(MA_FF);fbt=free_block;while(fbt!=NULL)work=fbt-next;if(work!=NULL)if(fbt-start_addr+fbt-size=work-start_addr)fbt-size=fbt-size+work-size;fbt-next=work-next;页脚内容页脚内容段左侧片石混凝土挡土墙第段左侧片石混凝土挡土墙第 部分部分free(work);continue;fbt=fbt-next;/rearrange(
26、algorithm);return 1;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-ne
27、xt;free(ab);return 2;int 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;printf(nUsed
28、 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;void do_exit()exit(0);struct allocated_block*find_process(int pid)struct allo
29、cated_block*ab;ab=allocated_block_head;while(ab!=NULL)if(ab-pid=pid)return ab;elseab=ab-next;void display_menu(void)printf(n);printf(1-Set memory size(default=%d)n,DEFAULT_MEM_SIZE);printf(2-Select memory allocation algorithmn);printf(3-New processn);printf(4-Terminate a processn);printf(5-Display memory usagen);printf(0-Exitn);世上没有一件工作不辛苦,没有一处人事不复杂。不要随意发脾气,谁都不欠你的页脚内容页脚内容