内存分配算法

 

一、实验目的:

实验目的: 通过编写一个内存分配模拟程序,实现首次适应算法(First Fit)、循环首次适应算法(Next Fit)、最佳适应算法(Best Fit)和最差适应算法(Worst Fit),对比这些算法在内存管理中的性能表现,加深对内存分配策略的理解。

 

实验设备与实验环境:

计算机,Java编译系统,idea,ChatGPT

 

二、实验程序设计内容:

  1. 实现一个MemoryAllocation类,包含首次适应算法(firstFit())、循环首次适应算法(nextFit())、最佳适应算法(bestFit())和最差适应算法(worstFit())方法,以及打印内存状态的方法printMemory()。
  2. 在Main类中初始化一个内存空间,并通过MemoryAllocation类模拟不同的内存分配算法,输出内存分配结果,以及每种算法的性能表现。
  3. 通过比较不同算法的内存分配效果,总结各算法在实际应用中的优缺点,加深对内存管理策略的理解。

三、实验程序设计思路及流程图

  1. 在MemoryAllocation类中,实现首次适应算法、循环首次适应算法、最佳适应算法和最差适应算法的具体逻辑。
  2. 在Main类中,初始化内存空间并调用MemoryAllocation类中的不同算法方法,观察内存分配情况,并输出各算法的性能表现。
  3. 根据实验结果,分析不同算法的优缺点,理解各算法在不同场景下的适用性和性能表现。

 

四、实验源程序及注释:

package homework.os;/*** Date:2024/5/25  22:14* Description:mem allocation** @author Leon* @version 1.0*/class MemoryAllocation {private int[] memory;public MemoryAllocation(int memorySize) {memory = new int[memorySize];}public int firstFit(int processSize) {for (int i = 0; i < memory.length; i++) {int count = 0;int startIndex = -1;if (memory[i] == 0) {startIndex = i;while (i < memory.length && memory[i] == 0 && count < processSize) {count++;i++;}if (count == processSize) {for (int j = startIndex; j < startIndex + processSize; j++) {memory[j] = 1;}return startIndex;}}}return -1;}public int nextFit(int processSize) {int startIndex = 0;for (int i = 0; i < memory.length; i++) {if (memory[i] == 0) {if (i - startIndex >= processSize) {for (int j = startIndex; j < startIndex + processSize; j++) {memory[j] = 1;}return startIndex;}} else {startIndex = i + 1;}}return -1;}public int bestFit(int processSize) {int bestFitIndex = -1;int minHoleSize = Integer.MAX_VALUE;int currentHoleSize = 0;for (int i = 0; i < memory.length; i++) {if (memory[i] == 0) {currentHoleSize++;} else {if (currentHoleSize >= processSize && currentHoleSize < minHoleSize) {bestFitIndex = i - currentHoleSize;minHoleSize = currentHoleSize;}currentHoleSize = 0;}}if (currentHoleSize >= processSize && currentHoleSize < minHoleSize) {bestFitIndex = memory.length - currentHoleSize;}if (bestFitIndex == -1) {return -1;}for (int i = bestFitIndex; i < bestFitIndex + processSize; i++) {memory[i] = 1;}return bestFitIndex;}public int worstFit(int processSize) {int worstFitIndex = -1;int maxHoleSize = 0;int currentHoleSize = 0;for (int i = 0; i < memory.length; i++) {if (memory[i] == 0) {currentHoleSize++;} else {if (currentHoleSize > maxHoleSize) {maxHoleSize = currentHoleSize;worstFitIndex = i - currentHoleSize;}currentHoleSize = 0;}}if (currentHoleSize > maxHoleSize) {maxHoleSize = currentHoleSize;worstFitIndex = memory.length - currentHoleSize;}if (worstFitIndex == -1) {return -1;}for (int i = worstFitIndex; i < worstFitIndex + processSize; i++) {memory[i] = 1;}return worstFitIndex;}public void printMemory() {for (int cell : memory) {System.out.print(cell + " ");}System.out.println();}
}public class exm7_MemoryAllocation {public static void main(String[] args) {MemoryAllocation memoryAllocation = new MemoryAllocation(20);System.out.println("First Fit:");System.out.println(memoryAllocation.firstFit(3));memoryAllocation.printMemory();System.out.println("Next Fit:");System.out.println(memoryAllocation.nextFit(4));memoryAllocation.printMemory();System.out.println("Best Fit:");System.out.println(memoryAllocation.bestFit(5));memoryAllocation.printMemory();System.out.println("Worst Fit:");System.out.println(memoryAllocation.worstFit(2));memoryAllocation.printMemory();}
}

 

五、实验程序测试过程及解释说明

调用Main方法分别对四个内存分配算法进行调试

 

六、实验程序测试过程与结果分析、

First Fit:

0

1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Next Fit:

3

1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Best Fit:

7

1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0

Worst Fit:

12

1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0

 

Process finished with exit code 0

 

七、理论学习与实践能力锻炼方面的个人心得体会

通过本次实验,我深入了解了首次适应算法、循环首次适应算法、最佳适应算法和最差适应算法在内存分配中的应用和性能特点。观察实验结果可以发现,不同算法在内存分配中的表现有所差异,例如,最佳适应算法可以更好地利用碎片空间,而最差适应算法可能造成更多的碎片等。通过比较不同算法的表现,我对内存管理中不同的分配策略有了更深入的理解,为进一步学习和研究操作系统提供了有益的参考。

 

 

                

实验评价及结论:

 

实验目的明确、设计内容符合要求,独立完成了操作系统存储器管理的内存分配算法程序设计任务且源程序与注释、测试过程记录完整正确,能够很好地将课程理论运用于解决实际问题;实验报告内容完整,态度认真,总体质量优秀。

 

 

 

实验指导老师签字:                                   2024年    月    日

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pytorch】【MacOS】14.m1芯片使用mps进行深度模型训练

读者要先自行安装python以及anaconda&#xff0c;并且配置pytorch环境 第一步 测试环境 import torch # 判断macOS的版本是否支持 print(torch.backends.mps.is_available()) # 判断mps是否可用 print(torch.backends.mps.is_built())如果第一个语句为False&#xff0c;说明当前…

Python简介

Python简介 1. Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构&#xff0c;它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言&#xff1a; 开发过程中没有了编译这个环…

AIGC-常见图像质量评估MSE、PSNR、SSIM、LPIPS、FID、CSFD,余弦相似度----理论+代码

持续更新和补充中…多多交流&#xff01; 参考: 图像评价指标PNSR和SSIM 函数 structural_similarity 图片相似度计算方法总结 MSE和PSNR MSE: M S E 1 m n ∑ i 0 m − 1 ∑ j 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 MSE\frac{1}{mn}\sum_{i0}^{m-1}\sum_{j0}^{n-1}[…

汽车展厅应用客流统计,洞察客户规律,完成热门车型分析

在汽车展厅中&#xff0c;客流统计正逐渐成为一项不可或缺的重要工具&#xff0c;它帮助我们洞察客户规律&#xff0c;从而能够更好地完成热门车型分析。 一、客流统计-客户画像分析 客流统计下的客户画像构建为我们提供了深入了解客户的途径。通过对进入展厅的人群进行细致分析…

Flutter 中的 InkWell 小部件:全面指南

Flutter 中的 InkWell 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;InkWell 是一个用于添加可交互元素的 widget&#xff0c;它能够响应用户的点击操作&#xff0c;并且提供了墨水涟漪动画效果&#xff0c;这是 Material Design 中的一个标准反馈机制。InkWell 可以…

(五)Python3 接口自动化测试,pytest的使用

(五)Python3 接口自动化测试,pytest的使用 简介pytest是python的单元测试框架,用于单元测试,集成测试,功能测试。 它提供了丰富的功能和灵活的用法,使得编写和运行测试变得简单而高效。 pytest框架优点: 1)简单易用:语法简洁清晰,编写测试用例友好,几分钟内上手。 …

2007NOIP普及组真题 4. Hanoi双塔问题

线上OJ&#xff1a; 【07NOIP普及组】Hanoi双塔问题 题解分析 1、本题考的其实不是Hanoi塔&#xff0c;而是瞪眼法&#xff08;数学推导&#xff09;和高精度。 2、本题不需要输出移动的顺序&#xff0c;只是输出移动的次数即可。 核心思想&#xff1a; 1、从上述图中&#x…

常见算法(3)

1.Arrays 它是一个工具类&#xff0c;主要掌握的其中一个方法是srot&#xff08;数组&#xff0c;排序规则&#xff09;。 o1-o2是升序排列&#xff0c;o2-o1是降序排列。 package test02; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparat…

LeetCode 每日一题 2024/5/20-2024/5/26

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 5/20 1542. 找出最长的超赞子字符串5/21 2769. 找出最大的可达成数字5/22 2225. 找出输掉零场或一场比赛的玩家5/23 2831. 找出最长等值子数组5/24 1673. 找出最具竞争力的…

PostgreSQL用户与角色简述

简述 PostgreSQL通过角色&#xff08;role&#xff09;来控制数据库的访问权限。角色可以拥有数据库对象&#xff08;比如表、函数等&#xff09;&#xff0c;并允许将这些对象的权限授予其他角色&#xff0c;从而实现对象访问的控制。角色&#xff08;role&#xff09;包含了…

19、设计模式之命令模式

命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式&#xff0c;它属于行为型模式。请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对…

虹科Pico汽车示波器 | 免拆诊断案例 | 2012 款雪佛兰科鲁兹车偶尔多个故障灯异常点亮

故障现象 一辆2012款雪佛兰科鲁兹车&#xff0c;搭载1.8 L 发动机&#xff0c;累计行驶里程约为9.6万km。该车组合仪表上的发动机故障灯、ABS故障灯及动力转向故障灯偶尔异常点亮&#xff0c;同时发动机转速表和发动机冷却液温度表的指针会突然归零&#xff0c;严重时发动机无…

独享IP是原生IP吗?二者有何区别?

原生IP&#xff1a; 原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中…

C++ 学习 关于无符号数的计算

C 学习 关于含无符号数表达式的计算 &#x1f308; 哈喽&#xff0c;失踪人口回归 这篇blog 来源于C 的学习 当然C语言同样适用 C Primer 的笔记 &#x1f33f;让我们从一个问题开始 如果你回答对了 那么就可以跳过了~ 对于下面的问题 //读程序写结果。 unsigned u 10,u2 42…

牛客NC367 第K个n的排列【困难 dfs,全排列问题 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1595969179464e4c940a90b36abb3c54 思路 全排列问题本文提供的答案在力扣同一道题60. 排列序列&#xff0c;超时了但是截止文章发表日&#xff0c;牛客上是能通过全部测试用例的Java代码 import java.util.*;pu…

Redis - 优惠卷秒杀

场景分析 为了避免对数据库造成压力&#xff0c;我们在新增优惠卷的时候&#xff0c;可以将优惠卷的信息储存在Redis中&#xff0c;这样用户抢购的时候访问优惠卷信息&#xff0c;通过Redis读取信息。 抢购流程&#xff1a; 业务分析 既然在新增优惠卷的时候&#xff0c;我…

【c语言】了解指针,爱上指针(5)

了解指针&#xff0c;爱上指针&#xff08;5&#xff09; 回调函数qsort函数冒泡排序模拟实现qsort函数 回调函数 回调函数&#xff1a;就是一个通过函数指针调用的函数。 把函数的指针作为参数传给另一个函数&#xff0c;当这个指针被用来调用指向的函数时&#xff0c;此时被…

【Kotlin 一】Kotlin入门知识简介、变量声明、数字类型

1. Kotlin简介 Kotlin旨在解决 Java语言在编码效率和代码质量上存在的问题&#xff0c;并且与Java语言完全兼容。Kotlin通过简化语法、提供更强大的函数以及减少样本代码的编写&#xff0c;使开发者能够更高效地编写代码。Kotlin适用于Android、Web后端开发等多种场景 2.Kotl…

PHP获取文件路径getcwd()、__DIR__、__FILE__的区别

getcwd() getcwd() 是一个函数&#xff0c;它返回当前工作目录&#xff08;CWD&#xff09;的完整路径。当前工作目录是脚本开始执行时所在的目录&#xff0c;除非在脚本执行过程中通过 chdir() 函数进行了更改。 $cwd getcwd(); echo $cwd; // 输出当前工作目录的完整路径…

驱动编译报error: negative width in bit-field ‘<anonymous>’错误

错误如下图所示&#xff1a; 代码如下&#xff1a; 问题点&#xff1a;module_param的其他用户的权限参数上。 在Linux中&#xff0c;文件权限由读(r)、写(w)、执行(x)权限组成&#xff0c;分别对应数值4、2、1。 第一位0是占位符&#xff0c;在这里没有意义&#xff0c;因为…