空閒記憶體管理

2021-08-16 05:29:35 字數 952 閱讀 2213

學習自《現代作業系統》

作業系統在動態分配記憶體時(malloc,new),需要對空間記憶體進行管理。一般採用了兩種方式:點陣圖和空間鍊錶。

1、使用點陣圖的儲存管理

記憶體被劃分為若干個幾位元組大小的分配單元,每個分配單元是否是空閒的情況採用點陣圖來進行描述,如果已分配,相應位置1,未分配,置0。當需要分配新記憶體時,從位圖中遍歷找到滿足大小的連續個0所在位置的記憶體,將其分配。

很顯然,如果分配單元越小,則點陣圖將會越大,位圖自身所需占用的記憶體大小也就越大。而且上述方式會存在乙個弊端,即如果程序大小不是分配單元的整數倍,則最後乙個分配單元的記憶體會因為部分記憶體未分配而被浪費了。而且,在位圖中查詢指定長度的連續0串是較為耗時的操作,這也是點陣圖的乙個缺點。

2、使用鍊錶的儲存管理

如圖3-6 c),採用鍊錶形式記錄記憶體是被分配還是空閒,以及對應的起始位址和長度。一般來說,採用雙向鍊錶的方式比單鏈表較為高效。其中對空閒記憶體的分配一般有如下演算法:

首次適配演算法:在鍊錶中進行搜尋,直到找到最初的乙個足夠大的空閒區,將其分配。除非程序大小和空間區大小恰好相同,否則會將空閒區分為兩部分,一部分為程序使用,一部分成為新的空閒區。該方法是速度很快的演算法,因為索引鍊錶結點的個數較少。

下次適配演算法:工作方式與首次適配演算法相同,但每次找到新的空閒區位置後都記錄當前位置,下次尋找空閒區從上次結束的地方開始搜尋,而不是與首次適配放一樣從頭開始;

最佳適配演算法:搜尋整個鍊錶,找出能夠容納程序分配的最小的空閒區。這樣存在的問題是,儘管可以保證為程序找到乙個最為合適的空閒區進行分配,但大多數情況下,這樣的空閒區被分為兩部分,一部分用於程序分配,一部分會生成很小的空閒區,而這樣的空閒區很難再被進行利用。

最差適配演算法:與最佳適配演算法相反,每次分配搜尋最大的空閒區進行分配,從而可以使得空閒區拆分得到的新的空閒區可以更好的被進行利用。

作業系統的空閒記憶體管理

動態分配記憶體時,作業系統必須對空閒記憶體進行管理。使用點陣圖時,記憶體可能被劃分為很多個分配單元,每個分配單元對應點陣圖中的一位,0 表示空閒,1 表示占用。使用點陣圖時,關鍵問題在於分配單元大小的設計。分配單元越小,越可以精細分配記憶體。但這也意味著點陣圖越大,消耗的空間越大。使用鍊錶時,鍊錶中...

bluestore的空閒塊管理

bluestore自己管理裸盤的塊裝置,管理空閒空間的類是freelistmanager,所有的塊組成乙個bitmap,0為空閒,1為使用。freelistmanager freelistmanager create cephcontext cct,string type,keyvaluedb kv...

記憶體分配 1 空閒鍊錶

posted on 六月 29,2007 byarrowpig1979 記憶體分配是所有成功的庫都要費大量心力去做好的事情,除非是對performance很高的需求,至少我現在在工作中很少需要自己來寫記憶體分配策略。我始終覺得一些經典的庫,像stl,loki,boost是最好的教材。讀書也要講究方法...