国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

嵌入式系統(tǒng)動態(tài)內(nèi)存管理及故障檢測

2018-11-21 08:08田宇馬朝陽趙昶宇
科技與創(chuàng)新 2018年21期
關鍵詞:結點內(nèi)存分配

田宇,馬朝陽,趙昶宇

?

嵌入式系統(tǒng)動態(tài)內(nèi)存管理及故障檢測

田宇1,馬朝陽2,趙昶宇3

(1.海軍駐天津八三五七所軍事代表室,天津 300308;2.海軍舟山地區(qū)裝備修理監(jiān)修室,浙江 舟山 316000; 3.天津津航計算技術研究所,天津 300308)

針對嵌入式軟件內(nèi)存管理具有快速性、可靠性和高效性的特點,建立了動態(tài)內(nèi)存管理模型,分析了嵌入式系統(tǒng)內(nèi)存池管理策略和內(nèi)存分配算法,詳細闡述了內(nèi)存泄露檢查和內(nèi)存重復釋放檢查的具體算法,并對嵌入式軟件的內(nèi)存操作提出了建議。

VxWorks;內(nèi)存池;內(nèi)存泄露;內(nèi)存釋放

快速性、可靠性和高效性是嵌入式開發(fā)對內(nèi)存管理的基本要求,對實時性要求很高的VxWorks操作系統(tǒng),內(nèi)存管理機制是研究的重要領域。VxWorks系統(tǒng)中最基本的內(nèi)存分配方案有靜態(tài)分配和動態(tài)分配。靜態(tài)分配是指在編譯或鏈接時將程序所需要的內(nèi)存空間分配好,采用這種分配方案的程序段,其大小一般在編譯時就能確定。而動態(tài)分配是指系統(tǒng)運行時根據(jù)需要,動態(tài)地分配內(nèi)存空間。這兩種分配策略各有利弊。靜態(tài)分配內(nèi)存、系統(tǒng)的可靠性高,但失去了靈活性,而且浪費也較多;動態(tài)分配具有靈活、利用率高等優(yōu)點,但會導致響應時間的不確定及容易產(chǎn)生碎片等問題。本文重點分析VxWorks動態(tài)內(nèi)存管理機制,并對內(nèi)存泄露和內(nèi)存重復釋放等內(nèi)存故障問題的檢測和診斷給出了解決方案。

1 動態(tài)內(nèi)存管理機制

1.1 動態(tài)內(nèi)存管理模型

動態(tài)內(nèi)存是一個自由存儲區(qū),編程人員根據(jù)需要進行動態(tài)內(nèi)存的分配、訪問、回收。對動態(tài)內(nèi)存的操作與系統(tǒng)當前的動態(tài)內(nèi)存狀態(tài)有關。在使用動態(tài)內(nèi)存之前,必須向自由存儲區(qū)申請內(nèi)存。由于自由存儲區(qū)的容量是有限的,因此在動態(tài)內(nèi)存分配之后和動態(tài)內(nèi)存使用之前還要進行分配結果的檢測,以保證后續(xù)操作的正確性;在程序結束前,要進行動態(tài)內(nèi)存的釋放操作,防止內(nèi)存發(fā)生泄露。圖1描述了一個動態(tài)內(nèi)存管理過程,圖中的節(jié)點表示動態(tài)內(nèi)存管理過程中的幾個階段,圖中的連線表示各階段之間的遷移。

圖1刻畫了內(nèi)存管理的幾個階段:①Start。程序開始。②Memory allocate。對指針進行動態(tài)內(nèi)存分配,若沒有足夠的動態(tài)內(nèi)存或者分配過程發(fā)生錯誤,則將該指針置為NULL。③Check memory。用來檢查分配的結果,以保證后續(xù)動態(tài)內(nèi)存操作的正確性。④Access memory。對動態(tài)內(nèi)存中的內(nèi)容進行讀、寫、修改等操作。⑤Free memory。動態(tài)內(nèi)存操作的結束,進行動態(tài)內(nèi)存釋放。⑥End。程序結束。

圖1中實心箭頭表示程序正確執(zhí)行時的動態(tài)內(nèi)存管理路徑,而虛線箭頭表示的路徑指出動態(tài)內(nèi)存使用后未被釋放,即發(fā)生了動態(tài)內(nèi)存泄露。

圖1 動態(tài)內(nèi)存管理過程模型

VxWorks內(nèi)存管理函數(shù)庫分為完全內(nèi)存管理函數(shù)庫(庫名稱為memLib)和核心內(nèi)存管理函數(shù)庫(庫名稱為memPartLib)。其中核心內(nèi)存管理庫為內(nèi)存分區(qū)的分配、管理提供了核心函數(shù),以mem Part開頭的包含了創(chuàng)建、管理、分配、釋放內(nèi)存分區(qū)的函數(shù),其余的提供了與ANSI標準相兼容的對系統(tǒng)內(nèi)存分區(qū)的操作接口。當應用程序從系統(tǒng)分區(qū)中再創(chuàng)建其他分區(qū)時,就得調(diào)用函數(shù)malloc進行動態(tài)分配。一般系統(tǒng)中只有1個內(nèi)存分區(qū),即系統(tǒng)分區(qū),所有任務所需要的內(nèi)存直接調(diào)用malloc從系統(tǒng)分區(qū)中進行分配,使用完后調(diào)用free進行內(nèi)存釋放,通過free釋放的內(nèi)存將被聚合形成更大的空閑塊,這就是VxWorks的動態(tài)內(nèi)存分配機制。

1.2 內(nèi)存池管理策略

應用程序申請使用系統(tǒng)內(nèi)存區(qū)時,調(diào)用函數(shù)malloc/free 雖然靈活方便,但它有時間不確定、會產(chǎn)生過多的碎片、不能用于中斷服務程序、降低系統(tǒng)性能等缺點,所以不宜頻繁使用。一般在系統(tǒng)設計時,采用動態(tài)分配與靜態(tài)分配相結合的方法來管理系統(tǒng)內(nèi)存池,來避免單一內(nèi)存分配所帶來的弊端。內(nèi)存池的引入可以極大加快內(nèi)存分配/釋放過程,減少動態(tài)分配、釋放內(nèi)存時的消耗,并且可以有效減少內(nèi)存碎片,避免內(nèi)存泄露。一般內(nèi)存池結構可由單元尺寸、單元數(shù)量、空閑鏈表、調(diào)試參數(shù)等組成。由于利用了內(nèi)存池的內(nèi)存分配方案在VxWorks系統(tǒng)中,使得系統(tǒng)減少了malloc/free的調(diào)用次數(shù),減少了碎片,同時用戶可自由添加一些用于內(nèi)存分配和釋放的調(diào)試函數(shù),更好地監(jiān)視了內(nèi)存的使用情況。

1.3 內(nèi)存分配算法

嵌入式實時動態(tài)內(nèi)存的傳統(tǒng)分配方式,往往是系統(tǒng)的碎片隨物理內(nèi)存的增加呈線性增長,導致碎片的組合操作所付出的代價很高,目前常用的解決方案是以頁表作為管理結構,頁面作為管理基礎,實現(xiàn)了對內(nèi)存分配與回收的實時管理。

VxWorks內(nèi)存管理是基于一種Flat模式,從宏觀的層次可以分成Partition(分區(qū))、Block(塊)、Pool(池)的框架。由于系統(tǒng)只有一個分區(qū),所有任務所需內(nèi)存直接由malloc從其中分配。最常用算法為First-Fit(最先分配)算法,此算法思想是:空閑內(nèi)存塊按地址大小遞增排列,對于要求分配的分區(qū)容量size,從頭開始比較,直至找到滿足不小于size的塊為止,并從鏈表相應塊中分配出相應size大小的指針。從空閑鏈表中查找內(nèi)存塊,從高地址開始,當找到滿足第一個分配請求空閑塊時就分配所需的內(nèi)存,并修改該空閑塊的大小,空閑塊的剩余部分仍然保留在空閑鏈表中。動態(tài)內(nèi)存釋放時,根據(jù)塊頭中的信息判斷相鄰的內(nèi)存塊是否空閑,如果將空閑塊合并,并修改長度,否則就把新釋放的內(nèi)存插入到空閑鏈表中。

First-Fit算法在提高系統(tǒng)實時性的同時,也出現(xiàn)一些問題,比如2個任務占用2個連續(xù)的Block,當Block1操作越界后,Block2數(shù)據(jù)會被破壞,同時在系統(tǒng)分配時會產(chǎn)生很多碎片等,這些都會對系統(tǒng)運行產(chǎn)生影響。

2 內(nèi)存故障測試和診斷

2.1 內(nèi)存泄露診斷

內(nèi)存泄露一般是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的、使用完畢后必須釋放的內(nèi)存。也就是說,程序在運行過程中,如果需要動態(tài)內(nèi)存來協(xié)助程序執(zhí)行,則會向操作系統(tǒng)從堆中申請一塊內(nèi)存,待使用完畢之后,將該內(nèi)存空間釋放,及時歸還給操作系統(tǒng)。內(nèi)存泄漏是指由于疏忽或者錯誤程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。

如果運行在嵌入式平臺上的軟件程序存在內(nèi)存泄露,輕則會降低系統(tǒng)的性能,最糟糕的情況是所有堆內(nèi)存被分配,程序無法再次從堆內(nèi)存中申請到程序執(zhí)行所必須的內(nèi)存,從而導致全部或者部分程序、設備無法正常工作,造成系統(tǒng)癱瘓甚至崩潰。

在VxWorks系統(tǒng)下,memShow可以顯示系統(tǒng)內(nèi)存分配情況,包括已分配內(nèi)存和空閑內(nèi)存大小、塊數(shù)、平均大小等信息。本文提出的內(nèi)存泄漏診斷算法的基本思想是:在應用程序申請堆內(nèi)存的時候,將申請信息記錄在一個后臺程序管理的全局數(shù)據(jù)結構中;在應用程序釋放堆內(nèi)存的時候,將后臺程序管理的全局數(shù)據(jù)結構中的記錄刪除;當程序運行到一個穩(wěn)態(tài),即程序被認為不應該有堆內(nèi)存未被釋放的狀態(tài),將后臺程序管理的這個全局數(shù)據(jù)結構中的記錄輸出到指定文件,供測試人員檢查。后臺全局數(shù)據(jù)結構中記錄的信息應該至少包括申請的堆內(nèi)存的首地址、申請的堆內(nèi)存的大小、申請該堆內(nèi)存的代碼行號和文件名。后臺程序在一個單獨的任務中實現(xiàn)。

2.1.1 增加一個內(nèi)存泄露檢查跟蹤結點模塊

該模塊在嵌入式軟件程序中申請堆內(nèi)存的時候被調(diào)用,同時,“申請成功的堆內(nèi)存首地址”“申請成功的堆內(nèi)存長度”“成功申請堆內(nèi)存程序的源文件名稱”和“成功申請堆內(nèi)存程序代碼所在源文件中的行號”作為該模塊的輸入,該模塊將在堆內(nèi)存檢查管理鏈表中添加一個結點并將輸入信息記錄。本算法中,使用帶有表頭的單向鏈表來記錄和管理程序的堆內(nèi)存申請信息。每申請一次內(nèi)存,增加一個結點,釋放一次內(nèi)存,刪除一個結點。程序詳細流程如圖2所示。

圖2 增加一個內(nèi)存泄露檢查跟蹤結點模塊流程圖

2.1.2 刪除一個內(nèi)存泄露檢查跟蹤結點模塊

該模塊在嵌入式軟件程序當釋放堆內(nèi)存的時候被調(diào)用,同時,“申請成功的堆內(nèi)存首地址”“申請成功的堆內(nèi)存長度”“成功申請堆內(nèi)存程序的源文件名稱”和“成功申請堆內(nèi)存程序代碼所在源文件中的行號”作為該模塊的輸入,該模塊將在堆內(nèi)存檢查管理鏈表中添加一個結點并將輸入信息記錄。程序詳細流程如圖3所示。

2.1.3 內(nèi)存泄露檢查跟蹤結點信息輸出模塊

該模塊在一個測試用例被執(zhí)行完畢的時候被調(diào)用,也可以在使用者認為需要的時候調(diào)用。程序詳細流程如圖4所示。

2.2 內(nèi)存重復釋放診斷

重復釋放是指在程序申請到一塊堆內(nèi)存之后,經(jīng)過使用將這塊內(nèi)存釋放,但沒有將指向這塊內(nèi)存的所有指針回收,并在程序的其他部分再次將指向同一塊內(nèi)存單元的指針交給內(nèi)存分配器執(zhí)行堆內(nèi)存釋放的操作。堆內(nèi)存重復釋放檢查算法是在內(nèi)存泄漏檢查算法的基礎上開發(fā)與設計的。重復釋放檢查算法使用一個單向鏈表記錄程序的重復釋放信息,在測試用例執(zhí)行結束之前將該信息輸出。

2.2.1 增加一個內(nèi)存重復釋放檢查跟蹤結點模塊

該模塊在嵌入式軟件程序釋放堆內(nèi)存的時候被調(diào)用,同時,“釋放的堆內(nèi)存地址”、“釋放的堆內(nèi)存的源文件名稱”和“釋放的堆內(nèi)存程序代碼所在源文件中的行號”作為該模塊的輸入,該模塊將在重復釋放堆內(nèi)存檢查管理鏈表中添加一個結點并將輸入信息記錄。程序詳細流程如圖5所示。

圖3 刪除一個內(nèi)存泄露檢查跟蹤結點模塊流程圖

圖4 內(nèi)存泄露檢查跟蹤結點信息輸出模塊流程圖

圖5 增加一個內(nèi)存重復釋放檢查跟蹤結點模塊流程圖

2.2.2 內(nèi)存重復釋放檢查跟蹤結點信息輸出模塊

該模塊在一個測試用例被執(zhí)行完畢的時候被調(diào)用,也可以在使用者認為需要的時候調(diào)用,詳細流程圖如圖6所示。

2.2.3 避免內(nèi)存泄露和內(nèi)存重復釋放的建議

內(nèi)存泄露和內(nèi)存重復釋放是在設計與編碼期間引入的,當使用 C/C++ 進行開發(fā)時,采用一致的編程規(guī)范和養(yǎng)成良好的習慣是防止內(nèi)存泄漏發(fā)生的第一步,也是最重要的措施。應注意以下事項:①malloc/calloc與free、new與delete、open與close、fopen與fclose 等一定要成對出現(xiàn),特別是在函數(shù)帶有判斷分支語句退出時,一定記得在每個分支都要釋放該釋放的內(nèi)存、關閉必要的文件句柄;②正確處理malloc、calloc、open/fopen 等函數(shù)的返回值;③在釋放結構指針時,一定要遍歷釋放(處理)必要的結構中每個成員指針;④對于嵌入式系統(tǒng)而言,系統(tǒng)通常是一個確定的系統(tǒng),對于系統(tǒng)中用到的可以確定大小內(nèi)存,建議直接用數(shù)組或結構,不要動態(tài)申請。

圖6 內(nèi)存重復釋放檢查跟蹤結點信息輸出模塊流程圖

3 結束語

本文分析了VxWorks系統(tǒng)的動態(tài)內(nèi)存管理機制,建立了動態(tài)內(nèi)存管理模型,闡述了內(nèi)存池管理策略和內(nèi)存分配算法,在此基礎上,對編程中容易出現(xiàn)的內(nèi)存泄露和內(nèi)存重復釋放的問題給出了具體的故障檢測算法,并對內(nèi)存操作提出了建議。本文的內(nèi)容有助于提升VxWorks系統(tǒng)軟件的開發(fā)人員和測試人員的技能水平。

[1]顧勝元,楊丹,黃海倫.嵌入式實時動態(tài)內(nèi)存管理機制研究與應用[J].重慶工學院學報(自然科學),2009(1):117-121.

[2]殷戰(zhàn)寧,劉琳.VxWorks的內(nèi)存配置和管理[J].艦船電子對抗,2012,35(3):104- 109.

[3]何煦嵐,何曉嵐.基于多鏈表結構的嵌入式系統(tǒng)內(nèi)存管理[J].計算機應用與軟件,2008,25(4):58- 60.

2095-6835(2018)21-0006-03

TP316.2

A

10.15913/j.cnki.kjycx.2018.21.006

田宇(1984—),男,工學碩士,工程師,主要從事裝備質(zhì)量監(jiān)督與檢驗驗收方面的工作與研究。馬朝陽(1976—),男,大學本科,工程師,主要從事艦艇裝備保障方面的工作與研究。趙昶宇(1982—),男,陜西漢中人,工學碩士,高級工程師,主要從事嵌入式系統(tǒng)軟件測試方面的研究。

〔編輯:嚴麗琴〕

猜你喜歡
結點內(nèi)存分配
LEACH 算法應用于礦井無線通信的路由算法研究
基于八數(shù)碼問題的搜索算法的研究
1種新型燃油分配方案設計
筆記本內(nèi)存已經(jīng)在漲價了,但幅度不大,升級擴容無須等待
“春夏秋冬”的內(nèi)存
Crying Foul
遺產(chǎn)的分配
內(nèi)存搭配DDR4、DDR3L還是DDR3?
我會好好地分配時間
上網(wǎng)本為什么只有1GB?
新竹县| 永康市| 启东市| 大港区| 文昌市| 新竹县| 株洲市| 通州区| 龙南县| 南木林县| 汤原县| 弥勒县| 新河县| 垦利县| 丹巴县| 玛沁县| 密云县| 西贡区| 迁西县| 德令哈市| 武强县| 吴忠市| 谢通门县| 株洲县| 南平市| 永康市| 沙雅县| 云安县| 武川县| 牟定县| 蓝山县| 兴隆县| 红安县| 大厂| 德格县| 积石山| 延吉市| 揭阳市| 武功县| 永仁县| 马尔康县|