連續內存分區式內存管理

目錄

  • 前言
  • 分區式內存管理
  • 動態分區內存管理
  • 總結

本筆記參考黃工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA

前言

內存管理模塊主要負責內存的初始化、分配以及釋放。
從分配內存是否連續可以分為兩大類:

  • 1、連續內存管理
    為進程分配的內存空間是連續的,但這種分配方式容易形成內存碎片,降低內存利用率。連續內存管理主要分為單一連續內存管理和分區內存管理兩種。
  • 2、非連續內存管理
    將進程分散到多個不連續的內存空間種,可以減少內存碎片,內存使用率更高。如果分配的基本單位是頁,則稱為分頁式內存管理;如果基本單位式段,則稱為分段式內存管理

目前的OS主要采用非連續內存管理。對于內存較小的嵌入式系統,一般采用連續內存管理。
這里詳細講解連續內存管理的分區式內存管理,當然了解相關原理后也可以用于自己構建相關內存池。

分區式內存管理

分區式內存管理分為固定分區和動態分區

  • 固定分區
    事先就把內存劃分為若干個固定大小的區域。分區大小既可以相等也可以不等。固定分區易于實現,但是會造成分區內碎片浪費,而且分區總數固定,限制了可以并發執行的進程數
  • 動態分區
    根據進程的實際需要,動態地給進程分配所需內存

動態分區內存管理

運作機制
動態分區管理一般采用空閑鏈表法,即基于一個雙向鏈表來保存空閑分區。對于初始狀態,整個內存塊都會被作為一個大的空閑分區加入到空閑鏈表中。當進程申請內存時,將會從這個空閑鏈表種找到一個大小滿足要求地空閑分區。如果分區大于所需內存,則從該分區中拆分出需求大小地內存交給進程,并將此拆分出的內存從空閑鏈表中移除,剩下的內存仍然是一個掛在空閑鏈表上的空閑分區。
數據結構
空閑鏈表法有多種數據結構實現方式,這里介紹一種較為簡單的數據結構。每個空閑分區的數據結構中包含分區大小,以及指向前一個分區和后一個分區的指針,這樣就能將各個空閑分區鏈接成一個雙向鏈表。
在這里插入圖片描述

內存分配算法

  • First Fit(首次適應算法)
    First Fit要求空閑分區鏈表以地址從小到大順序鏈接。分配內存時,從鏈表的第一個空閑分區開始查找,將最先能夠滿足要求的空閑分區分配給進程。
  • Next Fit(循環首次適應算法)
    該算法由FF算法演變而來。分配內存時,從上一次剛分配過的空閑分區的下一個開始查找,直到找到能滿足要求的空閑分區。查找時會采用循環查找的方式,即如果直到鏈表最后一個空閑分區都不滿足,則返回到第一個空閑分區開始查找
  • Best Fit(最佳適應算法)
    從所有空閑分區中找到能滿足要求的、且大小最小的空閑分區。為了加快查找速度,BF算法會把所有空閑分區按其容量從小到大的順序鏈接起來,這樣第一次找到的滿足大小要求的內存必然是最小的空閑分區
    與此相反的有個Worst Fit最壞適應算法,它是找到大小最大的空閑分區,然后按照容量從大到小順序鏈接所有空閑分區塊
  • Two LevelSegregated Fit(TLSF)
    使用兩層鏈表來管理空閑內存,將空閑分區大小進行分類
    每個類用一個空閑鏈表表示,其中空閑內存大小都在某個特定值或者范圍內。這樣存在多個空閑鏈表,所以又用一個索引鏈表來管理這些空閑鏈表,該表的每一項都對應一種空閑鏈表,并記錄該類空閑鏈表的表頭指針。
    在這里插入圖片描述
    第一層鏈表將空閑塊的大小根據2的冪次進行分類。
    第二層鏈表是具體的每一類空閑內存塊按照一定的范圍進行線性分段
    同時為了快速檢索到空閑塊,每一層鏈表都有一個bitmap用于標記對應的鏈表中是否有空閑塊。
    如第一層bitmap后三位010,表示2^5這一類內存區間有空閑塊。對應的第二層bitmap為0100表示【25+16,25+24)這個區間有空閑塊
  • 伙伴算法
    該算法為TLSF算法的變種,具有更好的內存拆分和回收合并效率。
    伙伴算法有很多種類,比如BinaryBuddiesFibonacci Buddies等。Binary Buddies是最簡單也是最流行的一種。
    將所有空閑分區根據分區的大小進行分類,每一類都是具有相同大小的空閑分區的集合,使用一個空閑雙向鏈表表示。BinaryBuddies中所有的內存分區都是2的冪次方。
    無論是已分配還是空閑的分區,其大小都是2的冪次方,即使進程申請的內存小于分配給它的內存塊,多余的內存也不會再拆分出來給其他進程使用,這樣就容易造成內部碎片。
    當進程申請一塊大小為n的內存時的分配步驟為:
    1、計算一個i值,使得2 ^ i-1< n ≤2 ^ i
    2、在空閑分區大小為2 ^ i 的空閑鏈表中查找
    3、如果找到空閑塊,則分配給進程
    4、如果2 ^ i的空閑分區已經耗盡,則在分區大小為2 ^ i+1的空閑鏈表中查找
    5、如果存在2 ^i+1 的空閑分區,則將此空閑塊分為相等的兩個分區 ,這兩個分區就是一對伙伴,其中一塊分配給進程,另一塊掛到分區大小為2 ^ i的空閑鏈表中
    6、如果2 ^ i+1 的空閑分區還是不存在,則繼續查找大小為2 ^ i+2 的空閑分區。如果找到,需要進行兩次拆分。第一次拆分為兩塊大小為2 ^ i+1的空閑分區,一塊掛到2 ^ i+1的空閑鏈表中,另一塊分區繼續拆分為兩塊大小為2 ^ i的空閑分區,一塊分配給進程,另一塊掛到大小為2 ^ i的空閑鏈表中
    7、如果2 ^ i+2的空閑分區也找不到,則繼續查找2 ^ i+3,依次類推
    在內存回收時,如果待回收的內存塊與空閑鏈表中的一塊內存互為伙伴,則將它們合并為一塊更大的內存塊。如果合并后的內存塊在空閑鏈表中還有伙伴,則繼續合并到不能合并為止,并將合并后的內存塊掛到對應的空閑鏈表中,
    在這里插入圖片描述

總結

在這里插入圖片描述

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

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

相關文章

用DEVC++作圖

小海豚學NOIP&#xff0c;老師說要用DEV C。 小海豚喜歡畫圖&#xff0c;記得以前用C#編些程序給她看。可前一陣打開看&#xff0c;我的免費Visual Studio過期了。可惡的Microsoft &#xff0c;不想用盜版難道就要每個月就下載一次&#xff1f; 于是就用DEV C的Windows調用吧。…

Python服務器開發三:Socket

Python服務器開發三&#xff1a;Socket socket是操作系統中I/O的延續&#xff0c;它可以使進程和機器之間的通信成為可能。socket可以看成一個標準的文件描述符。不同的是文件需要用open()函數打開&#xff0c;而socket用socket() 函數建立.recv()、send()函數和read()、write(…

Syntax error: Bad for loop variable解決辦法

在Ubuntu下寫的shell文件t.sh執行時出現錯誤&#xff1a; 1 t.sh: 6: Syntax error: Bad for loop variable 從ubuntu 6.10開始&#xff0c;ubuntu就將之前默認的bash shell更換成了dash shell&#xff0c;其表現為/bin/sh鏈接倒了/bin/dash&#xff0c;而不是傳統的/bin/bash&…

Linux命令常見

摘自&#xff1a; 常考的 21 條 Linux 命令 目錄&#xff09;cd,切換路徑ls,查看文件與目錄的命令cp,用于復制文件mv,用于移動文件、目錄cat,查看文件內容find&#xff0c;文件搜索文件權限命令&#xff0c; 設置權限&#xff0c;-取消權限文本處理命令打包和壓縮文件命令進程相…

記一次調試

這是我最近幾個月來遇到的最棘手的一個問題&#xff1a;* 昨天花了4個小時找出第一層次的原因這個糾結啊&#xff0c;本來和老婆說好準時下班回家吃飯的&#xff0c;結果被這個問題拖了老久。這是一個gradle的plugin&#xff0c;用來resolve公司內部的dependency的&#xff0c;…

OSGi.NET 學習筆記 [模塊化和插件化][小結]

【目錄】-【模塊化和插件化】-【小結】 現在我們來對OSGi.NET的“模塊化和插件化”做一個小結&#xff0c;再次把官方的說明拿出來  1&#xff09; 物理隔離&#xff1a;基于UIOSP開發的模塊是一個物理隔離的可單獨部署的模塊&#xff0c;每一個模塊擁有獨立的文件夾、類型空…

miniob :相關環境配置

How to build 參考視頻&#xff1a;https://www.bilibili.com/video/BV1gv411A7oA?spm_id_from333.999.0.0將代碼下載并且安裝編譯。 git clone失敗的話參考&#xff1a;https://blog.csdn.net/sxg0205/article/details/81412921 install cmakebuild libevent git submodul…

Fedora 20 配置

前幾天裝了fedora 20, 斷斷續續的進行了以下配置&#xff1a; 1. 安裝oracle java及jdk版本切換 安裝的過程很簡單&#xff0c;從oracle官網上下載jdk及jre的rpm包&#xff0c;使用rpm -ivh 安裝。但是遇到一個問題&#xff0c;因為fedora系統自帶了openJDK,如果安裝oracle的jd…

raft算法學習(一):角色概念以及選舉過程

Raft算法是強領導模型&#xff0c;集群中只能有一個領導。 下面是raft的視頻講解&#xff1a; raft raft的三種角色及其概念 服務器節點狀態一共有三種&#xff1a;領導者&#xff08;Leader&#xff09;、跟隨著&#xff08;Follower&#xff09;、候選人&#xff08;Candid…

解決 FLex 4.0 Module里面Alert.show();出錯問題

TypeError: Error #1009: 無法訪問空對象引用的屬性或方法。 at mx.managers::PopUpManagerImpl/http://www.adobe.com/2006/flex/mx/internal::createModalWindow()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:701] at mx.manag…

datetime2 數據類型

.net的Entity Framework構建網站數據層&#xff0c;給一個實體的DATETIME類型的屬性賦值時 突然莫名奇妙顯示有一個類型不匹配的異常如下&#xff1a; System.Data.SqlClient.SqlException: 從 datetime2 數據類型到 datetime 數據類型的轉換產生一個超出范圍的值。 解決方法&a…

Yslow的A評級指南

這里測的是V2引擎&#xff0c;V1想拿A幾乎不可能&#xff0c;一個CDN測試的F就可以輕松廢了你的網站。 A評級 現在一個一個分析。 User fewer HTTP Requests&#xff1a;減少HTTP請求 圖片、CSS、JS、flash等這些都需要增加http請求數&#xff0c;減少這些元素的數量能減少響應…

jquery下 選擇器整理

jQuery 的選擇器可謂之強大無比&#xff0c;這里簡單地總結一下常用的元素查找方法 $("#myELement") 選擇id值等于myElement的元素&#xff0c;id值不能重復在文檔中只能有一個id值是myElement所以得到的是唯一的元素 $("div") 選擇所有的di…

git日常使用教程

目錄git日常使用git 基礎用法(本地)git branchgit checkoutgit mergegit rebaseHEAD ,在提交樹上移動相對引用強制修改分支位置撤銷變更整理提交記錄提交技巧Git TagsGit Describegit 基礎用法(遠程)git fetchgit pullgit push偏離的提交歷史&#xff0c;十分重要&#xff01;&…

android一鍵分享功能不使用任何第三方sdk

在android中有自帶的一鍵分享功能&#xff0c;不過它會把所有帶分享的應用都找出來&#xff0c;如果我們只需要一些常見的分享應用&#xff0c;該如何做呢&#xff1f; 下面看我的效果圖&#xff08;橫屏和豎屏自動適配&#xff09;&#xff1a; 接下來看我的調用&#xff08;支…

包含EditText組件的界面中,禁止自動彈出軟鍵盤

解決方法&#xff1a; 1&#xff09;在Manifest.xml文件中相應的activity下添加一下代碼&#xff1a;android:windowSoftInputMode"stateHidden"2&#xff09;讓EditText失去焦點&#xff0c;使用EditText的clearFocus方法 例如&#xff1a;EditText edit(EditText)f…

gcc 編譯器使用指南

目錄安裝準備test.cpp編譯g 編譯參數-g &#xff1a;編譯帶調試信息的可執行文件-O[n] &#xff1a;開啟優化-l 和 -L &#xff1a;指定庫文件 | 指定庫文件路徑-I &#xff1a;指定頭文件搜索目錄-Wall 和 -w&#xff1a;打印警告信息 | 關閉警告信息-stdc11 &#xff1a;設置…

bug found:定義對象時

看下面代碼 class Test{ }; class Test2{public:Test2(Test *t){}};int main(){Test test();//把定義一個對象 “Test test;” 寫成 “Test test();”函數聲明了&#xff01;Test2 test2(&test);//return 0;}Dev-cpp的提示信息&#xff1a; no matching function for c…

CMake學習使用(基于vscode)

目錄語法一些重要指令CMake常用變量CMake編譯工程編譯流程兩種構建方式實例展示參考&#xff1a; 基于VSCode和CMake實現C/C開發 | Linux篇 語法 基本語法格式&#xff1a;指令(arg1 arg2 …) 參數使用括弧括起來參數之間使用空格或者分號分開 指令是大小寫無關的&#xff0…

idhttp.post方式 調用datasnap rest 遠程方法

idhttp.get方式調用&#xff0c;這種比較簡單&#xff0c;大家都會。post方式網上卻沒有任何成功的代碼&#xff0c;本人也是摸索了一個上午才搞定。 分享給大家。 &#xff08;1&#xff09;post方式調用的遠程方法&#xff0c;方法名必須加“update”前綴&#xff0c;不加行不…