<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 動態(tài)內(nèi)存管理在面向嵌入式實時系統(tǒng)中的研究

          動態(tài)內(nèi)存管理在面向嵌入式實時系統(tǒng)中的研究

          作者: 時間:2011-07-24 來源:網(wǎng)絡(luò) 收藏
          3.3 連續(xù)的分配實現(xiàn)方法

          本文引用地址:http://www.ex-cimer.com/article/150432.htm

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

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

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

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

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

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

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

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

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

            3.4 連續(xù)的內(nèi)存分配工作方式

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

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

            當(dāng)有一個300KB的內(nèi)存請求(用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表示)的內(nèi)存請求。結(jié)果如圖2所示。

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

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

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

            4 結(jié) 論

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

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

          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();