Linux系统内存管理实验报告,linux内存管理实验报告

《linux内存管理实验报告》由会员分享,可在线阅读,更多相关《linux内存管理实验报告(13页珍藏版)》请在人人文库网上搜索。

1、操作系统实验报告院别:XXXXXX班级:XXXXXX学号:XXXXXX姓名:稻草人实验题目:内存管理实验一、 实验目的1、 通过本次试验体会操作系统中内存的分配模式;2、 掌握内存分配的方法(FF,BF,WF);3、 学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;4、 掌握内存回收过程及实现方法;5、 学会进行内存的申请释放和管理;二、 实验内容附源代码:/*宏定义*/#include#include#include#define PROCESS_NAME_LEN 32 /*进程名称的最大长度*/#define MIN_SLICE 10 。

2、/*最小碎片的大小*/#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; /*当前分配算法*/int flag = 0; /*设置内存大小标志*/static int pid = 0; /*初始pid*/int algorithm;/*描述每一个。

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

4、located_block *allocated_block_head = NULL; struct allocated_block *find_process(int id)struct allocated_block *p;p=allocated_block_head;while(p!=NULL)if (p-pid=id)return p;return NULL;void swap(int *p,int *q)int temp;temp = *p;*p = *q;*q = temp;return;void do_exit()exit(0);/*初始化空闲块,默认为一块,可以指定大小及起始地。

5、址*/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;/*显示菜单*/display_menu()printf(n);p。

6、rintf(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);/*设置内存的大小*/set_mem_size()int size;if(flag!=0) /防止重复设置printf(Cannot set memory si。

7、ze againn);return 0;printf(Total memory size =);scanf(%d, &size);if(size0) mem_size = size;free_block-size = mem_size;flag=1; return 1;/*按FF算法重新整理内存空闲块链表*/rearrange_FF()struct free_block_type *tmp, *work;printf(Rearrange free blocks for FF n);tmp = free_block;while(tmp!=NULL) work = tmp-next;while(w。

8、ork!=NULL)if ( work-start_addr start_addr) /*地址递增*/swap(&work-start_addr, &tmp-start_addr);swap(&work-size, &tmp-size);work=work-next; tmp = tmp - next;/*按BF最佳适应算法重新整理内存空闲块链表*/rearrange_BF()struct free_block_type *tmp, *work;printf(Rearrange free blocks for BF n);tmp = free_block;while(tmp!=NULL) wo。

9、rk = tmp-next;while(work!=NULL)if ( work-size tmp-size) /*地址递增*/swap(&work-start_addr, &tmp-start_addr);swap(&work-size, &tmp-size);work=work-next; tmp = tmp - next;/*按WF算法重新整理内存空闲块链表*/rearrange_WF()struct free_block_type *tmp, *work;printf(Rearrange free blocks for WF n);tmp = free_block;while(tmp!。

10、=NULL) work = tmp-next;while(work!=NULL)if ( work-size size) /*地址递增*/swap(&work-start_addr, &tmp-start_addr);swap(&work-size, &tmp-size);else work=work-next; tmp = tmp - next;/*按指定的算法整理内存空闲块链表*/rearrange(int algorithm)switch(algorithm)case MA_FF: rearrange_FF(); break;case MA_BF: rearrange_BF(); bre。

11、ak;case MA_WF: rearrange_WF(); break;/* 设置当前的分配算法 */set_algorithm()printf(t1 - First Fitn);printf(t2 - Best Fit n);printf(t3 - Worst Fit n);scanf(%d, &algorithm);if(algorithm=1 & algorithm size;fbt = free_block;while(fbt!=NULL)if(fbt-size=request_size)if (fbt-size - request_size = MIN_SLICE) /*分配后空闲。

12、空间足够大,则分割*/mem_size -= request_size;fbt-size -= request_size; ab-start_addr= fbt-start_addr;fbt-start_addr += request_size; else if (fbt-size - request_size) size - request_size) 0)/*分割后空闲区成为小碎片,一起分配*/mem_size -= fbt-size;pre = fbt-next;ab-start_addr= fbt-start_addr;fbt-start_addr += fbt-size;free(f。

13、bt);else temp = free_block;while(temp!=NULL)work = temp-next;if(work!=NULL)/*如果当前空闲区与后面的空闲区相连,则合并*/ if (temp-start_addr+temp-size = work-start_addr) temp-size += work-size;temp-next = work-next;free(work);continue;temp = temp-next;fbt = free_block;break;rearrange(algorithm); /*重新按当前的算法排列空闲区*/ return。

14、 1;pre = fbt;fbt = fbt-next;return -1;/*创建新的进程,主要是获取内存的申请数量*/new_process()struct allocated_block *ab;int size;int ret;ab=(struct 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:。

15、, ab-process_name);scanf(%d, &size);if(size0) ab-size=size;ret = allocate_mem(ab); /* 从空闲区分配内存,ret=1表示分配ok*/*如果此时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_blo。

16、ck_head=ab;return 2;else if(ret=-1) /*分配不成功*/printf(Allocation failn);free(ab);return -1;return 3;/*将ab所表示的已分配区归还,并进行可能的合并*/int free_mem(struct allocated_block *ab)int algorithm = ma_algorithm;struct free_block_type *fbt, *work;fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type);if(!。

17、fbt) return -1;fbt-size = ab-size;fbt-start_addr = 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 += work-siz。

18、e;fbt-next = work-next;free(work);continue;fbt = fbt-next;rearrange(algorithm); /*重新按当前的算法排列空闲区*/return 1;/*释放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(。

19、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;/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */display_mem_usage()struct free_block_type *fbt=free_block;struct allocated_block *ab=allocated_block_head;if(。

20、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 Memory:n);printf(%10s %20s %10s %10sn, PID, ProcessName, start_addr, size);while(ab!=NULL)printf(%。

21、10d %20s %10d %10dn, ab-pid, ab-process_name, ab-start_addr, ab-size);ab=ab-next;printf(-n);return 0;/*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/kill_process()struct allocated_block *ab;int pid;printf(Kill Process, pid=);scanf(%d, &pid);ab=find_process(pid);if(ab!=NULL)free_mem(ab); /*释放ab所表示的分配区*/dispose(ab)。

22、; /*释放ab数据结构节点*/main()char choice;pid=0;free_block = init_free_block(mem_size); /初始化空闲区for(;)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。

23、: kill_process(); flag=1; break; /删除进程case 5: display_mem_usage(); flag=1; break /显示内存使用case 0: do_exit(); exit(0); break; /释放链表并退出default: break; 三、 实验结果实验界面:提示输入以后,输入 1,显示如下:紧接着输入: 3,设置内存空间为 256,显示如下:重复一次上一操作。再输入 : 5,显示如下:再输入 : 4后,杀死2号进程,显示如下:四、 实验心得体会通过本次上机实验让我进一步理解了操作系统对内存分配的相关知识,也使我意识到C语言的重要性,对于内存的分配方法以及思想都能理解,但是在具体实现时就受到了感觉有点困难,通过与同学的交流和查阅相关资料才找到了问题所在,这些都是C语言基础不扎实以及长时间不练习造成的,以后得加大编程方面的练习了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值