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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

linux内存管理实验报告.docx

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

2、LICE 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; /*当前分配算法*/int flag = 0; /*设置内存大小标志*/static int pid = 0; /*初始pid*/int algorithm

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

4、块链表的首指针*/struct allocated_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() exi

5、t(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-start_addr = DEFAULT_MEM_START; fb-next = NULL; retu

6、rn fb;/*显示菜单*/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);/*设置内存的大小*/set_mem_size() int size

7、; 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; /*按FF算法重新整理内存空闲块链表*/rearrange_FF() struct free_block_type *tmp, *work; printf(Rearrange free blocks for FF n)

8、; tmp = free_block; while(tmp!=NULL) work = tmp-next; while(work!=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(

9、Rearrange free blocks for BF n); tmp = free_block; while(tmp!=NULL) work = 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 *

10、tmp, *work; printf(Rearrange free blocks for WF n); tmp = free_block; while(tmp!=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 algori

11、thm) switch(algorithm) case MA_FF: rearrange_FF(); break; case MA_BF: rearrange_BF(); break; 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 = fre

12、e_block; while(fbt!=NULL) if(fbt-size=request_size) if (fbt-size - request_size = MIN_SLICE) /*分配后空闲空间足够大,则分割*/ 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) /*分割后空闲区成为小碎片,一

13、起分配*/ mem_size -= fbt-size; pre = fbt-next; ab-start_addr= fbt-start_addr; fbt-start_addr += fbt-size; free(fbt); 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 = wo

14、rk-next; free(work); continue; temp = temp-next; fbt = free_block; break; rearrange(algorithm); /*重新按当前的算法排列空闲区*/ return 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 alloc

15、ated_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); /* 从空闲区分配内存,ret=1表示分配ok*/*如果此时allocated_block_head尚未赋值,则赋值*/ if(ret=1) &(allocate

16、d_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; /*将ab所表示的已分配区归还,并进行可能的合并*/int free_mem(struct allocate

17、d_block *ab) int algorithm = ma_algorithm; struct free_block_type *fbt, *work; fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type); if(!fbt) return -1; fbt-size = ab-size; fbt-start_addr = ab-start_addr; /*插入到空闲区链表的头部并将空闲区按地址递增的次序排列*/ fbt-next = free_block; free_block=fbt; rearrange(

18、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-size; fbt-next = work-next; free(work); continue; fbt = fbt-next; rearrange(algorithm); /*重新按当前的算法排列空闲区*/ return 1; /*释放ab数据结构节点*/int dispo

19、se(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; pr

20、e-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(fbt=NULL) return(-1); printf(-n); /* 显示空闲区 */ printf(Free Memory:n); printf(%20s %20sn, start_addr, size); while(fbt

21、!=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(%10d %20s %10d %10dn, ab-pid, ab-process_name, ab-start_addr, ab-size); ab=ab-next; printf(-n); return 0; /

22、*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/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); /*释放ab数据结构节点*/ main() char choice; pid=0; free_block = init_free_block(mem_size); /初始化空闲区 fo

23、r(;) 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; bre

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

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

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