【存儲管理—動態不等長存儲資源分配算法】

文章目錄

    • 一、實驗目的
    • 二、實驗內容與設計思想
      • 實驗內容
      • 設計思路
    • 三、實驗代碼實現
    • 四、總結

一、實驗目的

理解動態異長存儲分區資源管理,掌握所需數據結構和管理程序,了解各種存儲分配算法的優點和缺點。

二、實驗內容與設計思想

實驗內容

1.分析unix最先適應存儲分配算法,即map數據結構,存儲分配函數malloc()和存儲釋放函數mfree(),找出與算法有關的成分;
2.修改上述與算法有關的成分,使其分別體現最佳適應分配原則和最壞適應分配原則;

設計思路

  1. 數據結構設計
    定義 5 個進程(P0-P4)共享 3 類資源(R0-R2),關鍵數據結構包括:
    avail[R]:當前可用資源數
    max[P][R]:各進程對資源的最大需求
    allot[P][R]:各進程已分配的資源
    need[P][R]:各進程仍需的資源(need = max - allot)

  2. 安全狀態檢查函數 isSafe()
    核心邏輯:
    計算各進程的需求矩陣 need
    初始化工作向量 work(可用資源)和完成標志 finish
    尋找可運行的進程(need <= work),模擬資源回收,更新work并標記進程完成
    若所有進程完成則系統安全,否則不安全

三、實驗代碼實現

#include <stdio.h>
#include <stdlib.h>typedef struct Block {int start;int size;struct Block *next;
} Block;Block *freeList;void initMemory(int size) {freeList = (Block *)malloc(sizeof(Block));freeList->start = 0;freeList->size = size;freeList->next = NULL;
}void printFreeList() {Block *current = freeList;while (current != NULL) {printf("(%d, %d)\n", current->start, current->size);current = current->next;}
}void coalesce() {Block *current = freeList;while (current != NULL && current->next != NULL) {if (current->start + current->size == current->next->start) {current->size += current->next->size;Block *temp = current->next;current->next = temp->next;free(temp);} else {current = current->next;}}
}void mfree(int start) {Block *current = freeList, *prev = NULL;while (current != NULL && current->start != start) {prev = current;current = current->next;}if (current == NULL) return;Block *newBlock = (Block *)malloc(sizeof(Block));newBlock->start = start;newBlock->size = current->size;newBlock->next = current->next;if (prev == NULL) {freeList = newBlock;} else {prev->next = newBlock;}free(current);coalesce();
}int mallocFirstFit(int size) {Block *current = freeList, *prev = NULL;while (current != NULL) {if (current->size >= size) {if (current->size == size) {if (prev == NULL) {freeList = current->next;} else {prev->next = current->next;}free(current);return current->start;} else {Block *newBlock = (Block *)malloc(sizeof(Block));newBlock->start = current->start + size;newBlock->size = current->size - size;newBlock->next = current->next;current->size = size;current->next = newBlock;return current->start;}}prev = current;current = current->next;}return -1;
}int main() {initMemory(1000);int allocated1 = mallocFirstFit(100);printf("Allocated 1: %d\n", allocated1);int allocated2 = mallocFirstFit(200);printf("Allocated 2: %d\n", allocated2);int allocated3 = mallocFirstFit(300);printf("Allocated 3: %d\n", allocated3);printFreeList();mfree(allocated1);mfree(allocated2);mfree(allocated3);printFreeList();return 0;
}

結果:
在這里插入圖片描述

四、總結

  • 遇到的問題
  1. 致命語法錯誤:行頭缺失
    遇到的問題
    函數命名沖突:malloc函數是標準庫函數,在代碼中重新定義會導致沖突。
    在這里插入圖片描述
    編譯后提示錯誤,malloc 函數是標準庫函數,重新定義會導致沖突。mfree 函數參數類型與標準庫函數不匹配。指針轉換為整數類型時需要進行類型轉換。
    參數類型不匹配:mfree函數參數類型與標準庫函數不匹配。
    類型轉換問題:指針轉換為整數類型時需要進行類型轉換。
    在這里插入圖片描述
    空閑列表更新問題:程序在分配和釋放內存后,空閑列表顯示的結果是相同的,這意味著分配和釋放操作沒有正確更新空閑列表。

通過這次實驗,我對動態異長存儲分區資源管理有了更深入的理解。我不僅掌握了所需的數據結構和管理程序,還了解了各種存儲分配算法的優缺點。在今后的學習和工作中,我將更加注重基礎知識的學習和積累,提高自己的編程能力和問題解決能力。同時,我也會更加注重代碼的質量和可維護性,養成良好的編程習慣。

對于后續的實驗,我計劃對代碼進行進一步的修改和完善,實現最佳適應分配原則和最壞適應分配原則。我相信通過不斷的實踐和學習,我能夠更好地掌握操作系統的相關知識和技能。

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

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

相關文章

快速上手 Docker:從入門到安裝的簡易指南(Mac、Windows、Ubuntu)

PS&#xff1a;筆者在五一剛回來一直搞Docker部署AI項目&#xff0c;發現從開發環境遷移到生成環境時&#xff0c;Docker非常好用。但真的有一定上手難度&#xff0c;推薦讀者多自己嘗試踩踩坑。 本篇幅有限&#xff0c;使用與修改另起篇幅。 一、Docker是什么 #1. Docker是什…

LabVIEW高沖擊加速度校準系統

在國防科技領域&#xff0c;高 g 值加速度傳感器廣泛應用于先進兵器研制&#xff0c;如深侵徹系統、精確打擊彈藥及鉆地彈藥等。其性能指標直接影響研究結果的準確性與可靠性&#xff0c;因此對該傳感器進行定期校準意義重大。高沖擊加速度校準系統具備多方面功能&#xff0c;適…

FPGA 純邏輯NVME raid0 IP核

系統采用XCZU19EG搭載4個三星990 PRO SSD 單盤讀寫不低于3GB/s 4盤總帶寬不低于12GB/s

GStreamer開發筆記(三):測試gstreamer/v4l2+sdl2/v4l2+QtOpengl打攝像頭延遲和內存

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147714800 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、O…

CATIA高效工作指南——零件建模篇(二)

一、PowerCopy特征復用技術 1.1 智能特征封裝 通過??幾何圖形集(Geometrical Set)??構建參數化特征組&#xff0c;將關聯的草圖、曲面、實體等元素進行邏輯封裝。操作流程如下&#xff1a; 創建新幾何圖形集并完成特征建模激活PowerCopy命令&#xff0c;選擇目標幾何集定…

CentOS 7 安裝OpenJDK 17 JRE

CentOS 7 自帶的java 版本為&#xff1a;java version "1.8.0_311"&#xff0c; 有些軟件的運行需要更高的java版本。CentOS 7 自帶的默認倉庫里 沒有 OpenJDK 17&#xff0c;但是 Adoptium 項目&#xff08;前身 AdoptOpenJDK&#xff09;提供了穩定的 OpenJDK 17 版…

【c++】 我的世界

太久沒更新小游戲了 給個贊和收藏吧&#xff0c;求求了 要游戲的請私聊我 #include <iostream> #include <vector>// 定義世界大小 const int WORLD_WIDTH 20; const int WORLD_HEIGHT 10;// 定義方塊類型 enum BlockType {AIR,GRASS,DIRT,STONE };// 定義世界…

angular的cdk組件庫

目錄 一、虛擬滾動 一、虛擬滾動 <!-- itemSize相當于每個項目的高度為30px --><!-- 需要給虛擬滾動設置寬高&#xff0c;否則無法正常顯示 --> <cdk-virtual-scroll-viewport [itemSize]"40" class"view_scroll"><div class"m…

視頻編解碼學習三之顯示器

整理自&#xff1a;顯示器_百度百科&#xff0c;觸摸屏_百度百科,百度安全驗證 分為陰極射線管顯示器&#xff08;CRT&#xff09;&#xff0c;等離子顯示器PDP&#xff0c;液晶顯示器LCD 液晶顯示器的組成。一般來說&#xff0c;液晶顯示器由以下幾個部分組成&#xff1a; […

尚硅谷-硅谷甄選項目記錄

一、Vue3 1 基礎配置 1.1 路徑別名 vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue// 引入path&#xff0c;node提供的模塊&#xff0c;可以獲取文件或文件夾的路徑 import path from pathexport default defineConfig({plugins: […

ThinkPHP5 case when的使用

主表的類型不同&#xff0c;需要連接查詢不同的表時&#xff0c;可以使用case when 在主表(上面的表中)的模型里面&#xff0c;寫如下代碼來獲取列表&#xff1a; $res $this->alias("p")->field([p.*,"CASE WHEN p.pd_ticket_type 1 THEN (select s.s…

Android 10.0 SharedPreferences in credential encrypted storage are not avai

1.前言 在10.0的系統rom定制化開發中,在開機的過程中,由于某些應用在開機解鎖階段就開始訪問查詢短信和聯系人等功能,所以 會出現拋異常的情況出現,接下來分析下相關的情況,然后來解決這些問題 2.SharedPreferences in credential encrypted storage are not available …

LeetCode[102]二叉樹的層序遍歷

思路&#xff1a; 題目描述從左到右一層一層的進行遍歷&#xff0c;就遍歷二叉樹的這種題我更喜歡用遞歸來做&#xff0c; 我使用java來做的&#xff0c;結果集是兩個List集合&#xff0c;那么我們是不是應該每到新的一層就給這個結果集添加一個內部的List&#xff0c;那么怎么…

二種MVCC對比分析

文章目錄 前言MVCCInnodb的MVCC版本鏈回滾與提交可見性判斷 Oracle的MVCC版本鏈 PostgreSQL的MVCCMVCC實現可見性判斷特點 前言 ? MVCC&#xff08;多版本并發控制&#xff0c;Multi-Version Concurrency Control&#xff09;是一種數據庫管理系統&#xff08;DBMS&#x…

FAST-LIO筆記

1.FAST-LIO FAST-LIO 是一個計算效率高、魯棒性強的激光-慣性里程計系統。該系統通過緊耦合的迭代擴展卡爾曼濾波器&#xff08;IEKF&#xff09;將激光雷達特征點與IMU數據進行融合&#xff0c;使其在快速運動、噪聲較大或環境復雜、存在退化的情況下仍能實現穩定的導航。 1…

C++并發編程完全指南:從基礎到實踐

在當今多核處理器普及的時代&#xff0c;充分利用硬件并發能力已成為高性能編程的關鍵。C11引入的現代并發編程支持使得開發者能夠以標準化、可移植的方式編寫多線程程序。本文將全面介紹C并發編程的各個方面&#xff0c;從基礎概念到實際應用&#xff0c;幫助您掌握這一重要技…

如何使用docker配置ros-noetic環境并使用rviz,gazebo

參考鏈接&#xff1a;【Ubuntu】Docker中配置ROS并可視化Rviz及Gazebo_docker ros-CSDN博客 前言&#xff1a; 其實這個東西是相當必要的&#xff0c;因為我們有時候需要在一臺電腦上跑好幾個項目&#xff0c;每個項目都有不同的依賴&#xff0c;這些依賴沖突搞得人頭皮發麻&…

使用 Java 11 的 HttpClient 處理 RESTful Web 服務

在現代 Web 開發中,與 RESTful Web 服務交互是一項核心任務。Java 作為一種廣泛使用的編程語言,提供了多種處理 HTTP 請求的方法。在 Java 11 之前,開發者通常使用 HttpURLConnection 或第三方庫(如 Apache HttpClient)。然而,這些方法要么過于底層,要么需要額外依賴。J…

JVM——垃圾回收

垃圾回收 在Java虛擬機&#xff08;JVM&#xff09;的自動內存管理中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;是其核心組件之一。它負責回收堆內存中不再使用的對象所占用的內存空間&#xff0c;以供新對象的分配使用。下面我們將深入探討JVM中的…

經典密碼學算法實現

# AES-128 加密算法的規范實現&#xff08;不使用外部庫&#xff09; # ECB模式S_BOX [0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0x…