一、目的

  • 四个动态分区分配算法:最佳适应算法,循环首次适应算法,最坏适应算法,首次适应算法;
  • 四种回收情况:上邻不下邻,上不邻下邻,上下都邻,上下都不邻;
  • 要求有录入界面,动态初始化内存使用情况,动态录入进程对内存的分配与回收请求;
  • 有算法选择界面,动态选择分区分配算法;
  • 有输出界面,能够查看内存分配与回收结果。

二、原理

首先创建memory类,类中包含四个内存分配回收算法:

  • 首次适应算法private void FristFit(int size) 从链首开始顺序查找
  • 循环首次适应算法private void NextFit(int size) 从上次找到的空闲分区的下一个空闲分区开始查找
  • 最佳适应算法private void BestFit(int size) 总是把满足要求的,最小的空闲分区分配给作业
  • 最坏适应算法private void WorstFit(int size) 总是把满足要求的,最大的空闲分区分配给作业

若通过以上四种算法 找到可用的空闲分区并且分区的大小足够

  • 通过Distribute(size, location, temp)函数执行分配。
  • 通过public void showmpartition()函数展示内存分区的状况。
  • 通过public void allocation(int size)进行内存的动态分配函,
  • 通过public void collection(int id)进行内存的回收 。

然后创建main类,里面主要时main函数,通过输入不同的选择调用不同的函数。

三、主要过程及步骤

1.主要模块及数据流程图

(1)主要函数:

  • public void allocation(int size):内存分配
  • public void showmpartition():展示内存分区状况
  • public void collection(int id):内存回收,id 指定要回收的分区号
  • private void Distribute(int size, int location, Partition
    temp):执行分配函数

(2)核心算法及解析:

1)首次适应算法:

首次适应算法进行内存分配时,从链首开始顺序查找。首先找到可用的空闲分区并且分区的大小足够,通过Distribute(size, location, temp)函数执行分配,若遍历完整个链表任然没有找到可用空闲分区则内存分配失败,输出提示语句。

//首次适应算法//size 指定需要分配的大小private void FristFit(int size){//遍历分区链表for (location = 0; location < mpartition.size(); location++){//每次从链首开始查找Partition temp =mpartition.get(location);if (temp.Free && (temp.size > size)){//找到可用空闲分区且大小足够Distribute(size, location, temp);return;}}//遍历结束后未找到可用分区, 则内存分配失败System.out.println("无可用内存空间!");}

2)循环首次适应算法:

循环首次适应算法进行内存分配时,从上次找到的空闲分区的下一个空闲分区开始查找。首先,从上次分配的空闲区位置开始遍历分区链表,如果,找到可用的空闲分区并且分区的大小足够,通过Distribute(size, location, temp)函数执行分配。若遍历完整个链表任然没有找到可用空闲分区则内存分配失败,输出提示语句。

//循环首次适应算法
// size 指定需要分配的大小private void NextFit(int size){Partition temp = mpartition.get(location);//从上次分配的空闲区位置开始遍历分区链表if (temp.Free && (temp.size > size)){Distribute(size, location, temp);return;}int length= mpartition.size();int i = (location + 1) % length;for (; i != location; i = (i+1) % length){temp = mpartition.get(i);//找到可用分区(空闲且大小足够)if (temp.Free && (temp.size > size)){Distribute(size, i, temp);return;}}//遍历结束后未找到可用分区, 则内存分配失败System.out.println("无可用内存空间!");}

3)最佳适应算法:

最佳适应算法为作业分配内存时,总是把满足要求的,最小的空闲分区分配给作业。首先遍历分区链表,如果,找到可用的空闲分区并且分区的大小足够,再判断min > temp.size – size是否成立,最后根据flag的值判断有无可用内存空间,若有则通过Distribute(size, location, temp)函数执行分配。

   // 最佳适应算法//size 指定需要分配的大小private void BestFit(int size){int flag = -1;int min = this.size;for (location = 0; location < mpartition.size(); location++){Partition temp = mpartition.get(location);if (temp.Free && (temp.size > size)){if (min > temp.size - size){min = temp.size - size;flag = location;}}}if (flag == -1){System.out.println("无可用内存空间!");}else {Distribute(size, flag, mpartition.get(flag));}}

4)最坏适应算法:

最坏适应算法为作业分配内存时,总是把满足要求的,最大的空闲分区分配给作业。首先遍历分区链表,如果,找到可用的空闲分区并且分区的大小足够,再判断max < temp.size – size是否成立,最后根据flag的值判断有无可用内存空间,若有则通过Distribute(size, location, temp)函数执行分配。

   //最坏适应算法//size 指定需要分配的大小private void WorstFit(int size){int flag = -1;int max = 0;for (location= 0; location < mpartition.size(); location++){Partition temp = mpartition.get(location);if (temp.Free && (temp.size > size)){if (max < temp.size - size){max = temp.size - size;flag = location;}}}if (flag == -1){System.out.println("无可用内存空间!");}else {Distribute(size, flag, mpartition.get(flag));}

4)四种回收情况:

此处将上邻下不邻,上不邻下邻,上下都不邻和上下都邻四种回收情况合并为两种,即:如果回收分区不是尾分区且后一个分区为空闲, 则与后一个分区合并(上不邻下邻或者上下都邻),如果回收分区不是首分区且前一个分区为空闲, 则与前一个分区合并(上邻下不邻或者上下都邻)。

   //内存回收,id 指定要回收的分区号public void collection(int id){if (id >= mpartition.size()){System.out.println("没有此分区号!");return;}Partition temp = mpartition.get(id);int size = temp.size;if (temp.Free) {System.out.println("分区未被分配, 无需回收");return;}//如果回收分区不是尾分区且后一个分区为空闲, 则与后一个分区合并(上不邻下邻或者上下都邻)if (id < mpartition.size() - 1 && mpartition.get(id + 1).Free){Partition next = mpartition.get(id + 1);temp.size += next.size;mpartition.remove(next);}//如果回收分区不是首分区且前一个分区为空闲, 则与前一个分区合并(上邻下不邻或者上下都邻)if (id > 0 && mpartition.get(id - 1).Free){Partition previous = mpartition.get(id - 1);previous.size += temp.size;mpartition.remove(id);id--;}mpartition.get(id).Free = true;System.out.println("内存回收成功!, 本次回收了 " + size + "KB 空间!");}

(3)数据流程图:

2. 运行结果分析

(1)内存初始状态:

(2)动态分区分配:

对四种算法均执行如下操作序列:申请300K,申请100K,释放300K,申请150K,申请50K,申请90K。在选择算法指令中输入相对应的指令。



(3)结果显示及分析:

1)首次适应算法:

首先申请300K,再申请100K,再释放300K,此时第一个空闲分区起始地址为0,大小为300K。第二个空闲分区起始地址为400,大小为112K。由于首次适应算法进行内存分配时,从链首开始,所以申请150K,50K,90K都是在已经释放的300K空闲区中分配。此时,第一个空闲分区起始地址为290,大小为10K,第二个空闲分区起始地址为400,大小为112K。

2)循环首次适应算法:

首先申请300K,再申请100K,再释放300K,此时第一个空闲分区起始地址为0,大小为300K。第二个空闲分区起始地址为400,大小为112K。由于循环首次适应算法进行内存分配时,从上次找到的空闲分区的下一个空闲分区开始查找,所以当申请150K时下一个空闲分区的始址为150,大小为150K;再申请50K,它的下一个空闲分区始址为200,大小为100K;再申请90K,它的下一个空闲分区的始址为290,大小为10K。综上所述,第一个空闲分区的始址为290,大小为10K,第二个空闲分区的始址为400,大小为112K。

3)最佳适应算法

首先申请300K,再申请100K,再释放300K,此时第一个空闲分区起始地址为0,大小为300K。第二个空闲分区起始地址为400,大小为112K。由于最佳适应算法在分配内存时,总是把满足要求的最小的空闲分区分配给作业。所以当申请150K时,将满足要求的300K分配给它,此时第一个空闲分区的起址为150,大小为150K,第二个空闲分区不变;申请50K时,满足要求的且最小的为第二个空闲分区,分配完后第二空闲分区的起址为450,大小为62K;申请90K,将第一个空闲分区分配给它,最终可得,第一个空闲分区的始址为240,大小为60K,第二个空闲分区的始址为450,大小为62K。

4)最坏适应算法:

首先申请300K,再申请100K,再释放300K,此时第一个空闲分区起始地址为0,大小为300K。第二个空闲分区起始地址为400,大小为112K。由于最坏适应算法在分配内存时,总是把满足要求的最大的空闲分区分配给作业。所以当申请150K时,将满足要求的300K分配给它,此时第一个空闲分区的起址为150,大小为150K,第二个空闲分区不变;申请50K时,第一个空闲分区大小为150K,第二空闲分区大小为112K,所以将第一分区分配给它,分配完后第一空闲分区的起址为200,大小为100K;申请90K,由于第一空闲分区为100K,第二个空闲分区为112K,所以将第二个空闲分区分配给它,最终可得,第一个空闲分区的始址为200,大小为100K,第二个空闲分区的始址为490,大小为22K。

得出结论:若随后又要申请80K,首次适应算法可以分配成功,而最佳适应算法则没有足够大的空间分配。这说明首次适应算法尽可能地使用了低地址部分的空闲区域,留下了高地址部分的大空闲区,更有可能满足进程的申请。

模拟实现内存动态分区分配与回收相关推荐

  1. 操作系统之动态分区分配与回收—C语言实现

    前言 这篇文章用来记录操作系统实验之 动态分区分配与回收. 不想从网上copy代码,打算自己从头到尾写一下,没想到却花了我整整两个晚上的时间,好在终于写完了- 动态分区分配采用的算法是最佳适应(bes ...

  2. 内存动态分区分配算法

    动态分区分配 所谓动态分区分配,就是指内存在初始时不会划分区域,而是会在进程装入时,根据所要装入的进程大小动态地对内存空间进行划分,以提高内存空间利用率,降低碎片的大小 动态分区分配算法有以下四种: ...

  3. 操作系统之 动态分区分配与回收

    算法思想: 1.分区的个数和大小不是固定不变的,而是可变的,随装入的作业动态划分,且不会产生内部碎片. 2.外部碎片: 频繁的分配与回收物理页面会导致大量的.连续且小的页面块夹杂在已分配的页面中间,就 ...

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

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

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

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

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

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

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

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

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

    BF算法.男朋友算法,哈哈 要实现动态分区分配,需要考虑三个方面的问题.分别是数据结构.分区分配算法.分区的分配与回收操作. 首数据结构 这里我们使用的是空闲分区链,采用双向链表表示空闲分区. 具体实 ...

  9. 动态分区分配存储管理方式的内存分配回收

    在动态分区分配存储管理方式的内存分配中,当有作业请求装入时,根据作业的需要内存空间的大小查询内存各个空闲区,从中找到一个大于或等于该作业大小的内存空闲区,然后按作业需求量划出一个分区装入该作业.作业执 ...

最新文章

  1. 网站推广专员浅析网站推广对企业运营优化的重要性不可忽视
  2. python中迭代器的实现原理_Python 进阶应用教程
  3. 实现ftp_FTP文件服务器的实现
  4. boost::graph模块演示 GGCL Vertex 接口
  5. nodec mysql_Node.js 连接 MySQL 并进行数据库操作 –node.js 开发指南
  6. IOS开发--TextField
  7. 数学知识在游戏中的运用
  8. Matplotlib常用库方法
  9. 用字典给Model赋值
  10. shell 管道命令 、、||、>、>>(精)
  11. 【MySql】MySql存储,游标,循环的简单使用
  12. Android事件分发 笔记
  13. LVS_TUN 实验
  14. 【笔记——Java】读取properties文件
  15. Axure元件库,Axure元件库下载,Axure Design
  16. 壮族小伙车祸离世 父亲含泪捐儿器官救6人
  17. 巧吃支付宝新年红包,再也不用担心钱花不出去了(售货机里面的饮料售空也没事哦)
  18. Oracle数据字典一致性鉴别
  19. 这15个特性,身为.NET开发者的你全部都了解吗?
  20. 西电计算机学院有保研清华的吗,北邮西电保送清华人数进前10,不输双一流,哪些大学学生能读清华...

热门文章

  1. uni-app 180查看好友朋友圈完善(一)
  2. python画国际象棋棋盘图片_python3 turtle 画国际象棋棋盘
  3. 矩阵知识:正交矩阵、行列式、子式与代数余子式
  4. 关于做一个有价值的人的思考(1,财富扮演什么角色)
  5. 世界十大经典汽车赛道盘点
  6. 2021年最新易支付修复版源码支持微信支付宝官方接口和码支付网信钱包等/个人也能用的易支付商户系统
  7. 【文献数据速递】CEO绿色经历能否促进企业绿色创新
  8. unzip解压缩linux文件时出现error [Testing.zip]: start of central directory not found;zipfile corrupt——7z
  9. 同时使用两片I2C同型号设备时地址怎样设置 (如何更改器件地址)
  10. VLC web插件 js接口