当前位置: 首页 > 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…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...