已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统实验报告院别:XXXXXX班级:XXXXXX学号:XXXXXX姓名:稻草人实验题目:内存管理实验一、 实验目的1、 通过本次试验体会操作系统中内存的分配模式;2、 掌握内存分配的方法(FF,BF,WF);3、 学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;4、 掌握内存回收过程及实现方法;5、 学会进行内存的申请释放和管理;二、 实验内容 附源代码: /*宏定义*/#include#include#include#define PROCESS_NAME_LEN 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; /*当前分配算法*/int flag = 0; /*设置内存大小标志*/static int pid = 0; /*初始pid*/int algorithm;/*描述每一个空闲块的数据结构*/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; ;/*进程分配内存块链表的首指针*/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() exit(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; return 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; 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); 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(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 *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 algorithm) 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 = free_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) /*分割后空闲区成为小碎片,一起分配*/ 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 = work-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 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); /* 从空闲区分配内存,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_block_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(!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-size; 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(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(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(%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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《劳动法》规定了劳动者享有哪些劳动权益
- 【小红书课件】品牌如何破圈?小红书破圈营销方法论【小红书运营】
- 江苏省新沂市高中生物 第一章 无菌操作技术实践 1.1 微生物的实验室培养二教案(选修1)
- 2024年秋九年级历史上册 第六单元 资本主义制度的初步确立 第17课 君主立宪制的英国教案 新人教版
- 2024-2025学年学年高中地理《以畜牧业为主的农业地域类型》教学设计 新人教版必修2
- 福建省泉州市泉港三川中学九年级体育《双手头上掷实心球》教案
- 高考地理一轮复习第十章产业区位因素第一节农业区位因素及其变化课件
- 研发合同缴纳印花税情况说明-文书模板
- 守株待兔课件图
- 认识心电图课件
- 2024全球量子产业发展报告
- 沪科版(2024)八年级全一册物理第一学期期末学业质量测试卷 2套(含答案)
- 2022年甘肃省职业技能大赛小程序设计与开发赛项(高职学生组)试题 C卷
- 求是文章《开创我国高质量发展新局面》专题课件
- (正式版)QC∕T 1206.1-2024 电动汽车动力蓄电池热管理系统 第1部分:通 用要求
- 场地移交安全管理协议书
- 医院卒中中心建设各种制度、流程汇编
- 邮储高级练习卷三(第12章-第17章)附有答案
- 重庆市江北区2023-2024学年六年级下学期期末考试数学试题
- 军队文职聘用合同管理规定
- 地漏剖面节点构造讲解
评论
0/150
提交评论