嵌入式操作系统内核原理和开发(内存分配算法)
?
????(1)固定內(nèi)存分配
??? 固定內(nèi)存分配算法是最簡單的算法,也是最好理解的算法。比如說有16M內(nèi)存,現(xiàn)在我們假設(shè)分配的基本內(nèi)存是4K,那么總共有16M/4K = 4K個單元。所以,如果用戶想申請內(nèi)存,最多就是4K次。如果用戶想要多一點內(nèi)存,那么系統(tǒng)把相鄰的內(nèi)存分給用戶使用即可。
?
????(2)鏈表內(nèi)存分配
??? 固定內(nèi)存分配雖然好,但是還有一個缺點,那就是如果存在很多的浪費機會。試想一下,如果用戶只要幾十個byte,那么也要分配給它4K個字節(jié),浪費的空間超過了99%。所以在此基礎(chǔ)之上,我們提出了鏈表內(nèi)存算法。鏈表算法中保存有空閑結(jié)點,內(nèi)存釋放的時候,那么內(nèi)存查到空閑結(jié)點,該合并合并,該釋放的釋放;當(dāng)然如果要申請內(nèi)存的話,那方法就多了去了,可以最差申請、最優(yōu)申請、最好申請,這些都是可以的。
?
????(3)伙伴算法
??? 鏈表算法相比較固定內(nèi)存算法,可以節(jié)省不少內(nèi)存。但是鏈表算法本身有一個特點,那就是容易形成內(nèi)存碎片。所以,我們可以結(jié)合固定分配和鏈表算法的特點,把內(nèi)存分配成8、16、32、64、128、256、512大小的幾種鏈表。鏈表內(nèi)部的大小都是相同的,鏈表之間是倍數(shù)的關(guān)系。分配內(nèi)存的時候,我們首先尋找最合適的鏈表,然后分配內(nèi)存,如果內(nèi)存空間不夠,可以向高一級的內(nèi)存鏈表申請,這樣拆解下來的內(nèi)存可以分配到低一級別的鏈表;釋放內(nèi)存的時候,我們也要注意內(nèi)存的合并和組合。
?
????(4)基于內(nèi)存池的伙伴算法
??? 伙伴算法固然好,但是如果某一種內(nèi)存申請?zhí)貏e頻繁,那么在伙伴算法中就需要進(jìn)行反復(fù)的拆分和合并處理。一方面,這會影響了內(nèi)存的分配效率,另外一方面也比較容易造成內(nèi)存的分配碎片。所以,我們可以在伙伴算法的基礎(chǔ)之上構(gòu)建一個內(nèi)存池,在內(nèi)存釋放的時候,只是標(biāo)注當(dāng)前內(nèi)存不再使用,但是并沒有真正釋放,等到內(nèi)存池中所有的內(nèi)存都不再使用的時候再進(jìn)行釋放,這在一定的程度上會提高內(nèi)存的分配效率。特別是系統(tǒng)運行一段時間后,這種效果是特別明顯的。
?
??? (5)工作集算法
??? 工作集的算法本質(zhì)上說不是一種算法,它只是一種基本思想。我們知道,在系統(tǒng)穩(wěn)定之后,內(nèi)存中分配的大小、配置的比例關(guān)系都是相對固定的,變化不是特別大。如果我們可以把這些數(shù)據(jù)給記錄下來,在系統(tǒng)啟動的時候預(yù)先分配好這些內(nèi)存,那么不就可以提升系統(tǒng)的啟動速度了嗎?當(dāng)然工作集中的參數(shù)設(shè)定更多的是一種經(jīng)驗值,它需要我們綜合各種因素進(jìn)行分析,反復(fù)比較才會得出比較好的結(jié)果。
?
??? 這五種算法只是給出了基本思想,只有付出于實踐,多加操練才能從中有所收獲。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的嵌入式操作系统内核原理和开发(内存分配算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微内核与宏内核
- 下一篇: 动态链接库的创建和调用方法