動態(tài)內存管理在面向嵌入式實時系統(tǒng)中的研究
為了提高內存空間的利用率,采用按請求的實際大小來分配空間,而不是按塊的整數(shù)倍大小來分配空間。
基本方法就是將所有獨立塊(空閑塊和使用塊)按物理地址的先后順序組織成一個雙鏈表,每個塊中存放塊本身的一些獨立信息。分配空間時,需要查找整個鏈表以找到最優(yōu)適配的空閑塊,之后再將此空閑塊分裂成二塊,一塊用來滿足請求,另一塊則作為空閑塊插入鏈表??臻g釋放時,只需根據(jù)鏈表便可以方便地找到與其相鄰的物理塊,在空間合并處理完成之后再將新的塊插入鏈表。
但事實上,由于在分配過程中只需要在空閑塊中查找最優(yōu)適配塊,所以可以采用一個單獨的鏈表將所有的空閑塊鏈接起來,這樣可以極大地加快空間分配時空閑塊的查找速度。
另外,從對伙伴系統(tǒng)的分析可知,將所有的內存空閑區(qū)保留在一個或多個按空閑區(qū)大小排序的鏈表中將使內存分配很快。所以借鑒伙伴系統(tǒng)的實現(xiàn)方式,可以將單個的空閑分區(qū)鏈組織成多個鏈表間有序的空閑分區(qū)鏈。在動態(tài)內存操作頻繁的情況下,這將會提高系統(tǒng)內存分配的效率。
由于以上的方式容易產(chǎn)生許多小的不能繼續(xù)使用的空閑區(qū),所以在進行空間分配時,如果分配所得的空閑區(qū)小于某一特定值,則不再進行空間分配,而是將整個空間作為請求結果返回。
綜上所述,可以將內存塊組織成二個雙鏈表,即空閑塊鏈表和物理塊鏈表。
?。?)空閑塊鏈表:將所有的空閑塊按鏈表間有序的方式組織成多個獨立的空閑鏈表??臻g分配時,根據(jù)空間的大小選擇相應的鏈表進行查找。若查找成功,則在空間分配處理完成之后,將已分配空間返回給請求;若查找失敗,則在更大空間的鏈表中繼續(xù)查找;若直到全部鏈表查找完成仍未找到合適的空閑塊,則認為此次分配操作失敗。
?。?)物理塊鏈表:將所有獨立塊(空閑塊和使用塊)組織成一個雙鏈表,鏈表中各節(jié)點之間是按照物理地址的先后順序鏈接的,每個塊中存放塊本身的一些獨立信息??臻g釋放時,可以不需查找,而直接根據(jù)這一鏈表找到與釋放塊相鄰的塊。再根據(jù)相鄰塊中的相關信息就可以方便地進行內存塊的合并操作。
具體實現(xiàn)時,可以將這二個鏈表的控制信息與用戶空間獨立存放,避免控制信息被意外地破壞。也可以利用物理塊本身來存放這些控制信息,得到更好的空間利用率和更好的靈活性。
3.4 連續(xù)的內存分配工作方式
首先假定空間不再進行分配的最小值為1KB,即當空間分裂時所得的空閑區(qū)小于1KB時,將不再進行空間分配。
分別保留大小為1KB、2KB、4KB、8KB字節(jié)等直到大于內存總容量大小的鏈表。例如對于容量為1 024KB的內存,有從1KB字節(jié)到2 048KB字節(jié)的12個鏈表。初始時,所有內存都是空閑的,2 048KB的鏈表包含一個1 024KB的空閑區(qū)(每個鏈表存放所有小于鏈表本身字節(jié)數(shù)、大于等于前一鏈表的字節(jié)數(shù)的內存塊,2 048KB的鏈表存放所有小于2 048KB大于等于1 024KB的內存塊)。其他的鏈表均為空,內存最初的情況如圖1所示。為表示方便,圖中使用單鏈表來表示鏈接關系。實線表示物理塊鏈表指針,短劃線表示空閑塊鏈表指針,虛線表示空指針。對于物理塊鏈表,灰色塊表示已分配塊,白色塊表示空閑塊。
當有一個300KB的內存請求(用A表示)產(chǎn)生時,系統(tǒng)找到512KB鏈表的表頭。因為這個鏈表中可能包含滿足請求所需的最小空間。之后按照最佳適配(best fit)算法,在鏈表中搜尋是否有夠用的最小空閑區(qū)。此時512KB的鏈表為空,1 024KB的鏈表也為空,所以最終在2 048KB的鏈表中找到1 024KB可用空間。將此空間分割成大小分別為300KB和700KB的塊,700KB的塊(大于最小塊1KB)插入到1 024KB的鏈表中,300KB的塊則返回給請求A.
接著,又有一個300KB(用B表示)和一個50KB(用C表示)的內存請求。結果如圖2所示。
現(xiàn)在塊B被釋放。此時,根據(jù)物理塊鏈表,可以方便地找到與B鄰接的物理塊A和物理塊C.由于塊A和塊C都未被釋放,所以不需要進行合并操作。因為塊B的大小介于256KB和512KB之間,所以將塊B插入到512KB的空閑鏈表中,結果如圖3所示。
接著,塊C被釋放。此時根據(jù)物理塊鏈表可知與塊C鄰接的為塊B和塊F,并且二塊都為空閑狀態(tài)。將塊B和塊F從512KB空閑塊鏈表中刪除,再將三塊合并成一個700KB的塊(用F表示)插入到1 024KB的空閑鏈表中,結果如圖4所示。
最后當塊A被釋放時,塊A與塊F合并成1 024KB的塊,回到最初只有1 024KB空閑區(qū)的情況。
4 結 論
動態(tài)內存管理一直是計算機領域的一項重要技術。動態(tài)內存管理給用戶提供了比較大的自由度,用戶可以從系統(tǒng)分區(qū)中申請內存塊,也可以從用戶內存區(qū)申請內存塊。這樣增加了系統(tǒng)的靈活性,同時也限制了大量碎片產(chǎn)生的可能(在不頻繁刪除建立系統(tǒng)內存分區(qū)的前提下)。也增加了部分c 代碼的可移植性。
評論