版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上操作操作系统大作业题目:首次适应算法分配内存学 号: 学生姓名: 张鲁云 班 级:计科121 首次适应算法分配内存一、 问题描述在内存分配中,动态分区是根据实际的进程需求,动态地为之分配空间。而首次适应算法分配时从表头指针开始查找可利用空间表,将找到的第一个大小不小于“请求”的空闲块的一部分分配给用户。可利用空间表本身既不按节点的初始地址有序,也不按节点的大小有序。用户释放内存,回收时只是将空闲块插入在链表的表头即可,此算法比较节省时间。二、 运行环境 VC6.0三、 算法思想。首次适应算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始查找,直到找到一个
2、大小能满足要求的空闲分区为止;然后按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲区仍留在空闲链中。若从链首到链尾都不能找到一个能满足要求的分区,则此次分配失败。四、 实验目的在计算机系统中,为了提高内存区的利用率,必须给电脑内存区进行合理的分配。本实验通过对内存区分配方法首次适应算法的使用,来了解内存分配的模式。五、 首次适应算法分配内存算法概要 (1) 结构体Typedef struct freearea/定义一个空闲区说明表结构 long size; /分区大小long address; /分区地址int state; /状态ElemType; / 线性表的双向链表存储结
3、构Typedef struct DuLNode ElemType data; structDuLNode *prior; /前趋指针structDuLNode *next; /后继指针 DuLNode,*DuLinkList;Status Initblock(intMAX_length)/开创带头结点的内存空间链表 block_first=(DuLinkList)malloc(sizeof(DuLNode); block_last=(DuLinkList)malloc(sizeof(DuLNode); block_first->prior=NULL; /头结点的前驱指针指向空 block
4、_first->next=block_last; /头结点的后继指针指向尾结点 block_last->prior=block_first; /尾结点的前驱指针指向头结点 block_last->next=NULL; /尾结点的后继指针指向空 block_last->data.address=0; /尾结点的地址是0 block_last->data.size=MAX_length; /分区大小是最大分区 block_last->data.state=Free; /状态是空 return OK; (2)主要函数说明:void alloc();进行内存分配的功
5、能函数。Status free(int flag)将地址为flag的分区的内存回收。Status First_fit(int request)创建进程空间的子函数;其中,参数request表示空闲分区链的链首指针;要配合函数alloc()使用。void show()查看内存中的分区情况。输入内存空间大小六、 流程图开辟内存空间内存分配情况显示输入操作序列号其他数输入有误,请重试!1Alloc输入分配区间大小3退出FFirst_fit request<0 |request=0FTT分配成功!内存不足,分配失败!配大小不合适,请重试!输入回收区号分区回收2free(flag)七、 代码实现#
6、include<iostream.h>#include<stdlib.h>#include<stdio.h>#define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1 /完成#define ERROR 0 /出错/#define MAX_length 640 /最大内存空间为640KB typedefint Status; int flag; typedefstructfreearea/定义一个空闲区说明表结构 long size; /分区大小long address; /分区地址int state; /状态El
7、emType; / 线性表的双向链表存储结构typedefstructDuLNode ElemType data; structDuLNode *prior; /前趋指针structDuLNode *next; /后继指针 DuLNode,*DuLinkList; DuLinkListblock_first; /头结点DuLinkListblock_last; /尾结点Status alloc(int);/内存分配Status free(int); /内存回收Status First_fit(int);/首次适应算法void show();/查看分配Status Initblock();/开创
8、空间表Status Initblock(intMAX_length)/开创带头结点的内存空间链表 block_first=(DuLinkList)malloc(sizeof(DuLNode); block_last=(DuLinkList)malloc(sizeof(DuLNode); block_first->prior=NULL; /头结点的前驱指针指向空 block_first->next=block_last; /头结点的后继指针指向尾结点 block_last->prior=block_first; /尾结点的前驱指针指向头结点 block_last->nex
9、t=NULL; /尾结点的后继指针指向空 block_last->data.address=0; /尾结点的地址是0 block_last->data.size=MAX_length; /分区大小是最大分区 block_last->data.state=Free; /状态是空 return OK; /分配主存Status alloc() int request = 0; printf("请输入需要分配的主存大小(单位:KB):");scanf("%d",&request); if(request<0 |request=0)
10、 printf("配大小不合适,请重试!"); return ERROR; if(First_fit(request)=OK) printf("分配成功!"); elseprintf("内存不足,分配失败!"); return OK; /首次适应算法Status First_fit(int request) /为申请作业开辟新空间且初始化DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode);temp->data.size=request; temp->data.state=B
11、usy; DuLNode *p=block_first->next; while(p) if(p->data.state=Free && p->data.size=request) /有大小恰好合适的空闲块p->data.state=Busy; return OK; break; if(p->data.state=Free && p->data.size>request) /有空闲块能满足需求且有剩余temp->prior=p->prior; temp->next=p; temp->data.ad
12、dress=p->data.address; p->prior->next=temp; p->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; return OK; break; p=p->next; return ERROR; /主存回收Status free(int flag) DuLNode *p=block_first; for(inti= 0; i<= flag; i+) if(p!=NULL) p=p
13、->next;elsereturn ERROR; p->data.state=Free; if(p->prior!=block_first&& p->prior->data.state=Free)/与前面的空闲块相连 p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior; p=p->prior; if(p->next!=block_last&& p->
14、next->data.state=Free)/与后面的空闲块相连 p->data.size+=p->next->data.size; p->next->next->prior=p; p->next=p->next->next; if(p->next=block_last&& p->next->data.state=Free)/与最后的空闲块相连 p->data.size+=p->next->data.size; p->next=NULL; return OK; /显示主存分配情
15、况void show() int flag = 0;printf("主存分配情况:n"); DuLNode *p=block_first->next; printf("分区号t起始地址t分区大小t状态nn"); while(p) printf("%d ",flag);flag+;printf("%d t",p->data.address);printf("%dKB t",p->data.size); if(p->data.state=Free) printf("
16、空闲nn"); elseprintf("已分配nn"); p=p->next; printf("+nn"); /主函数void main() int c=1;intMAX_length;/算法选择标记printf("首次适应算法内存分配算法:n");printf("input MAX_length:n");scanf("%d",&MAX_length);Initblock(MAX_length); /开创空间表int choice;/操作选择标记while(c=1)sho
17、w();printf("请输入您的操作:"); printf("n1: 分配内存n2: 回收内存n0: 退出n"); scanf("%d",&choice);if(choice=1) alloc(); / 分配内存c=1;else if(choice=2) / 内存回收 int flag; printf("请输入您要释放的分区号:n"); scanf("%d",&flag); free(flag);c=1; else if(choice=0) break; /退出 else /输入操作有误 printf("输入有误,请重试!n"); c=1; printf("&&&&&&&n");八、 运行截图九、 思考Jiesu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度品牌授权使用合同的商品范围与授权期限3篇
- 2024版快速响应调换货合同模板(含售后服务条款)3篇
- 2024年度房地产买卖合同:某住宅小区购房协议3篇
- 上课迟到旷课检讨书范文
- 2024年合同备案与监管职责2篇
- 2024年度城市老旧区域改造实施合作合同版B版
- 2024年二手住宅买卖全程服务委托协议2篇
- 2023届高考英语一轮复习语法填空词性转换归纳讲义
- 2024年二手车买卖合同范本含事故车检测条款3篇
- 2024年度业务员岗位合同范本2篇
- “希腊罗马古典文化”历史教学课件
- 泛光照明施工方案
- 附属医院物业保洁服务方案及报价
- 中国慢性阻塞性肺疾病基层诊疗指南(2024年)解读
- 大米营销策划方案
- 智能制造数字化孪生模型构建合同
- 2024-2025部编版语文一年级上册语文园地八
- 人教版2024-2025学年七年级数学上册教学计划(及进度表)
- 支气管镜护理常规
- 第1章 医药国际贸易导论课件
- 优化供应商管理的管理方案
评论
0/150
提交评论