引言
本文爲第八篇,存儲管理之內存分配與回收,早期計算機編程並不需要過多的存儲管理,隨着計算機和程序越來越複雜,存儲管理成爲必要。本篇主要是瞭解內存分配的過程和內存回收的過程
存儲管理的意義
- 確保計算機有足夠的內存處理數據
- 確保程序可以從可用內存中獲取一部分內存使用
- 確保程序可以歸還使用後的內存以供其它程序使用
內存分配的過程
單一連續分配
- 單一連續分配是最簡單的內存分配方式
- 只能在單用戶、單進程的操作系統中使用
它分配的過程就是把內存分爲系統區和用戶區
系統區指的是系統區所有的內存都給操作系統區使用,用戶區指的是用戶區所有的內存都給用戶區的程序使用(這種已經是過時的方法)
固定分區分配
- 固定分區分配是支持多道程序的最簡單存儲分配方式
- 內存空間被劃分爲若干固定大小的區域
- 每一個分區只提供給一個程序所使用,互不干擾
將主存分爲若干個分區,每一個分區提供給某一個進程所使用,這就是固定分區的分配方法
動態分區分配
- 根據進程實際需要,動態分配內存空間
- 涉及到相關數據結構和具體的一些算法
動態分區空閒表數據結構
假設主存中有若干個分區,有些被使用而有些未被使用,這樣就需要一個數據結構去存儲某一個分區它是否被使用了,此時就需要空閒表數據結構
在表中有若干個分區,每一個分區都有一個標記,0或1,0表示未被使用,1表示被使用。這就是動態分區空閒表數據結構
動態分區空閒鏈數據結構
這個是使用雙向鏈表來保存動態分區中的空閒區域。將所有分散的空閒區域,通過鏈表進行首尾相連,組成一個空閒鏈表,但是,會存在像下圖中空閒區2和3是連續的,因此可以將節點2和節點3給合併起來,這樣就可以減少空閒鏈表的節點。因此,每個節點的大小不一樣,所以需要在每個節點裏邊存儲記錄這個節點可存儲的容量。這個就是動態分區空閒鏈數據結構
動態分區分配算法
- 首次適應算法(FF算法)
- 最佳適應算法(BF算法)
- 快速適應算法(QF算法)
這些算法是實際進行動態內存分配所使用的算法
首次適應算法(FF算法)
每一次進行內存分配時,從開始順序查找適合內存區(主要使用空閒鏈的數據結構)
若沒有合適的空閒區,則該次分配失敗,如果找到了,就將該空閒區劃分給這個進程使用。每次都是從頭部開始,使得頭部地址空間不斷被劃分
最佳適應算法(BF算法)
- 最佳適應算法要求空閒區鏈表按照容量大小排序
- 遍歷空閒區鏈表找到最佳空閒區
將空閒區按照大小進行排序,在需要內存的時候,從節點頭部開始遍歷,尋找最佳的空閒區節點。這種算法的好處就是可以避免一種大材小用的情況,因爲它是從小到大遍歷這個空閒鏈表的,所以它匹配到的第一個合適的空閒區,一定是最佳的。
快速適應算法(QF算法)
- 快速適應算法要求有多個空閒區鏈表
- 每個空閒區鏈表存儲一種容量的空閒區
將擁有一個空閒區節點的和擁有兩個空閒區節點,分成兩個鏈表。當需要內存分配時,就可以快速的找到適合某一個進程的內存區域。
內存回收的過程
內存回收過程,可能有以下幾種情況:
- 回收區和一塊空閒區相鄰,且回收區在空閒區下邊
- 回收區和一塊空閒區相鄰,且空閒區在回收區下邊
- 回收區在兩塊空閒區中間
- 單獨的回收區
每種情況的回收過程
回收區在空閒區下邊
使用空閒鏈表的數據結構來保存空閒區,不需要新建空閒鏈表節點、只需要將空閒區1的容量增大爲空閒區即可(也就是將回收區包含進來)
回收區在空閒區上邊
- 將回收區與空閒區合併
- 新的空閒區使用回收區的地址
回收區位於兩個空閒區中間
- 將空閒區1、空閒區2和回收區合併
- 新的空閒區使用空閒區1的地址
單獨的回收區
- 爲回收區創建新的空閒節點
- 插入到相應的空閒區鏈表中去
在快速變化的技術中尋找不變,纔是一個技術人的核心競爭力。知行合一,理論結合實踐