当前位置: 首页 > news >正文

内存分配算法

 

一、实验目的:

实验目的: 通过编写一个内存分配模拟程序,实现首次适应算法(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年    月    日

 

 

 

相关文章:

内存分配算法

一、实验目的&#xff1a; 实验目的&#xff1a; 通过编写一个内存分配模拟程序&#xff0c;实现首次适应算法&#xff08;First Fit&#xff09;、循环首次适应算法&#xff08;Next Fit&#xff09;、最佳适应算法&#xff08;Best Fit&#xff09;和最差适应算法&#xff08…...

Hive运行错误

Hive 文章目录 Hive错误日志错误SessionHiveMetaStoreClientql.Driver: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskerror: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Please check …...

vue3之使用图片实现类似于 el-radio 的单选框功能,并且可实现选中和取消选中

背景 我们在工作中常用的一般都是使用类似于 element-plus 中的 el-radio 或者是 el-checkbox 来实现单选或者多选 若有一天我们遇到了一个新的业务需求,需要使用 图片 来实现类似于 el-radio 的功能,并且要求实现第一次点击时处于选中状态,当我们再次点击时处于非选中状态…...

Vue 安装vue

1、官网安装下载安装nodejs 2、安装完成后&#xff0c;通过命令查看版本,可以查看到版本 node -v npm -v 3、安装Vue CLi npm install -g vue/cli 4、创建项目,vue create test 如果遇到报错&#xff1a; ERROR Error: spawn yarn ENOENT Error: spawn yarn ENOENT at ChildP…...

5月30日在线研讨会 | 面向智能网联汽车的产教融合解决方案

随着智能网联汽车技术的快速发展&#xff0c;产业对高素质技术技能人才的需求日益增长。为了促进智能网联汽车行业的健康发展&#xff0c;推动教育链、人才链与产业链、创新链的深度融合&#xff0c;经纬恒润推出产教融合相关方案&#xff0c;旨在通过促进教育链与产业链的深度…...

嵩山为什么称为三水之源

三水指黄河、淮河、济河&#xff0c;这三条河流环绕在嵩山周边。 黄河横亘在嵩山北部&#xff0c;其支流伊洛河从西南方环绕嵩山&#xff0c;然后汇入黄河。济河&#xff0c;古称济水&#xff0c;源自济源王屋山&#xff0c;自身河道在东晋时代被黄河夺占&#xff0c;从此消失。…...

最新文章合集

GitHub宝藏项目&#xff1a;每天一个&#xff0c;让你的技术库增值不停&#xff01; STORM、SuperMemory、Awesome Chinese LLM、AI写作助手、资料搜集、文章生成、视角问题引导、模拟对话策略、内容导入、浏览器插件、资源库、开源微调模型 开发者必看&#xff1a;Linux终端…...

Jmeter预习第1天

Jmeter参数化&#xff08;重点&#xff09; 本质&#xff1a;使用参数的方式来替代脚本中的固定为测试数据 实现方式&#xff1a; 定义变量&#xff08;最基础&#xff09; 文件定义的方式&#xff08;所有测试数据都是固定的情况下[死数据]&#xff0c;eg:注册登录&#xff0…...

Volatile的内存语义

1、volatile的特性 可见性&#xff1a;对一个volatile变量的读&#xff0c;总能够看到任意一个线程对这个volatile变量的写入。 原子性&#xff1a;对任意单个volatile变量的读/写具有原子性&#xff0c;但类似于volatile这种复合操作不具有原子性。 接下来我们用程序验证。…...

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB&#xff0c;各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来&#xff0c;以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …...

前端如何在 WebSocket 的请求头中使用标准 HTTP 头携带 Authorization 信息,添加请求头

WebSocket 的请求头(header)中如何携带 authorization...

Java---图书管理系统(练习版)

1.主函数 import book.Book; import book.BookList; import user.AdminUser; import user.NormalUser; import user.User;import java.util.Scanner;public class Main {public static User Login(){//确认你的身份System.out.println("请输如你的名字");Scanner sc…...

ICML2024 定义新隐私保护升级:DP-BITFIT新型微调技术让AI模型学习更安全

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;差分隐私在大模型微调中的重要性和挑战 在当今的深度学习领域&#xff0c;大型预训练模型的微调已成为提高各种任务性能的关键技术。然而&am…...

网络空间安全数学基础·整除与同余

主要内容&#xff1a; 整除的基本概念&#xff08;掌握&#xff09; 素数&#xff08;掌握&#xff09; 同余的概念&#xff08;掌握&#xff09; 1.1整除 定义&#xff1a;设a&#xff0c;b是任意两个整数&#xff0c;其中b≠0&#xff0c;如果存在一个整数q&#xff0c;使 …...

同旺科技 FLUKE ADPT 隔离版发布 ---- 说明书

所需设备&#xff1a; 1、FLUKE ADPT 隔离版 内附链接&#xff1b; 应用于&#xff1a;福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于&#xff1a;福禄克Fluke 15B / 17B / 18B...

云计算-角色、特性和模型 (Roles, Characteristics, and Models)

角色、特性和模型 (Roles, Characteristics, and Models) 角色和边界 (Roles and Boundaries) 为了识别云计算模型&#xff0c;我们首先需要了解各种参与者的角色和边界。由于云系统通常遵循面向服务的模型&#xff0c;我们需要了解服务提供者和服务订阅者之间的边界。我们将遵…...

介绍一下Hugging Face,这个公司的背景是什么

Hugging Face是一家成立于2016年的人工智能公司&#xff0c;专注于为AI研究人员和开发者提供开源模型库和工具。以下是关于Hugging Face公司的详细背景介绍&#xff1a; 公司历史与创始人&#xff1a; Hugging Face由Clment Delangue、Julien Chaumond和Thomas Wolf三位法国籍…...

【C++高阶(一)】继承

目录 一、继承的概念 1.继承的基本概念 2.继承的定义和语法 3.继承基类成员访问方式的变化 ​编辑 4.总结 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 1.派生类中的默认构造函数 2.派生类中的拷贝构造函数 3.派生类中的移动构造函数…...

AI原生嵌入式矢量模型数据库ChromaDB-部署与使用指南

在人工智能大模型领域&#xff0c; 离不开NLP技术&#xff0c;在NLP中词向量是一种基本元素&#xff0c;如何存储这些元素呢&#xff1f; 可以使用向量数据库ChromeDB Chroma Chroma 是 AI 原生开源矢量数据库。Chroma 通过为 LLM 提供知识、事实和技能&#xff0c;使构建 L…...

c# 画一个正弦函数

1.概要 c# 画一个正弦函数 2.代码 using System; using System.Drawing; using System.Windows.Forms;public class SineWaveForm : Form {private const int Width 800;private const int Height 600;private const double Amplitude 100.0;private const double Period…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...