BF算法、男朋友算法,哈哈
要实现动态分区分配,需要考虑三个方面的问题。分别是数据结构、分区分配算法、分区的分配与回收操作。

首数据结构

这里我们使用的是空闲分区链,采用双向链表表示空闲分区。
具体实现如下:

typedef struct LNode{int order;                       //表示内存块的顺序int start;                       //表示内存的初始地址int end;                         //表示内存的结束地址int size;                        //表示内存块的大小int state;                       //表示内存块的状态,1表示被占用,0表示空闲int process;                     //存储占用该内存块的进程的序号struct LNode *next;              //指向下一个内存块struct LNode *pre;               //指向上一个内存块
}LNode;

分配算法

采用基于顺序搜索的动态分区分配算法中的最佳适应(best fit BF)算法。
每次为作业分配内存时,总是把能满足要求,又是最小的空闲分区分配给作业,避免“大材小用”。

内存的分配与回收

  • 分配内存
    从空闲分区链中找到所需大小的分区。设请求的分区大小为u.size,表中每个空闲分区的大小可表示为m.size,若m.size-u.size>=0时进行内存分配操作,若大于0,则申请一新节点,插入到双向链表中,若等于0,则只需修改符合要求的结点的信息就行了。
  • 回收内存,四种情况(F:要回收的内存区、F1:F的前一分区、F2:F的后一分区)
    • F与F1地址衔接,且F1空闲,将F与F1合并,合并后结点首地址为F1首地址,末地址为F末地址,结点数减一。
    • F与F2地址衔接,且F2空闲,将F与F2合并,合并后结点首地址为F首地址,末地址为F2末地址地址,结点数减一。
    • F与F1和F2的地址衔接,且F1,F2空闲,合并后结点首地址为F1首地址,末地址为F2末地址,结点数减二。
    • 其他情况,将结点的state标志和process标志均设置为0。

程序解释

int buf[N]={100,500,200,700,300};   //内存块大小,用来初始化空闲分区链表
int add[N]={20,150,700,950,1700,};  //内存块的初始地址,用来初始化空闲分区链表
int dis[N]={301,400,310,105,190};   //进程所需内存,下标记为进程编号List list_init();               //用来初始化空闲分区链表的函数,返回空闲分区链表的头部
void print(List head);          //顺序输出链表的信息
List allot_memory(List head,ing i);//为编号为i的进程分配内存
List free_memory(List head,int i);//释放编号为i的进程所占用的内存

全部代码

#include<stdio.h>
#include<stdlib.h>#define N 5int buf[N]={100,500,200,700,300};
int add[N]={20,150,700,950,1700,};
int dis[N]={301,400,310,105,190};
typedef struct LNode *List;typedef struct LNode{int order;int start;int end;int size;int state; int process;struct LNode *next;struct LNode *pre;
}LNode;List list_init(){List head,p,m;int i;for(i=0;i<N;i++){m=(List)malloc(sizeof(struct LNode));if(!m){printf("error\n");exit(0);}m->order=i+1;m->start=add[i];m->end=m->start+buf[i]-1;m->size=buf[i];m->next=NULL;m->pre=NULL;m->state=0;p->process=0;if(i==0)head=p=m;else{p->next=m;m->pre=p;p=p->next;}}return head;
}void print(List head){List p=head;while(p){printf("第%d块内存--->始地址:%-5d--->末地址:%-5d--->大小:%-5d--->状态:",p->order,p->start,p->end,p->size);if(p->state==1)printf("被%d号进程占用中!\n",p->process);else if(p->state==0){printf("空闲中!\n");} p=p->next;}printf("\n");
}List free_memory(List head,int i){List p,m,temp;p=head;while(p){if(p->process==i+1){temp=p;if(p->next){m=p->next;if(p->end+1==m->start){if(!m->state){p->size+=m->size;p->end+=m->size;p->next=m->next;p->state=0;p->process=0;if(m->next){m->next->pre=p;}p=m->next;free(m);while(p){p->order--;p=p->next;}}else{p->state=0;p->process=0;}}else{p->state=0;p->process=0;}}p=temp;if(p->pre){m=p->pre;if(p->start==m->end+1){if(!m->state){m->size+=p->size;m->end+=p->size;m->next=p->next;if(p->next){p->next->pre=m;}free(p);p=m->next;while(p){p->order--;p=p->next;}}else{p->state=0;p->process=0;}}else{p->state=0;p->process=0;}}return head;}p=p->next;}
}List allot_memory(List head,int i){int memory_size=dis[i];List p=head;List m;int min=-1;int order=-1;while(p){if(p->process-1==i){printf("内存中已有%d号进程了\n",i+1);return head;}p=p->next;}p=head;while(p){if(p->size>=memory_size&&p->state==0){if(min<0){min=p->size-memory_size;order=p->order;}else{if(min>p->size-memory_size){min=p->size-memory_size;order=p->order;}}}p=p->next;}if(order==-1){printf("%d号进程分配内存失败!\n",i+1);return head;}else{p=head;while(p){if(p->order==order){if(p->size==memory_size){p->state=1;p->process=i+1;return head;}else{m=(List)malloc(sizeof(struct LNode));m->order=p->order;m->start=p->start;m->end=m->start+memory_size-1;m->size=memory_size;m->state=1;m->next=p;m->process=i+1;m->pre=p->pre;p->pre->next=m;p->pre=m;p->start=m->end+1;p->size-=memory_size;while(p){p->order++;p=p->next;}return head;}}p=p->next;}}
}int main(){List p,m;int choice1,choice2;int i;p=list_init();print(p);p=allot_memory(p,3);print(p);p=allot_memory(p,3);p=free_memory(p,3);print(p);p=allot_memory(p,0);print(p);p=allot_memory(p,4);print(p);p=free_memory(p,4);print(p);p=allot_memory(p,4);print(p);p=free_memory(p,0);print(p);p=free_memory(p,4);print(p);return 0;
}

基于顺序搜索的动态分区分配算法模拟内存动态分配--最佳适应算法(best fit,BF)相关推荐

  1. 内存管理-动态分区分配方式模拟

    内存管理 - 动态分区分配方式模拟 操作系统第二次课程作业 - 动态分区分配方式模拟 项目需求 假设初始态下,可用内存空间为640K,并有下列请求序列,请分别用首次适应算法和最佳适应算法进行内存块的分 ...

  2. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  3. java动态分区分配_操作系统动态分区分配算法课程设计java版解析.doc

    湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班级.学号 13101 18 同组者姓名 实验日期 ...

  4. java动态分区分配算法,操作系统_动态分区分配算法课程设计_java版

    <操作系统_动态分区分配算法课程设计_java版>由会员分享,可在线阅读,更多相关<操作系统_动态分区分配算法课程设计_java版(13页珍藏版)>请在人人文库网上搜索. 1. ...

  5. java动态分区分配_操作系统 动态分区分配算法课程设计 java版.pdf

    操作系统 动态分区分配算法课程设计 java版 湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班 ...

  6. 二十八、动态分区分配算法

    一.知识总览 二.首次适应算法 算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区 如何实现:空闲分区以地址递增的次序排列.每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满 ...

  7. 操作系统(三十六)动态分区分配算法

    3.5 动态分区分配算法 上节讲述了连续分区分配方式中有动态分区分配的方式,如果在动态分区分配算法中有许多空闲分区都满足需求的时候,那该如何分配空间呢,今天来介绍四种分配方法解决这个问题. 目录 3. ...

  8. 七、操作系统——动态分区分配算法(详解)

    一.引入 动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? 二.首次适应算法(First Fit) 算法思想:每次都从低地址开始查找,找到第一个能满足 ...

  9. 3.1_ 5_动态分区分配算法

    3.1_ 5_动态分区分配算法 文章目录 3.1_ 5_动态分区分配算法 知识总览 首次适应算法 最佳适应算法 最坏适应算法 邻近适应算法 知识总览 首次适应算法 最佳适应算法 最坏适应算法 邻近适应 ...

最新文章

  1. 创建本地数据库时发生错误及其解决方案
  2. vue_组件插槽详述
  3. acrobat 下拉列表 逻辑_记一次 无限列表 滚动优化
  4. 每日面试之Java集合
  5. MySQL乱码问题如何排查
  6. endnote导致word 2007很慢
  7. 大话RabbitMQ 基础入门
  8. html菜鸟ruby,ruby的基础语法
  9. unity 如何快速展开Hierarchy所有层次
  10. 神舟刷蓝天w650dbios_神舟z6kp5D1记录一次艰难的刷蓝天bios,总算成功了
  11. JAVA宠物寄养管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  12. linux查看文件夹的命令是,linux查看文件夹大小命令是什么
  13. 信道估计的理解(转载借鉴)
  14. QT界面窗口的显示和隐藏,关闭
  15. SUMX2MY2函数,你知道什么意思吗?
  16. AndroidUI设计思想:程序易用性
  17. 爬去动态网站今日头条图片集
  18. Python之校庆代码
  19. cocos creator麻将教程系列(四)—— 达达麻将客户端初始化流程
  20. windows下安装GVM

热门文章

  1. android 9.0 https 适配,如何适配 Android 9.0? 在 Android 9.0 上发生 SSL handshake timed out 异常怎么解决...
  2. 查看oracle的块大小,查看操作系统块大小
  3. java线程代码实现_Java 实现线程的2种方法的具体代码实例
  4. linux php 版本切换,linux更换PHP版本,多个PHP版本切换
  5. python时间去掉t_Python的set集合详解
  6. $.fn.zTree 展开 回显 选中
  7. 分享轮子-flutter下拉刷新上拉加载
  8. 【HTML基础】表格和表单
  9. PNG,GIF,JPG的区别及如何选
  10. 【C++】满二叉树问题