Title: Nuttx內存管理的總結,碎片問題研究。html
Describe: nuttx內存的管理方式,碎片問題,測試及總結。node
Time: 2012.07.10—2012.07.16算法
Author: xichen數據結構
Real-time os.小巧,實時,徹底可擴展。嵌入式實時的屬性,決定其爲非虛擬內存管理機制,防止不肯定性的I/O阻塞時間,減小程序運行時間的不肯定性。支持配有MMU的嵌入式微處理器模式。學習
對比分析,vxworks, uc/os II的內存管理對比。測試
Nuttx從算法開始比較重視碎片的產生問題,經過算法在規避碎片的產生。選擇了相似buddy的算法,同時使用了最早匹配算法的思想。一方面可以學習最早匹配算法快速檢索到合適的內存塊地進行內存的申請釋放,另外一方面下降了buddy算法內存使用率較低低的問題。htm
以通常狀況進行描述(支持small address),在.data段存有19個大小爲16bytes的節點結構。0~18對應塊大小爲2的次冪,具體爲16byte~4Mb.blog
在啓動時會從堆中分配內存給內存管理部分做爲初始內存塊,在內存塊上執行內存分配工做,固然以後也可增長大小。接下來的過程,根據須要執行分配過程,申請,分配,再分配,及內存釋放。由於將相鄰內存塊相鄰起來的措施可以顯著地減小內存碎片,因此在執行過程當中,nuttx內存管理算法比較重視相鄰內存塊的狀態,不管是已經alloc_node仍是free_node都在數據結構中存在preciding size選項,一方面爲了減小內存碎片,另外一方面能夠增長檢索的速度。內存
代碼流程:ci
算法優點:
內存碎片:空閒沒法被使用的內存,緣由大可能是小而不連續,內存碎片的程序取決於內存分配程序,採用的策略方法。一個不斷產生內存碎片的系統,無論產生的內存碎片多麼小,只要時間足夠長,就會將內存用完。
爲了防止產生小而不可以使用的空閒塊,存在閥值C。
內存分配程序浪費內存的基本方式有三種:即額外開銷、內部碎片以及外部碎片。
Nuttx針對以上問題做出的方案:
運行時存放分配塊信息的數據結構就是其管理的內存。能夠減小額外開銷。
內存分配始於被16整除的地址(與處理器體系結構有關),會產生必定內部碎片。即分配多出申請大小部分的空閒內存爲內部碎片。可是在系統運行期間,分配程序的策略是穩定不改變的,實際上額外開銷和內部碎片在整個系統中保持不變,實際上能夠忽略其威脅。
外部碎片的產生是當已分配內存塊之間出現未被使用的差額時,就會產生外部碎片。外部碎片是嵌入式系統開發人員關注的重點,也便是常說的內存碎片。
關於數值的理解,兩種極端的狀況能夠解釋:當內存碎片爲0時,意味着可分配內存在一塊block上,爲完整的一塊。
當內存碎片爲1時(達到以前已崩潰),可分配的最大內存塊爲0,意味着沒法分配內存。一個系統有 5M 字節的空閒內存,當它可用來分配的最大內存塊爲 50k 字節時,其內存碎片爲99%
在nuttx中,對應爲 1-mxordblk/fordblks。
能夠具體查看Nuttx的代碼
測試代碼(nuttx附帶的mm_test.c):
測試代碼修改(by xichen):
測試結果:
外部碎片公式:
內存碎片在xx狀況下比較多……
從代碼分析,nuttx與vxworks在內存管理方面有比較多的類似之處較多,能夠考慮結合vxworks內存管理方式,從vxworks內存管理算法改進入手(已經有較多改進版算法),分析具體須要作出對策。
1.有資料代表,在短暫運行時,碎片率通常較低,算法的缺陷在小規模數據上難以體現,而運行2周以上,部分系統會出現碎片率99%的狀況。
2.若是使用vxworks中比較好的算法的研究結果,或許可以更好地規避內存碎片的產生。可是代碼的改動勢必很大,原生態系統。
參考: