新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 動態內存管理在面向嵌入式實時系統中的研究

        動態內存管理在面向嵌入式實時系統中的研究

        作者: 時間:2011-07-24 來源:網絡 收藏
        3.3 連續的分配實現方法

        本文引用地址:http://www.104case.com/article/150432.htm

          為了提高空間的利用率,采用按請求的實際大小來分配空間,而不是按塊的整數倍大小來分配空間。

          基本方法就是將所有獨立塊(空閑塊和使用塊)按物理地址的先后順序組織成一個雙鏈表,每個塊中存放塊本身的一些獨立信息。分配空間時,需要查找整個鏈表以找到最優適配的空閑塊,之后再將此空閑塊分裂成二塊,一塊用來滿足請求,另一塊則作為空閑塊插入鏈表。空間釋放時,只需根據鏈表便可以方便地找到與其相鄰的物理塊,在空間合并處理完成之后再將新的塊插入鏈表。

          但事實上,由于在分配過程中只需要在空閑塊中查找最優適配塊,所以可以采用一個單獨的鏈表將所有的空閑塊鏈接起來,這樣可以極大地加快空間分配時空閑塊的查找速度。

          另外,從對伙伴的分析可知,將所有的空閑區保留在一個或多個按空閑區大小排序的鏈表中將使內存分配很快。所以借鑒伙伴的實現方式,可以將單個的空閑分區鏈組織成多個鏈表間有序的空閑分區鏈。在內存操作頻繁的情況下,這將會提高內存分配的效率。

          由于以上的方式容易產生許多小的不能繼續使用的空閑區,所以在進行空間分配時,如果分配所得的空閑區小于某一特定值,則不再進行空間分配,而是將整個空間作為請求結果返回。

          綜上所述,可以將內存塊組織成二個雙鏈表,即空閑塊鏈表和物理塊鏈表。

          (1)空閑塊鏈表:將所有的空閑塊按鏈表間有序的方式組織成多個獨立的空閑鏈表。空間分配時,根據空間的大小選擇相應的鏈表進行查找。若查找成功,則在空間分配處理完成之后,將已分配空間返回給請求;若查找失敗,則在更大空間的鏈表中繼續查找;若直到全部鏈表查找完成仍未找到合適的空閑塊,則認為此次分配操作失敗。

          (2)物理塊鏈表:將所有獨立塊(空閑塊和使用塊)組織成一個雙鏈表,鏈表中各節點之間是按照物理地址的先后順序鏈接的,每個塊中存放塊本身的一些獨立信息。空間釋放時,可以不需查找,而直接根據這一鏈表找到與釋放塊相鄰的塊。再根據相鄰塊中的相關信息就可以方便地進行內存塊的合并操作。

          具體實現時,可以將這二個鏈表的控制信息與用戶空間獨立存放,避免控制信息被意外地破壞。也可以利用物理塊本身來存放這些控制信息,得到更好的空間利用率和更好的靈活性。

          3.4 連續的內存分配工作方式

          首先假定空間不再進行分配的最小值為1KB,即當空間分裂時所得的空閑區小于1KB時,將不再進行空間分配。

          分別保留大小為1KB、2KB、4KB、8KB字節等直到大于內存總容量大小的鏈表。例如對于容量為1 024KB的內存,有從1KB字節到2 048KB字節的12個鏈表。初始時,所有內存都是空閑的,2 048KB的鏈表包含一個1 024KB的空閑區(每個鏈表存放所有小于鏈表本身字節數、大于等于前一鏈表的字節數的內存塊,2 048KB的鏈表存放所有小于2 048KB大于等于1 024KB的內存塊)。其他的鏈表均為空,內存最初的情況如圖1所示。為表示方便,圖中使用單鏈表來表示鏈接關系。實線表示物理塊鏈表指針,短劃線表示空閑塊鏈表指針,虛線表示空指針。對于物理塊鏈表,灰色塊表示已分配塊,白色塊表示空閑塊。

          當有一個300KB的內存請求(用A表示)產生時,系統找到512KB鏈表的表頭。因為這個鏈表中可能包含滿足請求所需的最小空間。之后按照最佳適配(best fit)算法,在鏈表中搜尋是否有夠用的最小空閑區。此時512KB的鏈表為空,1 024KB的鏈表也為空,所以最終在2 048KB的鏈表中找到1 024KB可用空間。將此空間分割成大小分別為300KB和700KB的塊,700KB的塊(大于最小塊1KB)插入到1 024KB的鏈表中,300KB的塊則返回給請求A.

          接著,又有一個300KB(用B表示)和一個50KB(用C表示)的內存請求。結果如圖2所示。

          現在塊B被釋放。此時,根據物理塊鏈表,可以方便地找到與B鄰接的物理塊A和物理塊C.由于塊A和塊C都未被釋放,所以不需要進行合并操作。因為塊B的大小介于256KB和512KB之間,所以將塊B插入到512KB的空閑鏈表中,結果如圖3所示。

          接著,塊C被釋放。此時根據物理塊鏈表可知與塊C鄰接的為塊B和塊F,并且二塊都為空閑狀態。將塊B和塊F從512KB空閑塊鏈表中刪除,再將三塊合并成一個700KB的塊(用F表示)插入到1 024KB的空閑鏈表中,結果如圖4所示。

          最后當塊A被釋放時,塊A與塊F合并成1 024KB的塊,回到最初只有1 024KB空閑區的情況。

          4 結 論

          內存一直是計算機領域的一項重要技術。內存給用戶提供了比較大的自由度,用戶可以從系統分區中申請內存塊,也可以從用戶內存區申請內存塊。這樣增加了系統的靈活性,同時也限制了大量碎片產生的可能(在不頻繁刪除建立系統內存分區的前提下)。也增加了部分c 代碼的可移植性。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 千阳县| 齐河县| 多伦县| 大悟县| 宜春市| 敖汉旗| 岳池县| 遂溪县| 泽普县| 高密市| 尉犁县| 迁安市| 东宁县| 泰和县| 东至县| 普陀区| 宜城市| 隆安县| 永修县| 郸城县| 广州市| 杭州市| 上饶县| 舞钢市| 滁州市| 太仆寺旗| 广平县| 密云县| 钦州市| 安远县| 麟游县| 邓州市| 澜沧| 石狮市| 平谷区| 浦江县| 大英县| 环江| 通化县| 五莲县| 罗平县|