操作系统——动态分配

写的时间早了,有些许漏洞和不足,请大家不要介意

分配方式可分为四类:单一连续分配、固定分区分配、动态分区分配以及动态可重定位分区分配算法四种方式,其中动态分区分配算法就是此实验的实验对象。动态分区分配又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配与回收操作这样三方面的问题。动态分区分配又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配与回收操作这样三方面的问题。

大体流程图

算法实现原理

定义的结构体:

struct Partition
{Partition* Back;//指向上一个分区 int Id;//分区号 int Size;//分区大小 int State;// 分区状态 0空闲 1占用 int Start_Address;//起始地址 int End_Address;//末尾地址 Partition* Next;//指向下一个分区
};

首次适应算法:

空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

void First_Fit(Partition* Partition_Table_Head, int Size)  //首次适应算法
{int x = 1;Partition* p=NULL, * q=NULL;//定义两个指针p = Partition_Table_Head->Next;//将第一个数据节点赋给pwhile (p){if (p->Size >= Size && p->State == 0) break;p = p->Next;}//利用循环找到一个空闲的块,且其空间大小要大于等于要申请的空间if (p->Size == Size)  p->State = 1;//若大小恰好合适,只需需改其状态即可else{q = (Partition*)malloc(sizeof(Partition));(p->Back)->Next = q;p->Size = p->Size - Size;q->Back = p->Back;q->Size = Size;q->Start_Address = p->Start_Address;q->End_Address = p->End_Address - p->Size;q->State = 1;q->Next = p;p->Back = q;p->Start_Address = q->End_Address + 1;}//若大于,则新建一个块,填写其数据,并修改当前块数据,加到其之前p = Partition_Table_Head->Next;while (p){p->Id = x;x++;p = p->Next;}//x重新给所有分区编号}

最佳适应算法:

空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

void Best_Fit(Partition* Partition_Table_Head, int Size) //最佳适应算法
{int x = 1, count = 0, Remain_Size = 0;//conut用来保证第一个找到的分区可以直接用,Remain-size用来标识最好的大小Partition* p = nullptr;Partition* q = nullptr;//定义两个空指针p = Partition_Table_Head->Next;while (p){if (p->Size >= Size && p->State == 0)//找到一个空闲区,其大小大于等于要申请的大小{if (count == 0) //若是第一个找到的合适分区,则直接赋给q,并计算Remian_size{Remain_Size = p->Size - Size;q = p;count++;}else if (count != 0 && p->Size - Size < Remain_Size)若非第一个找到的合适分区,则比较Remain_size,选择小的重新赋给q{Remain_Size = p->Size - Size;q = p;}}p = p->Next;}
//同理,利用循环找到“最佳”的那个空闲区p = q;if (p->Size == Size)  p->State = 1;else{q = (Partition*)malloc(sizeof(Partition));(p->Back)->Next = q;p->Size = p->Size - Size;q->Back = p->Back;q->Size = Size;q->Start_Address = p->Start_Address;q->End_Address = p->End_Address - p->Size;q->State = 1;q->Next = p;p->Back = q;p->Start_Address = q->End_Address + 1;}p = Partition_Table_Head->Next;while (p){p->Id = x;x++;p = p->Next;}
//同理,为新的分区前写信息
}

最坏适应算法:

空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

void Worst_Fit(Partition* Partition_Table_Head, int Size) //最坏适应算法
{int x = 1, count = 0, Remain_Size = 0;Partition* p = nullptr;Partition* q = nullptr;p = Partition_Table_Head->Next;while (p){if (p->Size >= Size && p->State == 0){if (count == 0){Remain_Size = p->Size - Size;q = p;count++;}else if (count != 0 && p->Size - Size > Remain_Size){Remain_Size = p->Size - Size;  //道理同最佳适应算法,只是在这块选择Remain_size大的q = p;}}p = p->Next;}p = q;if (p->Size == Size)  p->State = 1;else{q = (Partition*)malloc(sizeof(Partition));(p->Back)->Next = q;p->Size = p->Size - Size;q->Back = p->Back;q->Size = Size;q->Start_Address = p->Start_Address;q->End_Address = p->End_Address - p->Size;q->State = 1;q->Next = p;p->Back = q;p->Start_Address = q->End_Address + 1;}p = Partition_Table_Head->Next;while (p){p->Id = x;x++;p = p->Next;}}

回收:

对回收一个分区的四种情况,进行处理

void Recycle(Partition* Partition_Table_Head)  //回收
{int x = 1, id;Partition* p=NULL, * q=NULL;//定义两个空指针p = Partition_Table_Head->Next;cout << "请输入要回收分区的分区号 :" << endl;cin >> id;while (p){if (p->Id >= id) break;p = p->Next;}   p->State = 0;  //根据输入要回收的分区号,使p指向它,并修改其状态为空闲check_again:  if (p->Back != NULL && (p->Back)->State == 0) //检查上一个分区是否为空,若为空,则合并
{p->Size = p->Size + (p->Back)->Size;p->Start_Address = (p->Back)->Start_Address;if ((p->Back)->Back != NULL)    ((p->Back)->Back)->Next = p;else p->Back = NULL;q = p->Back;p->Back = (p->Back)->Back;free(q);goto check_again;  //再次检查,避免连续的空闲(虽然没可能)
}if (p->Next != NULL && (p->Next)->State == 0) //检查下一个分区是否为空i,若为空,则合并
{p->Size = p->Size + (p->Next)->Size;p->End_Address = (p->Next)->End_Address;q = p->Next;if ((p->Next)->Next != NULL) p->Next = (p->Next)->Next;else p->Next = NULL;free(q);goto check_again; //再次检查,避免连续的空闲(虽然没可能)
}p = Partition_Table_Head->Next;
while (p)
{p->Id = x;x++;p = p->Next;
}  //重新编号}

算法效果

初始化空白分区并显示进程目录

跳过

首次适应算法、

回收

回收8

最佳适应算法

申请大小为7的分区

最坏适应算法

申请大小为5的分区

每种算法的优劣

4.1首次适应算法

优点:高址部分的大的空闲分区得到保留,为大作业的内存分配创造了条件;

缺点:(1)每次都是优先利用低址部分的空闲分区,造成低址部分产生大量的外 部碎片

(2)每次都是从低址部分查找,使得查找空闲分区的开销增大;

4.2最佳适应算法

优点:第一次找到的空闲分区是大小最接近待分配内存作业大小的;

缺点:产生大量难以利用的外部碎片

4.3最坏适应算法

优点:效率高,分区查找方便;

缺点:当小作业把大空闲分区分小了,那么,大作业就找不到合适的空闲分区。

完整代码https://download.csdn.net/download/weixin_43887148/18829611

操作系统——动态分配算法(首次适应算法,最佳适应算法,最坏适应算法及回收)相关推荐

  1. 连续分配管理方式的动态分区分配算法(首次适应、最佳适应、最坏适应、邻接适应算法)

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

  2. 操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】

    学习地址(哔哩哔哩网站--王道论坛):https://www.bilibili.com/video/BV1YE411D7nH?p=37 目录 1.首次适应算法(First Fit) 2.最佳适应算法( ...

  3. 操作系统之内存管理:2、内存管理的功能(内存分配回收、扩充、地址转化、存储保护)

    2.内存管理的功能 功能1:内存空间的分配与回收 连续分配管理: 方法1:单一连续分配 方法2:固定分区分配 方法3:动态分区分配 1.什么是动态分区分配? 2.系统用什么样的数据结构记录内存使用情况 ...

  4. 【操作系统】-- 动态分区分配算法(首次适应算法FF、最佳适应算法BF、最坏适应算法WF、循环首次适应算法NF)

    一.首次适应算法 1.算法思想 每次从低地址开始查找,找到第一个能满足大小的空闲分区. 2.如何实现 空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区 ...

  5. 用循环首次适应算法、最佳适应算法和最坏适应算法,模拟可变分区存储管理,实现对内存区的分配和回收管理

    湖南师范大学 信息科学与工程学院 操作系统课程实验报告 实验项目名称: 可变分区存储管理 题目 实验一.可变分区存储管理 一.实验目的: 加深对可变分区存储管理的理解: 提高用C语言编制大型系统程序的 ...

  6. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  7. 最坏适应算法c语言源码,首次适应算法,最佳适应算法,最坏适应算法源代码

    这是一个非常完美的程序,输出显示的格式也很棒,里面包含首次适应算法,最佳适应算法,最坏适应算法 #include #include #define Free 0 //空闲状态 #define Busy ...

  8. 操作系统中分页、分段、交换空间、页面置换算法等相关概念

    目录 1 分页 2 分段 3 分页和分段的区别 4 交换空间 4.1 虚拟内存 5 页面替换算法 5.1 最佳置换算法(OPT)(理想置换算法) 5.2 先进先出置换算法(FIFO) 5.3 最近最久 ...

  9. 操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)

    操作系统 先来先服务算法(FCFS).最短寻到时间优先算法(SSTF).扫描算法(电梯算法,SCAN).循环扫描算法(CSCAN)和N步扫描算法(NStepScan)的程序实现 复制到本地即可运行 # ...

最新文章

  1. 博士生4篇高分论文参加答辩,却遭评委批评:你写的太多了
  2. 编程方法学20:图形用户界面
  3. 找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符
  4. weblogic漏洞复现(CVE-2020-2555)
  5. java拷贝文件夹和删除文件夹
  6. 解决批处理命令执行完毕后自动关闭cmd窗口
  7. JAVA实现电路布线问题
  8. neo4j中实现关键路径算法
  9. linux 防火墙开启80端口永久保存
  10. 简易硬盘服务器,低成本个人服务器搭建 篇四:一机多用~Server2012的简单备份方法廉价版Time Capsule的养成之路...
  11. 英特尔显卡笔记本屏幕自动调光功能导致屏幕闪烁----笔记本显示器闪烁
  12. 11gR2 硬件导致重新添加节点
  13. 【关键字】ddx ddy 导数函数
  14. 每天一个俯卧撑的健身法 - 微习惯实践
  15. 计算机文档处理是什么,电脑文档被锁了怎么办
  16. 如何把pyecharts的炫酷延续到PPT里!?
  17. python长沙培训学校,长沙python培训班价格
  18. HTML 高度不祥的情况下自动水平垂直居中
  19. 计算机基础(四)——DNS原理,让开发常忘的a记录,ns记录和cname都是什么
  20. 苹果macbook系列中哪款比较好?

热门文章

  1. 5G NR学习理解系列——时频结构及相关概念
  2. EXCEL之VLOOKUP函数——查找、分组、排序
  3. java 链表复制_Java 算法 - 复制带随机指针的链表
  4. 请问,你心里有B树吗??(B树添加、删除操作详细图解)
  5. TCP的分片和IP分片的区别
  6. css 文字两端对齐
  7. oracle视图能否编辑数据,oracle视图的几个重要内容
  8. python中如何注释代码
  9. RHCSA认证考试---5.配置 crontab
  10. Manifest基本