【操作系統】內存管理

要求:

????????1、在該實驗中,采用可變分區方式完成對存儲空間的管理(即存儲空間的分配與回收工作)。

????????2、設計用來記錄主存使用情況的數據結構:已分區表和空閑分區表。

????????3、在設計好的數據結構上設計一個主存分配算法,要求實現的基本功能操作有:尋找空閑分區,空閑分區表的修改,已分區表的修改。

????????4、在設計好的數據結構上設計一個主存回收算法。其中,若回收的分區有上鄰空閑分區和(或)下鄰空閑分區,要求合并為一個空閑分區登記在空閑分區表的一個表項里。

代碼實現:

//Main.java

package test;
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner s = new Scanner(System.in);System.out.print("請輸入內存總大小: ");int totalSize = s.nextInt();RAMManager manager = new RAMManager(totalSize);manager.disPlay();while (true) {System.out.println("\n請選擇操作:");System.out.println("分配內存:1");System.out.println("回收內存:2");System.out.println("退出:3");int choice = s.nextInt();if (choice == 3) break;switch (choice) {case 1:System.out.print("請輸入進程名: ");String name = s.next();System.out.print("請輸入分配的內存大小: ");int size = s.nextInt();if (manager.allocate(name, size)) {System.out.println("分配成功!");} else {System.out.println("分配失敗! 沒有足夠的連續空間.");}manager.disPlay();break;case 2:System.out.print("請輸入要回收內存的進程名: ");name = s.next();if (manager.breakSpace(name)) {System.out.println("回收成功!");} else {System.out.println("回收失敗! 未找到該進程.");}manager.disPlay();break;default:System.out.println("無效選擇!");}}s.close();System.out.println("程序結束!");}
}

//RAM.java

package test;
public class RAM {//分區類int start;      // 起始地址int size;       // 分區大小boolean free;   // 是否空閑String name;    // 進程名public RAM(int start, int size, boolean free, String name) {this.start = start;this.size = size;this.free = free;this.name = name;}
}

//RAMManager.java

package test;
import java.util.ArrayList;
import java.util.Comparator;
public class RAMManager { // 內存管理器類ArrayList<RAM> alreadyTable;  // 已分配分區表ArrayList<RAM> freeTable;       // 空閑分區表int sumSize;                        // 內存總大小public RAMManager(int sumSize) {     // 初始化this.sumSize = sumSize;alreadyTable = new ArrayList<>();freeTable = new ArrayList<>();freeTable.add(new RAM(0, sumSize, true, ""));}public boolean allocate(String name, int size) {     // 首次適應算法分配內存for (int i = 0; i < freeTable.size(); i++) {         // 找合適的空閑分區RAM p = freeTable.get(i);if (p.size >= size) {alreadyTable.add(new RAM(p.start, size, false, name));// 分配空閑分區if (p.size > size) {// 更新空閑分區p.start += size;p.size -= size;} else {freeTable.remove(i);                 // 若分配完移除該空閑分區}alreadyTable.sort(Comparator.comparingInt(part -> part.start));// 按起始地址排序已分配表return true;}}return false; // 分配失敗}public boolean breakSpace(String name) {     // 回收內存for (int i = 0; i < alreadyTable.size(); i++) {         // 查找要回收的分區RAM p = alreadyTable.get(i);if (p.name.equals(name)) {alreadyTable.remove(i);                 // 從已分配表中移除RAM freePart = new RAM(p.start, p.size, true, "");// 將已回收的分區加入空閑表freeTable.add(freePart);      mergeFreePartitions();                 // 合并相鄰的空閑分區freeTable.sort(Comparator.comparingInt(part -> part.start));// 按起始地址排序空閑表return true;}}return false; // 回收失敗(未找到該進程)}private void mergeFreePartitions() {     // 合并相鄰的空閑分區freeTable.sort(Comparator.comparingInt(part -> part.start));// 按地址排序for (int i = freeTable.size() - 1; i > 0; i--) {// 從后向前合并RAM prev = freeTable.get(i - 1);RAM curr = freeTable.get(i);if (prev.start + prev.size == curr.start) {  // 檢查是否相鄰prev.size += curr.size;                  // 合并分區freeTable.remove(i); }}}public void disPlay() {     // 打印各個表狀態System.out.println("\n當前內存狀態:");System.out.println("\n空閑分區表:");System.out.println("    起始地址     大小");for (RAM p : freeTable) {System.out.printf("%8d\t%d\n", p.start, p.size);}System.out.println("已分配分區表:");System.out.println("    起始地址     大小     進程名");for (RAM p : alreadyTable) {System.out.printf("%8d\t%d\t%s\n", p.start, p.size, p.name);}}
}

核心代碼流程圖:

內存分配流程圖

內存回收流程圖

運行結果:

初始化內存空間,將進程p1裝入內存中

將p2裝入內存中

裝入p3時發現內存不足

將進程p2回收后再次裝入p3,內存空間充足,成功裝入

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法筆記】5.LeetCode-Hot100-矩陣專項

1. 矩陣置零(t73) 中等難度&#xff0c;題目示例如下&#xff1a; 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用原地算法。示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&…

ORACLE 日常查詢

一. 查詢索引相關1. 查詢索引所在的表空間&#xff0c;單個索引的大小SELECT ui.table_name, us.segment_name AS index_name, us.tablespace_name,ROUND(SUM(us.bytes) / 1024 / 1024 / 1024, 2) AS total_size_GB FROM dba_indexes ui JOIN dba_segments us ON ui.index_name…

【DeepSeek實戰】17、MCP地圖服務集成全景指南:高德、百度、騰訊三大平臺接入實戰

引言:為什么MCP是地圖服務的下一代革命? 在數字化時代,位置服務已成為電商、出行、物流等行業的核心基礎設施。但單一地圖服務商的局限性日益凸顯:某外賣平臺因高德地圖API突發故障導致30分鐘訂單配送延遲,某打車軟件因百度地圖路線規劃偏差引發用戶投訴激增,某物流企業…

設計模式之【動態代理】

目錄 動態代理中存在的概念 JDK動態代理 代理工廠【ProxyFactory】實現【InvocationHandler】 目標類的接口【TargetInterface】 目標類【Target】實現了接口 測試類【JDKDynamicProxyTest】 CGLIB動態代理 添加Maven依賴 代理工廠【ProxyFactory】實現【MethodInterc…

【Linux驅動-快速回顧】一次性快速回顧TTY體系知識點(新手友好)

我將遵循一條嚴格的“問題驅動”和“演進”的邏輯線索來構建整個TTY知識體系。每引入一個新概念&#xff0c;都是為了解決前一個階段出現的問題。這樣&#xff0c;你不僅能知道“是什么”&#xff0c;更能深刻理解“為什么是這樣設計的”。 第〇階段&#xff1a;最原始的需求 …

深入淺出:讓機器聽懂世界的耳朵——梅爾頻率倒譜系數(MFCCs)

深入淺出&#xff1a;讓機器聽懂世界的耳朵——梅爾頻率倒譜系數&#xff08;MFCCs&#xff09; 在人工智能的浪潮中&#xff0c;語音識別、聲紋支付、音樂推薦等技術早已融入我們的日常生活。你是否曾好奇&#xff0c;計算機是如何理解并區分各種復雜的聲音信號的&#xff1f;…

Ubuntu22.04安裝/使用Gazebo時踩的一些坑

首先&#xff0c;本人原本打算安裝gazebo11的&#xff0c;因為官方好像不支持ubuntu22.04&#xff0c;所以要通過PPA和ROS2 humble來安裝&#xff0c;安裝過程跟著教程來的&#xff0c;也就是下面這篇 ubuntu22.04安裝gazebo11&#xff08;ROS2 Humble&#xff09;-CSDN博客 …

CPT203-Software Engineering: Introduction 介紹

目錄 1.專業名詞定義 1.1計算機軟件的定義 1.2軟件系統的定義 1.3軟件工程的定義 2.軟件的失敗與成功 2.1 失敗 2.2 成功 3.軟件開發 Professional software development 3.1 分類 3.2 專業軟件開發 professional software development 3.3專業軟件開發產品特性 3.4…

診斷工程師進階篇 --- 車載診斷怎么與時俱進?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

奧特曼論人工智能、OpenAI與創業

來自Y Combinator的YouTube視頻&#xff0c;展示了OpenAI首席執行官薩姆奧特曼分享的深刻見解。他討論了OpenAI從一個看似瘋狂的通用人工智能&#xff08;AGI&#xff09;夢想&#xff0c;如何發展成為一個全球性的現象。奧特曼強調了早期決策的關鍵性、吸引頂尖人才的策略&…

React Ref使用

受控與非受控組件 Ref 1.獲取原生dom 類組件中&#xff1a;在componentDidMount方法內使用document.getElementById的方法獲取到dom元素 1 目標dom增加ref屬性 設置為字符串 <h2 reftitleref></h2>function changeRef(){this.refs.titleref.innerHtml }2 函數組件…

地下管線安全的智能監測先鋒:智能標志樁圖像監測裝置解析?

?在城市與鄉村的地下&#xff0c;縱橫交錯的管線是能源與信息傳輸的關鍵通道。但深埋地下的電纜、燃氣管道等設施&#xff0c;因難以直觀監測&#xff0c;面臨施工誤挖、自然災害等風險。傳統防護手段力不從心&#xff0c;TLKS-PAZ01 智能標志樁圖像監測裝置的誕生&#xff0c…

Camera相機人臉識別系列專題分析之十六:人臉特征檢測FFD算法之libcvface_api.so數據結構詳細注釋解析

【關注我&#xff0c;后續持續新增專題博文&#xff0c;謝謝&#xff01;&#xff01;&#xff01;】 上一篇我們講了&#xff1a; 這一篇我們開始講&#xff1a; Camera相機人臉識別系列專題分析之十六&#xff1a;人臉特征檢測FFD算法之libcvface_api.so數據結構詳細注釋解析…

【字節跳動】數據挖掘面試題0012:數據分析、數據挖掘、數據建模的區別

文章大綱 數據分析、數據挖掘、數據建模的區別一、核心定義與目標二、技術方法差異三、應用場景對比四、三者的關聯與遞進關系五、面試應答策略 數據分析、數據挖掘、數據建模的區別 一、核心定義與目標 數據分析&#xff1a; 是對已有的數據進行收集、清洗、整理&#xff0c;并…

預警:病毒 “黑吃黑”,GitHub 開源遠控項目暗藏后門

在開源生態蓬勃發展的當下&#xff0c;黑客們也將黑手伸向了代碼共享平臺。當黑產開發者以為在共享 “行業秘笈” 時&#xff0c;殊不知已經掉入了黑客布置的陷阱 —— 看似方便的后門遠程控制源碼和游戲作弊外掛源碼等 “圈內資源”&#xff0c;實則是植入了惡意代碼的投毒誘餌…

Qt中的QProcess類

Qt中的QProcess類 QProcess 是 Qt 框架中用于啟動和控制外部進程的類&#xff0c;它屬于 QtCore 模塊。這個類提供了執行外部程序并與它們交互的功能。 一、主要功能 啟動外部程序&#xff1a;可以啟動系統上的其他可執行程序進程通信&#xff1a;通過標準輸入、輸出和錯誤流…

周任務自動化升級:N8N與多維表格無縫聯動全解析

.自動化之言&#xff1a; 在上一篇文章中&#xff0c;我們介紹了如何利用多維表格&#xff08;如飛書多維表格或Notion&#xff09;搭建一個靈活的任務管理系統。現在我們將進一步擴展這個系統&#xff0c;借助 N8N 實現周報的自動匯總與郵件發送&#xff0c;真正實現任務管理…

Go語言的web框架--gin

本章內容&#xff0c;會介紹一下gin的運用&#xff0c;以及gin框架底層的內容&#xff0c;話不多說&#xff0c;開始進入今天的主題吧&#xff01; 一.基本使用 gin框架支持前后端不分離的形式&#xff0c;也就是直接使用模板的形式。 模板是什么&#xff1f; 這里可能有同…

企業為什么需要雙因素認證?

從進入互聯網時代開始&#xff0c;密碼是我們個人日常的重要保護。但是單獨的密碼保護可能已經不再適應當前的數字化時代。密碼已經不再足夠安全最近發生的各種安全漏洞讓我重新審視網絡安全。幾行代碼可能就導致了全球數以百萬的登錄憑證被泄露。今天&#xff0c;僅僅周期性地…

Spring Boot + 本地部署大模型實現:優化與性能提升!

在Spring Boot中集成本地部署的大模型&#xff08;如LLaMA、ChatGLM等&#xff09;并進行優化&#xff0c;需要從模型選擇、推理加速、資源管理和架構設計等多方面入手。以下是完整的優化方案及實現步驟&#xff1a; 一、核心優化策略 1. 模型量化 目標&#xff1a;減少顯存占…