操作系统实验动态分区

FF首次适应算法与BF最佳适应算法(C++实现) 首次适应算法(First Fit):该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。 最佳适应算法(Best Fit):该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的, 阅读详情

实验目的

1.详细了解系统之中是如何存储进程的。

2.通过实验加强对基于顺序搜索的动态分区分配算法的理解和掌握。

3.加深理解有关存储结构的概念。

4.主存的分配和回收的实现与主存储器的管理方式有关的,通过本次实验帮助学生理解在可变分区管理方式下是怎样实现主存空间的分配和回收。

实验原理

1.动态分区分配是根据进程的实际需要,动态地为作业从可用内存中划分出一个分区,刚好能满足作业的实际需要。而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出以分区分配给该算法。

2.在本次实验中运用四种算法,分别是首次适应算法、循环首次适应算法、最坏适应算法和最佳适应算法。

整个程序的大致流程

 

首次适应算法流程图

 

循环首次适应算法流程图

 

最佳适应算法流程图

 

 最坏适应算法流程图

 

 

public class DPA {

    public Memory FF(Memory memory, int size) {
        int sum = 0;
        for (int i = 0; i < memory.getHoles().size(); i++) {    //循环内存中所有分区
            sum++;
            memory.setLastPoint(i);  //为循环首次适应算法设置最后寻址的下标
            Hole hole = memory.getHoles().get(i);   //获得对应的分区
            if (hole.isFree() && hole.getSize() >= size) {  //若此分区空闲且大小大于申请的大小,则申请内存
                System.out.println("查找" + sum + "次");
                return memory.getMemory(size, i, hole);
            }
        }
        System.err.println("内存不够");
        return memory;
    }

    public Memory NF(Memory memory, int size) {
        Hole hole = memory.getHoles().get(memory.getLastPoint());
        if (hole.isFree() && hole.getSize() >= size) {  //判断最后寻址的分区的大小是否足够
            return memory.getMemory(size, memory.getLastPoint(), hole);
        }
        int length = memory.getHoles().size();
        int sum = 0;    //为区分与首次适应算法循环次数所设置
        //如果不够,则从下一个分区开始循环
        for (int i = (memory.getLastPoint() + 1) % length; i != memory.getLastPoint(); i = (i + 1) % length) {
            sum++;
            memory.setLastPoint(i);
            hole = memory.getHoles().get(i);
            if (hole.isFree() && hole.getSize() >= size) {
                System.out.println("查找" + sum + "次");
                return memory.getMemory(size, i, hole);
            }
        }
        System.err.println("内存不够");
        return memory;
    }

    public Memory BF(Memory memory, int size)  {
        int findIndex = -1;         //最佳分区的下标
        int min = memory.getSize(); //min存储当前找到的最小的合适的分区大小
        for (int i = 0; i < memory.getHoles().size(); i++) {
            Hole hole = memory.getHoles().get(i);
            if (hole.isFree() && hole.getSize() >= size) {
                if (min > hole.getSize() - size){   //若当前找到的分区大小比min还要合适(剩余空间更小),则修改其值
                        min = hole.getSize() - size;
                    findIndex = i;
                }
            }
        }
        if (findIndex != -1) {  //若存在合适分区
            return memory.getMemory(size, findIndex, memory.getHoles().get(findIndex));
        }
        System.err.println("内存不够");
        return memory;
    }

    public Memory WF(Memory memory, int size) {
        int findIndex = -1;
        int max = 0;
        for (int i = 0; i < memory.getHoles().size(); i++) {
            Hole hole = memory.getHoles().get(i);
            if (hole.isFree() && hole.getSize() >= size) {
                if (max < hole.getSize() - size){
                    max = hole.getSize() - size;
                    findIndex = i;
                }
            }
        }
        if (findIndex != -1) {
            return memory.getMemory(size, findIndex, memory.getHoles().get(findIndex));
        }
        System.err.println("内存不够");
        return memory;
    }

    public void showMemory(Memory memory) {
        System.out.println("------------------------------------");
        System.out.println("分区编号\t分区始址\t分区大小\t空闲状态\t");
        System.out.println("------------------------------------");
        for (int i = 0; i < memory.getHoles().size(); i++){
            Hole hole = memory.getHoles().get(i);
            System.out.println(i + "\t\t" + hole.getHead() + "\t\t" + hole.getSize() + "  \t" + hole.isFree());
        }
        System.out.println("------------------------------------");
    }

}

 

public class Hole {

    private int head;       //内存块的起始地址
    private int size;       //内存块的大小
    private boolean isFree; //内存块的空闲状态

    public Hole(int head, int size) {
        this.head = head;
        this.size = size;
        this.isFree = true;
    }

    @Override
    public String toString() {
        return "Hole{" +
                "head=" + head +
                ", size=" + size +
                ", isFree=" + isFree +
                '}';
    }

    public int getHead() {
        return head;
    }

    public void setHead(int head) {
        this.head = head;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public boolean isFree() {
        return isFree;
    }

    public void setFree(boolean free) {
        isFree = free;
    }
}
public class Memory {
    private int size;                       //内存块大小
    private int LastPoint;                   //上次寻址结束的下标
    private LinkedList<Hole> holes;         //记录内存块分区的双向链表
    private static final int MIN_SIZE = 5;  //最小剩余分区大小

    public Memory getMemory(int size, int location, Hole hole) {    //size为申请大小 location为分配分区的下标 hole为location对应的分区
        if (hole.getSize() - size >= MIN_SIZE) {                    //若分配后当前分区剩余大小大于最小分区大小,则把当前分区分为两块
            Hole newHole = new Hole(hole.getHead() + size, hole.getSize() - size);
            holes.add(location + 1, newHole);
            hole.setSize(size);
        }
        hole.setFree(false);    //设置当前分区为非空闲状态
        System.out.println("成功分配大小为" + size + "的内存");
        return this;
    }

    public Memory releaseMemory(int id) {
        Hole hole = holes.get(id);  //此id为分区id
        if (hole.isFree()) {
            System.out.println("此分区空闲,无需释放:\t" + id);
            return this;
        }
        //如果回收分区不是尾分区且后一个分区为空闲, 则与后一个分区合并
        if (id < holes.size() - 1 && holes.get(id + 1).isFree()) {
            Hole nextHole = holes.get(id + 1);
            hole.setSize(hole.getSize() + nextHole.getSize());
            holes.remove(nextHole);
        }
        //如果回收分区不是首分区且前一个分区为空闲, 则与前一个分区合并
        if (id > 0 && holes.get(id - 1).isFree()) {
            Hole lastHole = holes.get(id - 1);
            lastHole.setSize(hole.getSize() + lastHole.getSize());
            holes.remove(id);
            id--;
        }
        holes.get(id).setFree(true);
        System.out.println("内存回收成功!");
        return this;
    }

    public Memory(int size) {
        this.size = size;
//        this.pcbs = new LinkedList<>();
        this.holes = new LinkedList<>();
        holes.add(new Hole(0, size));
    }

    @Override
    public String toString() {
        return "Memory{" +
                "size=" + size +
                ", holes=" + holes.toString() +
                '}';
    }

    public int getLastPoint() {
        return LastPoint;
    }

    public void setLastPoint(int lastFind) {
        this.LastPoint = lastFind;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public LinkedList<Hole> getHoles() {
        return holes;
    }

    public void setHoles(LinkedList<Hole> holes) {
        this.holes = holes;
    }

    public static int getMinSize() {
        return MIN_SIZE;
    }

}
public class Test1 {

    public static void main(String[] args) {
        DPA dpa = new DPA();
        Scanner sr = new Scanner(System.in);

        System.out.print("初始化内存大小:");
        System.out.println();
        Memory memory = new Memory(sr.nextInt());
        System.out.println("初始化成功!");
        while (true) {
            System.out.print("请输入操作数(0、结束进程\t1、申请内存\t2、释放内存):");
            switch (sr.nextInt()) {
                case 0:
                    System.exit(0);
                    break;
                case 1:
                    System.out.print("请选择算法(1、首次适应算法\t2、循环首次适应算法\t3、最佳适应算法\t4、最坏适应算法):");
                    int algorithm = sr.nextInt();
                    System.out.print("请输入申请大小:");
                    int size = sr.nextInt();
                    switch (algorithm) {
                        case 1:
                            memory = dpa.FF(memory, size);
                            break;
                        case 2:
                            memory = dpa.NF(memory, size);
                            break;
                        case 3:
                            memory = dpa.BF(memory, size);
                            break;
                        case 4:
                            memory = dpa.WF(memory, size);
                            break;
                        default:
                            System.out.println("操作取消");
                            break;
                    }
                    dpa.showMemory(memory);
                    break;
                case 2:
                    System.out.print("请输入需要释放的分区id或进程id:");
                    int id = sr.nextInt();
                    System.out.println();
                    memory = memory.releaseMemory(id);
                    dpa.showMemory(memory);
                    break;
                default:
                    System.err.println("未知标识符");
                    break;
            }
        }
    }

}

实例分析首次适应算法、最佳适应算法、最差适应算法 关于首次适应算法、最佳适应算法和最差适应算法,先看一下百度百科的解释,已经说出了三者的最大区别。 首次适应算法(first-fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。 最佳适应算法(best-fit):从全部空闲区中找出能满足作业要求的,且大小最小的空闲分区,这种方法能使碎片尽量小。 最差适应算法(worst-fit) 阅读详情

相关推荐

操作系统实验七:动态分区分配方式的模拟

一、实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 二、实验环境 硬件环境:计算机一台,局域网环境; 软件环境: Windows或Linux操作系统, C语言编程环境。 三、实验内容 1、用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。 2、假设初始状态下,可用的内存空间为640KB,并有下列的请求序列

努力学习的小菜同学 2万+

【操作系统】动态分区分配算法(附代码)

在进行内存分配时,从链首开始顺序查找,直到找到一块分区的大小可以满足需求时,按照该作业的大小,从该分区中分配出内存,将剩下的空闲分区仍然链在空闲分区链中。:将空闲分区链中的空闲分区按照空闲分区由小到大的顺序排序,从而形成空闲分区链。:分配内存时不是从链首进行查找可以分配 内存的空闲分区,而是从上一次分配内存的空闲分区的下一个分区开始查找, 直到找到可以为该进程分配内存的空闲分区。:与最佳适应算法刚好相反,将空闲分区链的分区按照从大到小的顺序排序形成空闲分区链,每次查找时只要看第一个空闲分区是否满足即可。

守夜人 6656

操作系统实验—动态分区分配算法

模拟动态分区分配的5个算法和回收算法:BF、WF、FF、NF

weixin_55743328的博客 1873

操作系统主存储器空间的分配和回收 最佳适应算法(C++)

一、实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 二、实验要求 1.在可变分区管理方式下采用

weixin_45623750的博客 8132

操作系统 实验3【动态分区存储管理】

操作系统 实验3【动态分区存储管理】

upward 1万+

操作系统 实验七 动态分区分配方式的模拟

实验七 动态分区分配方式的模拟 一、实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 二、实验环境 硬件环境:计算机一台,局域网环境; 软件环境: Windows或Linux操作系统, C语言编程环境。 三、实验内容 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。 假设初始状态下

weixin_46698891的博客 7596

操作系统实验——动态分区分配方式的模拟

超有意思一定要看看【滑稽】 代码思路来源学校的慕课给出的代码,自己敲了一遍进行了亿点点改动 不过核心思路没变,异常处理什么的没有

cos的博客 2480

首次适应算法 最佳适应算法 循环首次适应算法 

分配算法 首次适应算法 最佳适应算法 循环首次适应算法 有流程图 源代码

操作系统实验:动态分区算法实现

操作系统实验:动态分区算法实现 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供了一个操作系统实验中的动态分区算法实现,包括首次适应算法(First Fit)、循环首次适应算法(Next Fit)、最佳适应算法(Best Fit)和最坏适应算法(Worst Fit)。代码主体并非原创,但在测试过程中发现了一些问题,经过本人修改后上传。 功能描述 首次适应算法(F...

gitblog_09817的博客 530

操作系统实验四主存空间的分配与回收首次适应算法和循环首次适应算法.docx

操作系统实验四主存空间的分配与回收首次适应算法和循环首次适应算法

循环首次适应和首次适应算法流程图.doc

循环首次适应和首次适应算法流程图.doc

操作系统原理实验-动态分区分配方式的模拟

文章目录1.实验目的2.实验内容和要求3.主要仪器设备4.实验原理5.预备知识5.源程序7.实验步骤与调试8.实验结果与分析 1.实验目的 了解动态分区分配方式中使用的数据结构和分配算法,进一步加深对动态分区存储管理方式及其实现过程的理解。 2.实验内容和要求 1.用C或其他语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。 2.设置初始状态,每次分配和回收后显示出空闲内存分区链的情况。 3.主要仪器设备 仪器: PC机 实验环境: Ubuntu16.04 编程语言:C++

Kni9hT's Blog 3758

雷达信号处理DDC数字下变频

由于接收到的雷达信号频率较高,不能对其进行直接采样并数据处理,所以需要对雷达信号进行预处理,在降低其采样率的同时,将其由中频降低到低频,然后对输出的基带信号进行后续的解析,以便于获取雷达信号的特征参数。 本文采用数字正交下变频,将单通道信号转化为正交双通道信号,数字下变频(DDC)的原型为模拟下变频,通过对窄带雷达信号或单频信号进行数字混频,然后对信号进行正交采样,提取 I、Q 两路正交分量,最后通过滤波去除信号中的高频分量,将信号由中高频搬移至低频。 模拟下变频的系统框图如下: 其数学推导.

qq_44033461的博客 5226

操作系统实验·动态分区分配算法

【实验目的】 1、 熟悉内存自由空闲队列的分配策略 2、 熟悉内存分区的回收原则及实现过程 3、 通过实验深刻理解主存管理的内容 【实验内容】 模拟内存的动态分配和回收,并编程实现。 【实验报告】 1、 列出调试通过程序的清单,并附上文档说明。 2、 总结上机调试过程中所遇到的问题和解决方法及感想。 【实验说明】 实验原理 内存的分配可采用操作系统中的首次适应算法、最佳适...

居贝比的博客 1万+

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片中。

视觉与物联智能 938

操作系统实验三——动态分区分配方式的模拟

操作系统实验三——动态分区分配方式的模拟 【下载地址】操作系统实验三动态分区分配方式的模拟 这是一个专注于操作系统存储器管理的开源项目,旨在帮助学生深入理解动态分区分配方式的原理与实现。通过模拟系统,学生可以实践最先适应、最佳适应、最坏适应等常用存储器分配算法,掌握存储器的分配与回收机制。项目注重培养独立解决问题的能力,...

gitblog_06758的博客 412

【K8S系列】Kubernetes Pod节点CrashLoopBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中,Pod 的状态为 **`CrashLoopBackOff`** 表示某个容器在启动后崩溃,Kubernetes > 尝试重启该容器,但由于持续崩溃,重启的间隔时间逐渐增加。下面将详细介绍 `CrashLoopBackOff > `状态的原因、解决方案及相关命令的输出解释。

颜淡慕潇 8379

操作系统实验之动态分区分配算法

一、实验内容 设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,Pn,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,Sm,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。 二、C++代码 #inclu...

qq_41696136的博客 3091

203.华为组网实例:VLAN间互通DHCP中继实验

SW核心交换机上配置DHCP中继。

迷逝 8430

【点云概述】什么是点云、来源、种类、特点、处理?

【点云概述】什么是点云、来源、种类、特点、处理?点云(point cloud)是空间中点的数据集,可以表示三维形状或对象,通常由三维扫描仪获取。点云中每个点的位置都由一组笛卡尔坐标 ( X , Y , Z ) (X, Y, Z) (X,Y,Z)描述,有些可能含有色彩信息 ( R , G , B ) (R, G, B) (R,G,B)或物体反射面强度(Intensity)信。

智慧空间实验室 9812

动态分区分配(java) 操作系统实验

四种方法就不多介绍了,别的可以看,只是学生作品记录,做的地方还有许多不足 1.比如说当剩余空间Space的start = end相等时没有删除该剩余空间,反正是不想想了 2.还有的就是main方法只能理解过后才明白它在干什么,不能很清晰的设计程序步骤 3.ps:应付作业,我真可恶啊 package OS.Memory.T2; import java.util.*; public class Memory { public static void main(String[] args) {

skfenqizhe的博客 1095

手把手教你学Simulink--基于光伏(PV)系统的建模与仿真场景:-不同天气条件下光伏系统的输出性能分析

本文介绍了使用Simulink和Simscape Electrical工具箱进行光伏系统建模与仿真的完整流程。内容涵盖准备工作、模型构建、仿真分析三大步骤,重点演示了如何模拟不同天气条件(光照强度、温度变化)对光伏输出性能的影响。通过添加PVArray模块、配置参数、设置环境变化条件、连接测量仪器等操作,实现了光伏系统在动态天气条件下的输出特性分析。文章还提供了仿真参数设置建议和结果分析方法,帮助用户理解环境因素与光伏性能的关联性,为光伏系统设计和优化提供参考。

MHD0815的博客 188

操作系统实验三:内存管理(动态分区分配方式的模拟算法)

操作系统实验三:内存管理(动态分区分配方式的模拟算法) 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库包含操作系统实验三的完整资源,主要围绕内存管理中的动态分区分配方式进行模拟。资源包括实验报告、源代码、可执行文件以及相关截图,旨在帮助理解动态分区分配算法的实现与操作。 内容 实验报告:详细介绍了实验目的、原理、实现过程及结果分析。 源代码:包含了动态分区分配算法...

gitblog_06711的博客 342

泛微OA提交流程到下一个节点

泛微OA后端接口强制流程归档

CXYCMY的博客 2245

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

动态分区分配算法(操作系统实验 C++)

通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。

落灬枫的博客 3533

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 操作系统课设 银行家算法
下一篇: 操作系统调度算法
java洲
博客等级 码龄6年 5粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值