<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

動(dòng)態(tài)內存管理在面向嵌入式實(shí)時(shí)系統中的研究

作者: 時(shí)間:2011-07-24 來(lái)源:網(wǎng)絡(luò ) 收藏
3.3 連續的分配實(shí)現方法

本文引用地址:http://dyxdggzs.com/article/150432.htm

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4 結 論

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

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

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>