一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法和系統(tǒng)的制作方法
【專利摘要】本發(fā)明提供一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法和系統(tǒng),適用于VxWorks操作系統(tǒng),通過(guò)鏈表管理模塊,建立鏈表;通過(guò)遍歷模塊對(duì)操作系統(tǒng)內(nèi)的每一個(gè)已申請(qǐng)內(nèi)存塊進(jìn)行遍歷,并針對(duì)每一個(gè)已申請(qǐng)內(nèi)存塊:判斷鏈表上是否存在與已申請(qǐng)內(nèi)存塊的關(guān)鍵字相同的結(jié)點(diǎn):如存在,更新與已申請(qǐng)內(nèi)存塊的關(guān)鍵字相同的結(jié)點(diǎn)的信息;如不存在,將已申請(qǐng)內(nèi)存塊添加為一個(gè)新結(jié)點(diǎn);判斷鏈表上是否存在有未更新信息的結(jié)點(diǎn):如果有,則刪除未更新的結(jié)點(diǎn)后通過(guò)輸出模塊輸出鏈表;如果沒有,則直接輸出鏈表。并且,鏈表管理模塊、遍歷模塊和輸出模塊都是由控制模塊來(lái)控制管理的。本發(fā)明通過(guò)察看內(nèi)存使用和變化情況,有效、快捷地縮小內(nèi)存泄漏的定位,提供內(nèi)存實(shí)時(shí)使用情況。
【專利說(shuō)明】一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法和系統(tǒng)
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種內(nèi)存塊的統(tǒng)計(jì)方法,特別是涉及一種基于VxWorks操作系統(tǒng)的已 申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法和系統(tǒng)。
【背景技術(shù)】
[0002] 內(nèi)存管理是計(jì)算機(jī)科學(xué)中的一個(gè)重要研究領(lǐng)域,而內(nèi)存管理中的一個(gè)重要研究課 題是解決或處理內(nèi)存泄漏問(wèn)題。所謂的內(nèi)存泄漏,是指程序在申請(qǐng)獲得動(dòng)態(tài)內(nèi)存并使用完 畢后,不釋放動(dòng)態(tài)內(nèi)存就將保存動(dòng)態(tài)內(nèi)存地址的變量用于其它用途,是的這些動(dòng)態(tài)內(nèi)存不 可能再被程序使用,也無(wú)法被操作系統(tǒng)回收。
[0003] 內(nèi)存泄露是軟件開發(fā)中最常見也最棘手的程序錯(cuò)誤種類之一。對(duì)于規(guī)模較大的程 序,內(nèi)存泄露將導(dǎo)致程序最終因耗盡系統(tǒng)所有的內(nèi)存,無(wú)法再進(jìn)行內(nèi)存分配而崩潰。并且, 內(nèi)存泄露非常不容易查找和定位,使用常規(guī)的方法很難快速定位內(nèi)存泄露出現(xiàn)的具體位 置,特別是VxWorks操作系統(tǒng)。
[0004] VxWorks是美國(guó)Wind River公司設(shè)計(jì)開發(fā)的一種嵌入式實(shí)時(shí)操作系統(tǒng),是嵌入式 開發(fā)環(huán)境的關(guān)鍵組成部分。其以良好的可靠性和卓越的實(shí)時(shí)性被廣泛應(yīng)用于很多實(shí)時(shí)性 要求極高的領(lǐng)域。VxWorks采用用戶程序、內(nèi)核處于同一個(gè)內(nèi)存空間的共享內(nèi)存管理策略, 而且,操作系統(tǒng)對(duì)內(nèi)存空間沒有保護(hù),各個(gè)進(jìn)程或任務(wù)實(shí)際上共享一個(gè)內(nèi)存空間。一個(gè)任 務(wù)在執(zhí)行前,系統(tǒng)必須為它分配足夠的連續(xù)內(nèi)存空間,然后全部載入主存儲(chǔ)器的連續(xù)空間。 VxWorks操作系統(tǒng)一般運(yùn)行在嵌入式裝置里面,往往很難或不能重新啟動(dòng)系統(tǒng),因此若發(fā)生 了內(nèi)存泄露,常常無(wú)法通過(guò)靜態(tài)插裝等方式查找內(nèi)存泄露,而需要實(shí)時(shí)檢測(cè)內(nèi)存泄露,并定 位故障。因此,軟件開發(fā)人員在開發(fā)程序時(shí),必須保證不侵犯其他程序和內(nèi)核的內(nèi)存空間, 以免破壞系統(tǒng)的正常工作或?qū)е缕渌绦虍惓_\(yùn)行。
[0005] 目前,針對(duì)VxWorks操作系統(tǒng)的內(nèi)存管理主要是對(duì)內(nèi)存分區(qū)、內(nèi)存動(dòng)態(tài)申請(qǐng)和釋 放,以及空閑內(nèi)存塊進(jìn)行管理,但是,對(duì)已經(jīng)申請(qǐng)的內(nèi)存塊(正在被使用的內(nèi)存塊)不做任 何管理和"干涉",因此無(wú)法使用內(nèi)存管理機(jī)制對(duì)已申請(qǐng)內(nèi)存塊進(jìn)行分類統(tǒng)計(jì),軟件開發(fā)和 維護(hù)人員也就更加難以尋找發(fā)生內(nèi)存泄露的任務(wù)。
【發(fā)明內(nèi)容】
[0006] 鑒于以上所述現(xiàn)有技術(shù)的缺點(diǎn),本發(fā)明的目的在于提供一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì) 方法和系統(tǒng),用于解決現(xiàn)有技術(shù)中VxWorks操作系統(tǒng)中,無(wú)法對(duì)已申請(qǐng)內(nèi)存塊進(jìn)行統(tǒng)計(jì)管 理的問(wèn)題。
[0007] 為實(shí)現(xiàn)上述目的及其他相關(guān)目的,本發(fā)明提供一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,適 用于VxWorks操作系統(tǒng),包括:步驟一,建立鏈表;步驟二,遍歷所述VxWorks操作系統(tǒng)內(nèi)的 每一個(gè)已申請(qǐng)內(nèi)存塊,并針對(duì)每一個(gè)已申請(qǐng)內(nèi)存塊,判斷所述鏈表上是否存在與已申請(qǐng)內(nèi) 存塊的關(guān)鍵字相同的結(jié)點(diǎn):如果存在,則更新與已申請(qǐng)內(nèi)存塊的所述關(guān)鍵字相同的結(jié)點(diǎn)的 信息;如果不存在,則將已申請(qǐng)內(nèi)存塊添加為一個(gè)新結(jié)點(diǎn);步驟三,判斷所述鏈表上是否存 在有未更新信息的結(jié)點(diǎn):如果有,則刪除所述未更新信息的結(jié)點(diǎn),并跳轉(zhuǎn)至步驟四;如果沒 有,則直接跳轉(zhuǎn)至步驟四;步驟四,輸出所述鏈表。
[0008] 可選地,對(duì)所述VxWorks操作系統(tǒng)內(nèi)的已申請(qǐng)內(nèi)存塊的遍歷順序是由所述 VxWorks操作系統(tǒng)的已申請(qǐng)內(nèi)存塊的地址決定的。
[0009] 可選地,所述鏈表包括多個(gè)所述結(jié)點(diǎn),每一個(gè)所述結(jié)點(diǎn)包括一個(gè)或多個(gè)已申請(qǐng)內(nèi) 存塊。
[0010] 可選地,創(chuàng)建所述鏈表使用的內(nèi)存是從一個(gè)結(jié)構(gòu)體數(shù)組中申請(qǐng)的。
[0011] 可選地,所述關(guān)鍵字是已申請(qǐng)內(nèi)存塊的大小。
[0012] 可選地,所述關(guān)鍵字是使用已申請(qǐng)內(nèi)存塊的任務(wù)。
[0013] 可選地,已申請(qǐng)內(nèi)存塊的后4個(gè)字節(jié)用于描述所述任務(wù)的任務(wù)ID;在所述鏈表中, 任務(wù)ID、結(jié)點(diǎn)和已申請(qǐng)的內(nèi)存塊之間存在映射關(guān)系。
[0014] 一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)系統(tǒng),適用于VxWorks操作系統(tǒng),包括:鏈表管理模塊、 遍歷模塊、控制模塊和輸出模塊;所述鏈表管理模塊用于創(chuàng)建鏈表,生成、更新和刪除所述 鏈表中的結(jié)點(diǎn);所述遍歷模塊用于遍歷所述VxWorks操作系統(tǒng)內(nèi)的已申請(qǐng)內(nèi)存塊;所述控 制模塊用于根據(jù)已申請(qǐng)內(nèi)存塊的關(guān)鍵字控制管理所述鏈表管理模塊、所述遍歷模塊和所述 輸出模塊;其中,所述已申請(qǐng)內(nèi)存塊的關(guān)鍵字為已申請(qǐng)內(nèi)存塊的大小或使用已申請(qǐng)內(nèi)存塊 的任務(wù);所述輸出模塊用于輸出所述統(tǒng)計(jì)系統(tǒng)的統(tǒng)計(jì)結(jié)果。
[0015] 可選地,所述鏈表管理模塊所使用的內(nèi)存是從一個(gè)結(jié)構(gòu)體數(shù)組中申請(qǐng)的。
[0016] 可選地,所述鏈表包括多個(gè)所述結(jié)點(diǎn),所述結(jié)點(diǎn)包括一個(gè)或多個(gè)已申請(qǐng)內(nèi)存塊。
[0017] 如上所述,本發(fā)明的一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法和系統(tǒng),適用于VxWorks操作 系統(tǒng),其可以通過(guò)察看內(nèi)存使用和變化情況的手段,有效幫助軟件開發(fā)人員縮小內(nèi)存泄漏 問(wèn)題定位的范圍,也可以為軟件開發(fā)人員提供內(nèi)存使用情況的實(shí)時(shí)信息。當(dāng)系統(tǒng)發(fā)生內(nèi)存 泄漏,但開發(fā)或維護(hù)人員不確定是由哪個(gè)任務(wù)哪個(gè)內(nèi)存塊泄漏引起時(shí),使用本發(fā)明就可以 簡(jiǎn)單直觀地獲取到相應(yīng)的信息。
【專利附圖】
【附圖說(shuō)明】
[0018] 圖1顯示為本發(fā)明實(shí)施例公開的一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法的流程示意圖。
[0019] 圖2顯示為依據(jù)使用已申請(qǐng)內(nèi)存塊的任務(wù)使用本發(fā)明實(shí)施例公開的一種已申請(qǐng) 內(nèi)存塊的統(tǒng)計(jì)方法進(jìn)行統(tǒng)計(jì)的統(tǒng)計(jì)結(jié)果。
[0020] 圖3顯示為依據(jù)已申請(qǐng)內(nèi)存塊的大小使用本發(fā)明實(shí)施例公開的一種已申請(qǐng)內(nèi)存 塊的統(tǒng)計(jì)方法進(jìn)行統(tǒng)計(jì)的統(tǒng)計(jì)結(jié)果。
[0021] 圖4顯示為本發(fā)明實(shí)施例公開的一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)系統(tǒng)的結(jié)構(gòu)示意圖。
[0022] 元件標(biāo)號(hào)說(shuō)明
[0023] Sll ?S14 步驟
[0024] 200 已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)系統(tǒng)
[0025] 210 鏈表管理模塊
[0026] 220 遍歷模塊
[0027] 230 控制模塊
[0028] 240 輸出模塊
【具體實(shí)施方式】
[0029] 以下通過(guò)特定的具體實(shí)例說(shuō)明本發(fā)明的實(shí)施方式,本領(lǐng)域技術(shù)人員可由本說(shuō)明書 所揭露的內(nèi)容輕易地了解本發(fā)明的其他優(yōu)點(diǎn)與功效。本發(fā)明還可以通過(guò)另外不同的具體實(shí) 施方式加以實(shí)施或應(yīng)用,本說(shuō)明書中的各項(xiàng)細(xì)節(jié)也可以基于不同觀點(diǎn)與應(yīng)用,在沒有背離 本發(fā)明的精神下進(jìn)行各種修飾或改變。需說(shuō)明的是,在不沖突的情況下,以下實(shí)施例及實(shí)施 例中的特征可以相互組合。
[0030] 請(qǐng)參閱圖1至圖4需要說(shuō)明的是,以下實(shí)施例中所提供的圖示僅以示意方式說(shuō)明 本發(fā)明的基本構(gòu)想,遂圖式中僅顯示與本發(fā)明中有關(guān)的組件而非按照實(shí)際實(shí)施時(shí)的組件數(shù) 目、形狀及尺寸繪制,其實(shí)際實(shí)施時(shí)各組件的型態(tài)、數(shù)量及比例可為一種隨意的改變,且其 組件布局型態(tài)也可能更為復(fù)雜。
[0031] 實(shí)施例1
[0032] 本實(shí)施例公開了一種的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,適用于VxWorks操作系統(tǒng)。本 實(shí)施例是基于VxW 〇rks6. 8操作系統(tǒng)。VxWorks操作系統(tǒng)的內(nèi)存管理主要是對(duì)內(nèi)存分區(qū)、內(nèi) 存動(dòng)態(tài)申請(qǐng)和釋放,以及空閑內(nèi)存塊進(jìn)行的管理。但是VxWorks操作系統(tǒng)的內(nèi)存管理機(jī)制 對(duì)已申請(qǐng)內(nèi)存塊則不做任何的管理。
[0033] 在VxWorks操作系統(tǒng)中,內(nèi)存塊的頭部都會(huì)保存有當(dāng)前內(nèi)存塊的大小,所以對(duì)內(nèi) 存塊大小進(jìn)行統(tǒng)計(jì)可以在VxWorks操作系統(tǒng)的原有內(nèi)存管理機(jī)制上加以改進(jìn)來(lái)實(shí)現(xiàn);但是 如果對(duì)任務(wù)類型進(jìn)行統(tǒng)計(jì)就需要對(duì)內(nèi)存塊的頭部加以修改:VxWorks操作系統(tǒng)的內(nèi)存塊的 頭部一共有16個(gè)字節(jié),已申請(qǐng)內(nèi)存塊的頭部的后4個(gè)字節(jié)是預(yù)留的,因此,本實(shí)施例就使用 這最后4個(gè)字節(jié)來(lái)保存任務(wù)ID (Identification,標(biāo)識(shí)),這樣就可根據(jù)任務(wù)ID對(duì)各個(gè)任務(wù) 進(jìn)行內(nèi)存塊的統(tǒng)計(jì)。
[0034] 本實(shí)施例的已申請(qǐng)的內(nèi)存塊的統(tǒng)計(jì)方法是使用單向鏈表對(duì)已申請(qǐng)內(nèi)存塊信息進(jìn) 行分類統(tǒng)計(jì),如圖1所示,包括:
[0035] 步驟一 S11,建立鏈表;其中,鏈表是一個(gè)單向鏈表。
[0036] 單向鏈表創(chuàng)建時(shí)使用的內(nèi)存不是從堆內(nèi)存中動(dòng)態(tài)申請(qǐng)的,而是從一個(gè)全局的結(jié)構(gòu) 體數(shù)組中申請(qǐng)的。這樣既可以避免在統(tǒng)計(jì)過(guò)程中由于動(dòng)態(tài)申請(qǐng)和釋放內(nèi)存引起的部分統(tǒng)計(jì) 結(jié)果的偏差,也可以避免堆內(nèi)存即將耗盡時(shí)無(wú)法進(jìn)行統(tǒng)計(jì)或統(tǒng)計(jì)過(guò)程發(fā)生錯(cuò)誤。
[0037] 并且,如果對(duì)已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)是針對(duì)已申請(qǐng)內(nèi)存塊的大小而進(jìn)行的話,那么 鏈表僅包括多個(gè)結(jié)點(diǎn),且每一個(gè)結(jié)點(diǎn)包括一個(gè)或多個(gè)已申請(qǐng)的內(nèi)存塊。如果統(tǒng)計(jì)是針對(duì)使 用已申請(qǐng)內(nèi)存塊的任務(wù),那么,要將已申請(qǐng)內(nèi)存塊的頭部的后4個(gè)字節(jié)用來(lái)描述使用該已 申請(qǐng)內(nèi)存塊的任務(wù)的任務(wù)ID ;并且,鏈表在建立過(guò)程時(shí),結(jié)點(diǎn)和任務(wù)的任務(wù)ID之間是存在 映射關(guān)系的。其是通過(guò)回調(diào)函數(shù)在系統(tǒng)創(chuàng)建任務(wù)時(shí),將建立好映射的結(jié)點(diǎn)添加到鏈表中。這 樣可以統(tǒng)計(jì)一些已經(jīng)不存在,但仍然暫用一些堆內(nèi)存的任務(wù),也可以準(zhǔn)確地統(tǒng)計(jì)出任務(wù)名 為NULL的任務(wù)。
[0038] 本實(shí)施例的已申請(qǐng)內(nèi)存塊的數(shù)據(jù)結(jié)構(gòu)定義如下:
[0039]
【權(quán)利要求】
1. 一種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,適用于VxWorks操作系統(tǒng),其特征在于,所述已申請(qǐng) 內(nèi)存塊的統(tǒng)計(jì)方法包括: 步驟一,建立鏈表; 步驟二,遍歷所述VxWorks操作系統(tǒng)內(nèi)的每一個(gè)已申請(qǐng)內(nèi)存塊,并針對(duì)每一個(gè)已申請(qǐng) 內(nèi)存塊,判斷所述鏈表上是否存在與已申請(qǐng)內(nèi)存塊的關(guān)鍵字相同的結(jié)點(diǎn):如果存在,則更新 與已申請(qǐng)內(nèi)存塊的所述關(guān)鍵字相同的結(jié)點(diǎn)的信息;如果不存在,則將已申請(qǐng)內(nèi)存塊添加為 一個(gè)新結(jié)點(diǎn); 步驟三,判斷所述鏈表上是否存在有未更新信息的結(jié)點(diǎn):如果有,則刪除所述未更新信 息的結(jié)點(diǎn),并跳轉(zhuǎn)至步驟四;如果沒有,則直接跳轉(zhuǎn)至步驟四; 步驟四,輸出所述鏈表。
2. 根據(jù)權(quán)利要求1所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,其特征在于,對(duì)所述VxWorks操作 系統(tǒng)內(nèi)的已申請(qǐng)內(nèi)存塊的遍歷順序是由所述VxWorks操作系統(tǒng)的已申請(qǐng)內(nèi)存塊的地址決 定的。
3. 根據(jù)權(quán)利要求1所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,其特征在于,所述鏈表包括多個(gè) 所述結(jié)點(diǎn),每一個(gè)所述結(jié)點(diǎn)包括一個(gè)或多個(gè)已申請(qǐng)內(nèi)存塊。
4. 根據(jù)權(quán)利要求1所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,其特征在于,創(chuàng)建所述鏈表使用 的內(nèi)存是從一個(gè)結(jié)構(gòu)體數(shù)組中申請(qǐng)的。
5. 根據(jù)權(quán)利要求1所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,其特征在于,所述關(guān)鍵字是已申 請(qǐng)內(nèi)存塊的大小。
6. 根據(jù)權(quán)利要求1所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,其特征在于,所述關(guān)鍵字是使用 已申請(qǐng)內(nèi)存塊的任務(wù)。
7. 根據(jù)權(quán)利要求6所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)方法,其特征在于,已申請(qǐng)內(nèi)存塊的后 4個(gè)字節(jié)用于描述所述任務(wù)的任務(wù)ID ;在所述鏈表中,任務(wù)ID、結(jié)點(diǎn)和已申請(qǐng)的內(nèi)存塊之間 存在映射關(guān)系。
8. -種已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)系統(tǒng),適用于VxWorks操作系統(tǒng),其特征在于,所述已申請(qǐng) 內(nèi)存塊的統(tǒng)計(jì)系統(tǒng)包括:鏈表管理模塊、遍歷模塊、控制模塊和輸出模塊; 所述鏈表管理模塊用于創(chuàng)建鏈表,生成、更新和刪除所述鏈表中的結(jié)點(diǎn); 所述遍歷模塊用于遍歷所述VxWorks操作系統(tǒng)內(nèi)的已申請(qǐng)內(nèi)存塊; 所述控制模塊用于根據(jù)已申請(qǐng)內(nèi)存塊的關(guān)鍵字控制管理所述鏈表管理模塊、所述遍歷 模塊和所述輸出模塊;其中,所述已申請(qǐng)內(nèi)存塊的關(guān)鍵字為已申請(qǐng)內(nèi)存塊的大小或使用已 申請(qǐng)內(nèi)存塊的任務(wù); 所述輸出模塊用于輸出所述統(tǒng)計(jì)系統(tǒng)的統(tǒng)計(jì)結(jié)果。
9. 根據(jù)權(quán)利要求8所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)系統(tǒng),其特征在于,所述鏈表管理模塊 所使用的內(nèi)存是從一個(gè)結(jié)構(gòu)體數(shù)組中申請(qǐng)的。
10. 根據(jù)權(quán)利要求8所述的已申請(qǐng)內(nèi)存塊的統(tǒng)計(jì)系統(tǒng),其特征在于,所述鏈表包括多個(gè) 所述結(jié)點(diǎn),所述結(jié)點(diǎn)包括一個(gè)或多個(gè)已申請(qǐng)內(nèi)存塊。
【文檔編號(hào)】G06F12/02GK104360954SQ201410604528
【公開日】2015年2月18日 申請(qǐng)日期:2014年10月30日 優(yōu)先權(quán)日:2014年10月30日
【發(fā)明者】陸丹宏, 周琳, 劉馳 申請(qǐng)人:上海斐訊數(shù)據(jù)通信技術(shù)有限公司