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

article/2025/7/22 5:52:06

操作系统——动态分配

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

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

大体流程图

算法实现原理

定义的结构体:

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


http://chatgpt.dhexx.cn/article/5ZIiDyWl.shtml

相关文章

pandas中对列进行排序(单列/多列)/(升序/降序)/(多列升序,降序控制)

前言 我想把数据分析刻进DNA里 如下面的数据,对price,要进行最简单的升序操作: 这个好整: import pandas as pdshop pd.read_csv("data/shop.csv", index_colid)shop.sort_values(byprice, inplaceTrue)结果: 如果你想整活(被迫)要把数据进行降序排列: 按照降序,传…

最先适应法、最佳适应法、下次适配法、最差适配法

题&#xff1a; 分析&#xff1a; 1. 首先分析是不是最差适配法&#xff0c;最差适配法意思是首先找到最大的内存空间进行分配&#xff0c; 对于请求的5K存储空间&#xff0c;首先找到地址200K容量为56K的地方进行分配&#xff0c;然后剩余51K。 再对请求的15K进行分配&…

自适应滤波器更新算法-EP1

自适应滤波器更新算法-EP1 自适应滤波器是回声消除系统中非常重要的一个功能模块&#xff0c;而对于自适应滤波器来说&#xff0c;如果更新滤波器系数则是关键所在。本文将介绍几种现有的滤波器更新算法&#xff0c;并附上Matlab测试代码。 1、LMS算法 1.1算法原理 LMS算法即…

自适应神经网络算法原理,单神经元自适应控制

关于神经网络自适应控制求助 这句话你可以直接用&#xff0c;不用加引用。因为这句话是很容易验证的。在网络层数、隐含层节点数逐渐增加&#xff0c;训练次数增加之后&#xff0c;他的拟合能力也是不断增加的&#xff0c;所以说&#xff0c;他可以以任意精度逼近任何非线性连…

【转载】梯度下降算法的参数更新公式

NN这块的公式&#xff0c;前馈网络是矩阵乘法。损失函数的定义也是一定的。 但是如何更新参数看了不少描述&#xff0c;下面的叙述比较易懂的&#xff1a; 1、在吴恩达的CS229的讲义的第四页直接给出参数迭代公式 在UFLDL中反向传导算法一节也是直接给出的公式 2、例子&#x…

Java中Comparator的个人简单理解(升序降序)与使用

目录 Java自定义排序返回值简单记忆理解实践LInkedList升序&#xff08;默认情况&#xff09;降序 PriorityQueue升序下的小顶堆&#xff08;默认情况&#xff09;降序下的大顶堆 总结补充数组类型自定义排序降序排序 数组 Java自定义排序返回值简单记忆理解 默认情况下&#…

深度残差收缩网络(从信号降噪的角度进行理解)

本文探讨了深度残差收缩网络的另一种理解方式。 传统信号降噪算法的常见步骤是&#xff1a; ① 采用某种信号变换方法&#xff08;例如小波、经验模态分解&#xff09;&#xff0c;将含噪信号变换到另外一种形态&#xff08;例如小波系数、本征模态分量等&#xff09;。在这些…

NIPS 2016 深度学习 迁移学习 ---残差转移网络用于无监督领域自适应

深度学习的成功得益于大量的标注数据&#xff0c;而数据标注是非常消耗资源的。当一个问题中缺少标注数据时&#xff0c;可以从另一个源中所学知识迁移过来&#xff0c;并且用于新问题中。 清华大学的学者提出了一种新的方法&#xff08;https://arxiv.org/pdf/1602.04433.pdf&…

深度残差网络+自适应参数化ReLU激活函数(调参记录21)Cifar10~95.12%

本文在调参记录20的基础上,将残差模块的个数,从27个增加到60个,继续测试深度残差网络ResNet+自适应参数化ReLU激活函数在Cifar10数据集上的表现。 自适应参数化ReLU函数被放在了残差模块的第二个卷积层之后,这与Squeeze-and-Excitation Networks或者深度残差收缩网络是相似…

已知两个长度分别为m 和 n 的升序链表,合并降序链表,求时间复杂度

王道数据结构上一道题&#xff1a; 之前我看到一个电子版的书&#xff0c;上边答案解析写的有点错误&#xff0c; 听说有些同学买的实体书上&#xff0c;答案解析也是这样写的 这个是刊印错误&#xff0c;很显然2Max( m , n )大于等于 m n 而且这个解析也不够清晰。 解析&a…

波束形成 常见自适应波束形成算法信(干)噪比增益影响因素

0、其他补充 均匀线阵波束形成器的信噪比增益上确界可由下式表示&#xff1a; 其中为阵元数&#xff0c;所以为了方便起见&#xff0c;一般的稳健自适应波束形成算法在仿真过程中的阵元数量均设置为10。 阵列的导向矢量可由下式表示&#xff1a; 以首个阵元为参考阵元&#xff…

两个升序链表合并成一个降序链表的时间复杂度

王道考研P7 第六题 【2013年统考真题】已知两个长度分别为m和n的升序链表&#xff0c;若将它们合并为长度为mn的一个降序链表&#xff0c;则最坏情况下的时间复杂度是&#xff08;&#xff09; A. O(n) B. O(mn) C. O(min(m,n)) D. O(max(m,n)) 答案是D 注意&#xff0c;此题…

无线传感器网络路由优化中的能量均衡LEACH改进算法

文章目录 一、理论基础1、LEACH算法概述2、改进的LEACH算法 二、算法流程图三、仿真实验与分析四、参考文献 一、理论基础 1、LEACH算法概述 请参考这里。 2、改进的LEACH算法 改进的LEACH算法&#xff08;LEACH-N&#xff09;主要针对LEACH算法分簇阶段的缺陷而改进的&…

机器学习之自适应增强(Adaboost)

1.Adaboost简介 **Adaptive boosting(自适应增强)是一种迭代算法&#xff0c;其核心思想是针对同一个训练集训练不同的弱分类器&#xff0c;然后把这些弱分类器集合起来&#xff0c;构成一个强分类器&#xff0c;Adaboost可处理分类和回归问题。了解Adaboost算法之前&#xff…

自适应阈值(adaptiveThreshold)分割原理及实现

背景介绍及原理 前面介绍了OTSU算法和最大熵算法&#xff0c;但这两种算法都属于全局阈值法&#xff0c;所以对于某些光照不均的图像&#xff0c;这种全局阈值分割的方法会显得苍白无力&#xff0c;如下图&#xff1a; 显然&#xff0c;这样的阈值处理结果不是我们想要的&…

优化算法+神经网络:神经网络自动参数优化

当智能群优化算法遇上神经网络 优化算法进行神经网络的参数寻优&#xff0c;解放深度调参1.已经实现的Genetic Algorithm优化Neural Network2.已经实现的PSO优化Neural Network3.已实现的SSA[^1]优化Neural Network 三种方法的可视化搜索过程对比三种优化算法性能总结总结目前来…

Java stream().sorted()实现排序(升序、降序、多字段排序)

1 自然排序 sorted()&#xff1a;自然排序&#xff0c;流中元素需实现Comparable接口 package com.entity;import lombok.*;Data ToString AllArgsConstructor NoArgsConstructor public class Student implements Comparable<Student> {private int id;private String …

linux centos查找某个文件,Linux查找命令(文件、文件中的关键字)

1、grep &#xff1a;查找文件中的内容 $ grep [option] pattern [file] 例&#xff1a; $ grep un day Sunday 例: $grep include doulinked.c doulinked1.c doulinked.c:#include doulinked.c:#include doulinked.c:#include doulinked1.c:#include doulinked1.c:#includ…

Linux下查找\命令(收集整理)

以下为总结&#xff0c;其实可直接跳过&#xff0c;查看locate部分&#xff0c;这个是类似windows下verything搜索工具&#xff01; 一.Linux查找文件的相关命令 常 用 命 令 简要中文说明 程序所在目录 whereis 寻找文件工具 /usr/bin find 寻找文件工具 /usr/bin l…

Linux查找命令 which和find命令

目录 前言一、which命令二、find命令 前言 一、which命令 格式&#xff1a; which [选项] 命令|程序名 #默认当找到第一个目标后不再继续查找选项说明-a查找全部内容&#xff0c;而非第一个文件-n<文件名长度>  指定文件名长度&#xff0c;指定的长度必须大于或等于所有…