亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種內(nèi)存管理方法及系統(tǒng)與流程

文檔序號(hào):11917938閱讀:232來(lái)源:國(guó)知局
一種內(nèi)存管理方法及系統(tǒng)與流程

本發(fā)明涉及內(nèi)存領(lǐng)域,尤其涉及一種內(nèi)存管理方法及系統(tǒng)。



背景技術(shù):

在工業(yè)控制和嵌入式應(yīng)用領(lǐng)域,對(duì)系統(tǒng)的實(shí)時(shí)性要求較高,由于系統(tǒng)的內(nèi)存資源是有限的,當(dāng)應(yīng)用軟件占用內(nèi)存過(guò)多時(shí),系統(tǒng)的實(shí)時(shí)性就會(huì)降低,這可能給整個(gè)系統(tǒng)帶來(lái)安全隱患,因此,為了保證系統(tǒng)的實(shí)時(shí)性,必須控制應(yīng)用系統(tǒng)內(nèi)存的占用量,同時(shí)還必須實(shí)現(xiàn)內(nèi)存的快速申請(qǐng)和釋放。

目前常用內(nèi)存申請(qǐng)接口,是直接從系統(tǒng)堆中分配內(nèi)存塊,具體的,操作系統(tǒng)首先從管理的內(nèi)存中查找出大于所需內(nèi)存大小的內(nèi)存空間給用戶,然后建立索引,并通過(guò)索引結(jié)構(gòu)管理這片分配給用戶的內(nèi)存,而查找合適的內(nèi)存空間并建立索引是比較耗時(shí)的操作,且由于用戶每次申請(qǐng)的內(nèi)存塊大小不規(guī)律,并存在頻繁的申請(qǐng)和釋放,這樣就會(huì)產(chǎn)生大量的內(nèi)存碎片,導(dǎo)致大塊內(nèi)存申請(qǐng)無(wú)法滿足,從而會(huì)更多的占用系統(tǒng)資源。例如,現(xiàn)有的以openwrt為框架的小型嵌入式系統(tǒng)中,沒(méi)有單獨(dú)去劃分和管理內(nèi)存,沒(méi)有慎重考慮內(nèi)存碎片以及內(nèi)存故障診斷問(wèn)題。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明提供一種內(nèi)存管理方法及系統(tǒng),用以解決現(xiàn)有技術(shù)中存在的內(nèi)存申請(qǐng)與釋放速率低、內(nèi)存碎片較多,出現(xiàn)內(nèi)存故障也不容易定位等問(wèn)題。

本發(fā)明方一種內(nèi)存管理方法,包括:

S10內(nèi)存申請(qǐng)方法:

S110根據(jù)業(yè)務(wù)信息申請(qǐng)內(nèi)存的需求,查找相應(yīng)規(guī)格的內(nèi)存空閑鏈表中是否存在空閑內(nèi)存塊,若是,則進(jìn)入步驟S120;否則,進(jìn)入步驟S130;

S120從所述內(nèi)存空閑鏈表中移除一空閑內(nèi)存塊,進(jìn)入步驟S140;

S130向系統(tǒng)申請(qǐng)相應(yīng)的空閑內(nèi)存塊;

S140將所述空閑內(nèi)存塊分配給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息,并添加到所述業(yè)務(wù)所屬的模塊號(hào)的內(nèi)存占用鏈表中;

S20內(nèi)存釋放方法:

S210將待釋放的內(nèi)存塊從所述模塊號(hào)的內(nèi)存占用鏈表中移除;

S220將所述內(nèi)存塊進(jìn)行清空處理,還原至空閑內(nèi)存塊狀態(tài);

S230根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊鏈接在相應(yīng)規(guī)格的內(nèi)存空閑鏈表中。

通過(guò)多個(gè)空閑鏈表和內(nèi)存占用鏈表,快速實(shí)現(xiàn)內(nèi)存的申請(qǐng)與釋放,且每一業(yè)務(wù)申請(qǐng)對(duì)應(yīng)分配一個(gè)內(nèi)存塊,避免了內(nèi)存碎片的產(chǎn)生。

進(jìn)一步的,還包括:

S010進(jìn)程啟動(dòng)時(shí),先將內(nèi)存初始化,并根據(jù)所述進(jìn)程向系統(tǒng)申請(qǐng)一內(nèi)存池;

S020根據(jù)所述進(jìn)程,將所述內(nèi)存池劃分成不同規(guī)格的內(nèi)存塊組;同一內(nèi)存塊組中包含若干大小相等的空閑內(nèi)存塊;所述內(nèi)存塊包括結(jié)構(gòu)頭、可存儲(chǔ)區(qū)、和診斷尾;所述結(jié)構(gòu)頭和診斷尾用于存儲(chǔ)數(shù)據(jù)的相關(guān)信息,且所述結(jié)構(gòu)頭上存儲(chǔ)有雙向指針;

S030將同一內(nèi)存塊組的空閑內(nèi)存塊通過(guò)所述雙向指針鏈接起來(lái),形成所述規(guī)格的內(nèi)存空閑鏈表;

S040當(dāng)所述進(jìn)程中的模塊號(hào)下的業(yè)務(wù)占用了內(nèi)存塊時(shí),利用所述雙向指針,將所述進(jìn)程中同一個(gè)模塊號(hào)下已占用的內(nèi)存塊鏈接起來(lái)構(gòu)成內(nèi)存占用鏈表。

根據(jù)具體的進(jìn)程,預(yù)估內(nèi)存的大小,然后申請(qǐng)預(yù)估大小的內(nèi)存池,并根據(jù)具體進(jìn)程將內(nèi)存池劃分成內(nèi)存塊,相同規(guī)格大小的內(nèi)存塊屬于同一個(gè)內(nèi)存塊組,同一內(nèi)存塊組中的內(nèi)存塊鏈接成了一個(gè)空閑內(nèi)存鏈表,也就是說(shuō),有多少種規(guī)格的內(nèi)存塊或者說(shuō)內(nèi)存塊組,也就有多少種相應(yīng)的空閑內(nèi)存鏈表。一個(gè)空閑內(nèi)存鏈表中的空閑內(nèi)存塊大小相同,這樣非常便于內(nèi)存申請(qǐng)時(shí)的分配與管理,處理起來(lái)高效而快速。

一個(gè)進(jìn)程中有不同的模塊號(hào),每個(gè)模塊號(hào)下有若干業(yè)務(wù)信息。而內(nèi)存占用鏈表是根據(jù)模塊號(hào)來(lái)分組。一個(gè)進(jìn)程下有多少個(gè)模塊號(hào),便對(duì)應(yīng)了有多少個(gè)內(nèi)存占用鏈表。同一個(gè)模塊號(hào)下的業(yè)務(wù)申請(qǐng)的內(nèi)存塊鏈接在一個(gè)內(nèi)存占用鏈表中,使得管理起來(lái)容易,且出現(xiàn)問(wèn)題的話,更容易查找定位。

進(jìn)一步的,還包括S30診斷方法:

S310查找相應(yīng)模塊號(hào)的內(nèi)存占用鏈表;

S320遍歷所述內(nèi)存占用鏈表,判斷所述內(nèi)存占用鏈表中的內(nèi)存塊的結(jié)構(gòu)頭信息是否被擦寫,若是進(jìn)入步驟S330;

S330判斷所述內(nèi)存塊為壞塊。

遍歷內(nèi)存占用鏈表,通過(guò)結(jié)構(gòu)頭的信息是否被擦寫來(lái)判斷該內(nèi)存塊是否是壞塊,或者通過(guò)結(jié)構(gòu)頭信息中的標(biāo)注位是否被更改也可判斷該內(nèi)存塊是否是壞塊,如此,可快速找到故障所在。另外,還可根據(jù)內(nèi)存塊的診斷尾存儲(chǔ)的位置信息,快速索引到對(duì)應(yīng)的申請(qǐng)位置。

進(jìn)一步的,所述步驟S120包括步驟:

S121從所述內(nèi)存空閑鏈表的頭部或尾部移除所述空閑內(nèi)存塊;

所述步驟S140包括步驟:

S141根據(jù)所述業(yè)務(wù)信息,填充所述內(nèi)存塊的結(jié)構(gòu)頭和診斷尾信息,所述內(nèi)存塊的可存儲(chǔ)區(qū)用于給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息;

S142將所述內(nèi)存塊掛載在以所述業(yè)務(wù)所屬的模塊號(hào)為下標(biāo)的內(nèi)存占用鏈表頭部或尾部;

所述步驟S210包括:

S211根據(jù)待釋放內(nèi)存塊的雙向指針,在所述模塊號(hào)的內(nèi)存占用鏈表中找到所述待釋放內(nèi)存塊的前一內(nèi)存塊及后一內(nèi)存塊;

S212將所述待釋放內(nèi)存塊從所述內(nèi)存占用鏈表中移除;

S213將所述待釋放內(nèi)存塊的前一內(nèi)存塊和后一內(nèi)存塊鏈接起來(lái);

所述步驟S230包括:

S231根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊掛載在相應(yīng)規(guī)格的內(nèi)存空閑鏈表頭部或尾部。

根據(jù)預(yù)設(shè)的規(guī)則,在鏈表中增加內(nèi)存塊時(shí),掛載在該鏈表的頭部或尾部,無(wú)需考慮內(nèi)存塊的地址信息來(lái)插入鏈表,管理簡(jiǎn)單,快速。

同樣的,在內(nèi)存使用中,從空閑內(nèi)存鏈表中移除空閑內(nèi)存塊時(shí),也不需考慮地址問(wèn)題,直接從內(nèi)存空閑鏈表的頭部或尾部移除使用即可。

進(jìn)一步的,所述內(nèi)存塊的結(jié)構(gòu)頭,用于存儲(chǔ)雙向指針、內(nèi)存塊的總大小、存儲(chǔ)的數(shù)據(jù)標(biāo)識(shí)位、及所屬的模塊號(hào)信息;

所述內(nèi)存塊的診斷尾,用于存儲(chǔ)申請(qǐng)所述內(nèi)存塊的文件名、行號(hào)信息。

所述內(nèi)存塊的大小為2i,其中i為自然數(shù)。

內(nèi)存塊的結(jié)構(gòu)頭和診斷尾存儲(chǔ)了數(shù)據(jù)的相關(guān)信息,便于查找、判斷和定位。

本發(fā)明還提供了一種內(nèi)存管理系統(tǒng),包括內(nèi)存管理模塊、查找模塊、操作模塊,所述內(nèi)存管理模塊分別與所述查找模塊、操作模塊相連;其中:

當(dāng)所述內(nèi)存管理模塊接收到內(nèi)存申請(qǐng)時(shí),根據(jù)業(yè)務(wù)信息申請(qǐng)內(nèi)存的需求,通過(guò)所述查找模塊查找相應(yīng)規(guī)格的內(nèi)存空閑鏈表中是否存在空閑內(nèi)存塊,若是,則所述操作模塊在所述內(nèi)存管理模塊的控制下,從所述內(nèi)存空閑鏈表中移除一空閑內(nèi)存塊,否則所述內(nèi)存管理模塊向系統(tǒng)申請(qǐng)相應(yīng)的空閑內(nèi)存塊;

所述內(nèi)存管理模塊將所述空閑內(nèi)存塊分配給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息,所述操作模塊將所述存儲(chǔ)數(shù)據(jù)信息的內(nèi)存塊添加到所述業(yè)務(wù)所屬的模塊號(hào)的內(nèi)存占用鏈表中;

當(dāng)所述內(nèi)存管理模塊接收到內(nèi)存釋放申請(qǐng)時(shí),所述操作模塊在所述內(nèi)存管理模塊的控制下,將待釋放的內(nèi)存塊從所述模塊號(hào)的內(nèi)存占用鏈表中移除;并將所述內(nèi)存塊進(jìn)行清空處理,還原至空閑內(nèi)存塊狀態(tài);再根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊鏈接在相應(yīng)規(guī)格的內(nèi)存空閑鏈表中。

通過(guò)本發(fā)明的系統(tǒng),可快速申請(qǐng)內(nèi)存和釋放內(nèi)存,且不會(huì)產(chǎn)生內(nèi)存碎片。

進(jìn)一步的,還包括初始化模塊,內(nèi)存空間申請(qǐng)模塊、內(nèi)存空間劃分模塊;所述內(nèi)存空間申請(qǐng)模塊分別與所述初始化模塊及所述內(nèi)存空間劃分模塊相連,且所述內(nèi)存管理模塊分別與所述內(nèi)存空間申請(qǐng)模塊、內(nèi)存空間劃分模塊相連,其中:

當(dāng)進(jìn)程啟動(dòng)時(shí),所述初始模塊將內(nèi)存初始化,所述內(nèi)存空間申請(qǐng)模塊根據(jù)所述進(jìn)程向系統(tǒng)申請(qǐng)一內(nèi)存池;

所述內(nèi)存空間劃分模塊根據(jù)所述進(jìn)程,將所述內(nèi)存池劃分成不同規(guī)格的內(nèi)存塊組;同一內(nèi)存塊組中包含若干大小相等的空閑內(nèi)存塊;所述內(nèi)存塊包括結(jié)構(gòu)頭、可存儲(chǔ)區(qū)、和診斷尾;所述結(jié)構(gòu)頭和診斷尾用于存儲(chǔ)數(shù)據(jù)的相關(guān)信息,且所述結(jié)構(gòu)頭上存儲(chǔ)有雙向指針;

所述內(nèi)存管理模塊將同一內(nèi)存塊組的空閑內(nèi)存塊通過(guò)所述雙向指針鏈接起來(lái),形成所述規(guī)格的內(nèi)存空閑鏈表;

當(dāng)所述內(nèi)存管理模塊判斷進(jìn)程中的模塊號(hào)下的業(yè)務(wù)占用了內(nèi)存塊時(shí),所述內(nèi)存管理模塊利用所述雙向指針,將所述進(jìn)程中同一個(gè)模塊號(hào)下已占用的內(nèi)存塊鏈接起來(lái)構(gòu)成內(nèi)存占用鏈表。

進(jìn)一步的,還包括遍歷判斷模塊,所述遍歷判斷模塊分別與所述查找模塊及內(nèi)存管理模塊相連,其中:

所述查找模塊查找相應(yīng)模塊號(hào)的內(nèi)存占用鏈表;

所述遍歷判斷模塊遍歷所述內(nèi)存占用鏈表,判斷所述內(nèi)存占用鏈表中的內(nèi)存塊的結(jié)構(gòu)頭信息是否被擦寫,若是,則判斷所述內(nèi)存塊為壞塊。

本系統(tǒng)還能夠?qū)?nèi)存塊進(jìn)行診斷,判斷該內(nèi)存塊是否是壞塊,根據(jù)壞塊位置來(lái)對(duì)內(nèi)存故障進(jìn)行定位。

進(jìn)一步的,內(nèi)存申請(qǐng)時(shí):

所述操作模塊在所述內(nèi)存管理模塊的控制下,從所述內(nèi)存空閑鏈表中移除一空閑內(nèi)存塊是指所述操作模塊在所述內(nèi)存管理模塊的控制下,從所述內(nèi)存空閑鏈表的頭部或尾部移除一空閑內(nèi)存塊;

所述內(nèi)存管理模塊將所述空閑內(nèi)存塊分配給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息,所述操作模塊將所述存儲(chǔ)數(shù)據(jù)信息的內(nèi)存塊添加到所述業(yè)務(wù)所屬的模塊號(hào)下的內(nèi)存占用鏈表中包括:所述內(nèi)存管理模塊根據(jù)所述業(yè)務(wù)信息,填充所述內(nèi)存塊的結(jié)構(gòu)頭和診斷尾信息,所述內(nèi)存塊的可存儲(chǔ)區(qū)用于給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息;所述操作模塊在所述內(nèi)存管理模塊的控制下將所述內(nèi)存塊掛載在以所述業(yè)務(wù)所屬的模塊號(hào)為下標(biāo)的內(nèi)存占用鏈表頭部或尾部;

內(nèi)存釋放時(shí):

所述操作模塊在所述內(nèi)存管理模塊的控制下,將待釋放的內(nèi)存塊從所述模塊號(hào)的內(nèi)存占用鏈表中移除包括:所述操作模塊在所述內(nèi)存管理模塊的控制下,根據(jù)待釋放內(nèi)存塊的雙向指針,在所述模塊號(hào)的內(nèi)存占用鏈表中找到所述待釋放內(nèi)存塊的前一內(nèi)存塊及后一內(nèi)存塊;所述操作模塊將所述待釋放內(nèi)存塊從所述內(nèi)存占用鏈表中移除;所述操作模塊將所述待釋放內(nèi)存塊的前一內(nèi)存塊和后一內(nèi)存塊鏈接起來(lái);

所述操作模塊根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊鏈接在相應(yīng)規(guī)格的內(nèi)存空閑鏈表中是指所述操作模塊根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊掛載在相應(yīng)規(guī)格的內(nèi)存空閑鏈表頭部或尾部。

進(jìn)一步的,所述內(nèi)存塊的結(jié)構(gòu)頭,用于存儲(chǔ)雙向指針、內(nèi)存塊的總大小、存儲(chǔ)的數(shù)據(jù)標(biāo)識(shí)位、及所屬的模塊號(hào)信息;

所述內(nèi)存塊的診斷尾,用于存儲(chǔ)申請(qǐng)所述內(nèi)存塊的文件名、行號(hào)信息。

所述內(nèi)存塊的大小為2i,其中i為自然數(shù)。

本發(fā)明有益效果如下:

本發(fā)明提供的內(nèi)存管理方法及系統(tǒng),有效提高了內(nèi)存申請(qǐng)與釋放的效率,避免了內(nèi)存碎片的產(chǎn)生,增加了系統(tǒng)的穩(wěn)定性。此外,通過(guò)本發(fā)明還能對(duì)故障進(jìn)行診斷和定位。

附圖說(shuō)明

為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

圖1a為本發(fā)明內(nèi)存管理方法第一實(shí)施例中的內(nèi)存申請(qǐng)方法流程圖;

圖1b為本發(fā)明內(nèi)存管理方法第一實(shí)施例中的內(nèi)存釋放方法流程圖;

圖2為本發(fā)明內(nèi)存管理方法第二實(shí)施例中的申請(qǐng)內(nèi)存池,并進(jìn)行劃分管理方法流程圖;

圖3a為本發(fā)明內(nèi)存管理方法第四實(shí)施例中的內(nèi)存申請(qǐng)方法流程圖;

圖3b為本發(fā)明內(nèi)存管理方法第四實(shí)施例中的內(nèi)存釋放方法流程圖;

圖4為本發(fā)明內(nèi)存管理方法另一實(shí)施例中的內(nèi)存塊結(jié)構(gòu)示意圖;

圖5為本發(fā)明內(nèi)存管理方法另一實(shí)施例中的內(nèi)存桶示意圖;

圖6a為本發(fā)明內(nèi)存管理方法另一實(shí)施例中的內(nèi)存申請(qǐng)方法流程圖;

圖6b為本發(fā)明內(nèi)存管理方法另一實(shí)施例中的內(nèi)存釋放方法流程圖;

圖6c為本發(fā)明內(nèi)存管理方法另一實(shí)施例中的內(nèi)存診斷方法流程圖;

圖7為本發(fā)明內(nèi)存管理系統(tǒng)實(shí)施例結(jié)構(gòu)框圖。

具體實(shí)施方式

為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步地詳細(xì)描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部份實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其它實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。

本發(fā)明公開了一種內(nèi)存管理方法,本方法第一實(shí)施例包括了申請(qǐng)方法和釋放方法,具體的:

S10內(nèi)存申請(qǐng)方法,如圖1a所示,包括:

S110根據(jù)業(yè)務(wù)信息申請(qǐng)內(nèi)存的需求,查找相應(yīng)規(guī)格的內(nèi)存空閑鏈表中是否存在空閑內(nèi)存塊,若是,則進(jìn)入步驟S120;否則,進(jìn)入步驟S130;

S120從所述內(nèi)存空閑鏈表中移除一空閑內(nèi)存塊,進(jìn)入步驟S140;

S130向系統(tǒng)申請(qǐng)相應(yīng)的空閑內(nèi)存塊;

S140將所述空閑內(nèi)存塊分配給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息,并添加到所述業(yè)務(wù)所屬的模塊號(hào)的內(nèi)存占用鏈表中;

S20內(nèi)存釋放方法,如圖1b所示,包括:

S210將待釋放的內(nèi)存塊從所述模塊號(hào)的內(nèi)存占用鏈表中移除;

S220將所述內(nèi)存塊進(jìn)行清空處理,還原至空閑內(nèi)存塊狀態(tài);

S230根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊鏈接在相應(yīng)規(guī)格的內(nèi)存空閑鏈表中。

通過(guò)多個(gè)內(nèi)存空閑鏈表、進(jìn)程下的不同模塊號(hào)的內(nèi)存占用鏈表來(lái)對(duì)內(nèi)存進(jìn)行統(tǒng)一管理,將空閑內(nèi)存塊按照規(guī)格大小鏈接在相應(yīng)規(guī)格的內(nèi)存空閑鏈表中,內(nèi)存申請(qǐng)時(shí),只需根據(jù)業(yè)務(wù)信息申請(qǐng)內(nèi)存的大小,快速找到大于或等于該申請(qǐng)內(nèi)存大小,且最接近該申請(qǐng)內(nèi)存大小的內(nèi)存塊組,從內(nèi)存塊組所在的內(nèi)存空閑鏈表中將一空閑內(nèi)存塊移除,用于存儲(chǔ)該業(yè)務(wù)數(shù)據(jù)信息,該內(nèi)存塊被占用后,再根據(jù)存儲(chǔ)的業(yè)務(wù)所屬的模塊號(hào),將該內(nèi)存塊添加到該模塊號(hào)的內(nèi)存占用鏈表中。內(nèi)存釋放時(shí),則將待釋放的內(nèi)存塊從內(nèi)存占用鏈表中移除,清空還原處理后再添加到相應(yīng)的內(nèi)存空閑鏈表中即可。通過(guò)內(nèi)存空閑鏈表和內(nèi)存占用鏈表來(lái)管理內(nèi)存塊,避免內(nèi)存碎片問(wèn)題,提升內(nèi)存處理的效率和準(zhǔn)確性。

本發(fā)明方法的第二實(shí)施例,在上述內(nèi)存申請(qǐng)與釋放管理之前,系統(tǒng)啟動(dòng)時(shí),需根據(jù)進(jìn)程申請(qǐng)內(nèi)存池,并進(jìn)行劃分管理,具體的,如圖2所示,包括步驟:

S010進(jìn)程啟動(dòng)時(shí),先將內(nèi)存初始化,并根據(jù)所述進(jìn)程向系統(tǒng)申請(qǐng)一內(nèi)存池;

S020根據(jù)所述進(jìn)程,將所述內(nèi)存池劃分成不同規(guī)格的內(nèi)存塊組;同一內(nèi)存塊組中包含若干大小相等的空閑內(nèi)存塊;所述內(nèi)存塊包括結(jié)構(gòu)頭、可存儲(chǔ)區(qū)、和診斷尾;所述結(jié)構(gòu)頭和診斷尾用于存儲(chǔ)數(shù)據(jù)的相關(guān)信息,且所述結(jié)構(gòu)頭上存儲(chǔ)有雙向指針;

S030將同一內(nèi)存塊組的空閑內(nèi)存塊通過(guò)所述雙向指針鏈接起來(lái),形成所述規(guī)格的內(nèi)存空閑鏈表;

S040當(dāng)所述進(jìn)程中的模塊號(hào)下的業(yè)務(wù)占用了內(nèi)存塊時(shí),利用所述雙向指針,將所述進(jìn)程中同一個(gè)模塊號(hào)下已占用的內(nèi)存塊鏈接起來(lái)構(gòu)成內(nèi)存占用鏈表。

以進(jìn)程為基本單位,每一進(jìn)程申請(qǐng)一內(nèi)存池,內(nèi)存池中地址是連續(xù)的,當(dāng)然內(nèi)存池的大小是根據(jù)這個(gè)進(jìn)程預(yù)估得出的,一般不會(huì)出現(xiàn)不夠用的情況。獲取內(nèi)存池后再根據(jù)進(jìn)程進(jìn)行預(yù)估,將內(nèi)存池劃分成不同規(guī)格的內(nèi)存塊組,每一個(gè)內(nèi)存塊組中有許多大小相同的內(nèi)存塊。例如,32K的內(nèi)存塊組中所含的內(nèi)存塊均為32K大小;64K的內(nèi)存塊組中所含的內(nèi)存塊均為64K大小。而每一個(gè)內(nèi)存塊中又劃分出了結(jié)構(gòu)頭、診斷尾和中間部分的可存儲(chǔ)區(qū);其中結(jié)構(gòu)頭和診斷尾用于存儲(chǔ)業(yè)務(wù)數(shù)據(jù)的相關(guān)信息,比如存儲(chǔ)的文件名、數(shù)據(jù)大小、標(biāo)識(shí)位、申請(qǐng)信息所處的行號(hào)等等;可存儲(chǔ)區(qū)用于存儲(chǔ)具體的數(shù)據(jù)信息;結(jié)構(gòu)頭中還存儲(chǔ)有雙向指針,通過(guò)內(nèi)存塊的雙向指針鏈接起來(lái)的鏈表中,內(nèi)存塊中的雙向指針?lè)謩e指向與之相連的后一內(nèi)存塊和前一內(nèi)存塊。所以,從該鏈表的任意一個(gè)內(nèi)存塊開始,都可以很方便地訪問(wèn)它的前一內(nèi)存塊和后一內(nèi)存塊。內(nèi)存占用鏈表是以模塊號(hào)來(lái)劃分的,同一個(gè)進(jìn)程下有許多不同的模塊號(hào),不同的模塊號(hào)下有許多的的業(yè)務(wù)請(qǐng)求,每一個(gè)業(yè)務(wù)請(qǐng)求會(huì)分配一個(gè)空閑內(nèi)存塊,屬于同一個(gè)模塊下的業(yè)務(wù)請(qǐng)求獲取的內(nèi)存塊會(huì)通過(guò)雙向指針鏈接在一起,構(gòu)成該模塊的內(nèi)存占用鏈表。

本發(fā)明內(nèi)存管理方法的第三實(shí)施例,在上述實(shí)施例的基礎(chǔ)上,還包括診斷方法,具體的,包括:

S310查找相應(yīng)模塊號(hào)的內(nèi)存占用鏈表;

S320遍歷所述內(nèi)存占用鏈表,判斷所述內(nèi)存占用鏈表中的內(nèi)存塊的結(jié)構(gòu)頭信息是否被擦寫,若是進(jìn)入步驟S330;

S330判斷所述內(nèi)存塊為壞塊。

每一個(gè)內(nèi)存塊的結(jié)構(gòu)頭部分均存儲(chǔ)有數(shù)據(jù)的相關(guān)信息,比如申請(qǐng)文件大小、名稱、標(biāo)識(shí)位等,如果占用鏈表中的某個(gè)內(nèi)存塊的結(jié)構(gòu)頭信息被擦寫了,很可能是前一內(nèi)存塊的數(shù)據(jù)溢出了,從而擦寫了后一內(nèi)存塊的結(jié)構(gòu)頭信息,那么只需要查看內(nèi)存塊的結(jié)構(gòu)頭信息部分,即可判斷是否被占用了,如果被占用,那么就判斷這個(gè)內(nèi)存塊為壞塊,同時(shí)也可以查找到相應(yīng)的數(shù)據(jù)溢出的內(nèi)存塊所處的位置,便于后續(xù)處理。如果結(jié)構(gòu)頭中存儲(chǔ)有標(biāo)識(shí)位,也可以查看結(jié)構(gòu)頭的標(biāo)識(shí)位是否改變來(lái)判斷是否為壞塊。本實(shí)施例提供的內(nèi)存診斷方法,是一種內(nèi)存故障定位的簡(jiǎn)單有效手段。

本發(fā)明的內(nèi)存管理方法第四實(shí)施例,在上述第二實(shí)施例的基礎(chǔ)上,其內(nèi)存申請(qǐng)方法,如圖3a所示,包括:

S110根據(jù)業(yè)務(wù)信息申請(qǐng)內(nèi)存的需求,查找相應(yīng)規(guī)格的內(nèi)存空閑鏈表中是否存在空閑內(nèi)存塊,若是,則進(jìn)入步驟S120;否則,進(jìn)入步驟S130

S121從所述內(nèi)存空閑鏈表的頭部或尾部移除所述空閑內(nèi)存塊;

S130向系統(tǒng)申請(qǐng)相應(yīng)的空閑內(nèi)存塊;

S141根據(jù)所述業(yè)務(wù)信息,填充所述內(nèi)存塊的結(jié)構(gòu)頭和診斷尾信息,所述內(nèi)存塊的可存儲(chǔ)區(qū)用于給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息;

S142將所述內(nèi)存塊掛載在以所述業(yè)務(wù)所屬的模塊號(hào)為下標(biāo)的內(nèi)存占用鏈表頭部或尾部;

內(nèi)存釋放方法,如圖3b所示,包括:

所述步驟S210包括:

S211根據(jù)待釋放內(nèi)存塊的雙向指針,在所述模塊號(hào)的內(nèi)存占用鏈表中找到所述待釋放內(nèi)存塊的前一內(nèi)存塊及后一內(nèi)存塊;

S212將所述待釋放內(nèi)存塊從所述內(nèi)存占用鏈表中移除;

S213將所述待釋放內(nèi)存塊的前一內(nèi)存塊和后一內(nèi)存塊鏈接起來(lái);

S220將所述內(nèi)存塊進(jìn)行清空處理,還原至空閑內(nèi)存塊狀態(tài);

S231根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊掛載在相應(yīng)規(guī)格的內(nèi)存空閑鏈表頭部或尾部。

空閑內(nèi)存鏈表中空閑內(nèi)存塊的移除,可根據(jù)預(yù)設(shè)規(guī)則,從空閑內(nèi)存鏈表的頭部或尾部移除空閑內(nèi)存塊;而內(nèi)存塊被釋放后,也可根據(jù)預(yù)設(shè)規(guī)則,掛載在空閑內(nèi)存鏈表的頭部或尾部;

同樣的,添加在占用內(nèi)存鏈表中的內(nèi)存塊,也可根據(jù)預(yù)設(shè)規(guī)則,掛載在內(nèi)存占用鏈表的頭部或尾部。

如此,操作起來(lái)簡(jiǎn)單而快速,提高了內(nèi)存管理效率。

較佳的,在上述任一實(shí)施例的基礎(chǔ)上,所述內(nèi)存塊的結(jié)構(gòu)頭,用于存儲(chǔ)雙向指針、內(nèi)存塊的總大小、存儲(chǔ)的數(shù)據(jù)標(biāo)識(shí)位、及所屬的模塊號(hào)信息;

所述內(nèi)存塊的診斷尾,用于存儲(chǔ)申請(qǐng)所述內(nèi)存塊的文件名、行號(hào)信息。

所述內(nèi)存塊的大小為2i,其中i為自然數(shù)。

內(nèi)存塊的結(jié)構(gòu)示意圖如圖4所示,其中結(jié)構(gòu)頭A中包括雙向指針、當(dāng)前內(nèi)存塊總大小,標(biāo)志位,屬于哪個(gè)模塊等信息;可存儲(chǔ)區(qū)B用于存儲(chǔ)具體的業(yè)務(wù)數(shù)據(jù),大小是以2的冪為基數(shù)大小;診斷尾C中包括申請(qǐng)當(dāng)前內(nèi)存塊結(jié)構(gòu)的文件名,以及行號(hào)等診斷信息。所述診斷尾中存儲(chǔ)的行號(hào)信息,是指申請(qǐng)的文件/業(yè)務(wù)在系統(tǒng)程序中的具體位置信息,因此,可通過(guò)該診斷尾信息快速定位到程序中的具體申請(qǐng)位置,便于后續(xù)的診斷查找和修復(fù)。

本發(fā)明方法的另一實(shí)施例,以openwrt為框架的小型嵌入式系統(tǒng)中,在進(jìn)程啟動(dòng)時(shí),申請(qǐng)大塊內(nèi)存池進(jìn)行重劃分與管理,把內(nèi)存切分成固定大小的塊結(jié)構(gòu),具體大小以2的冪為基數(shù),增加內(nèi)存結(jié)構(gòu)頭,診斷尾;增加內(nèi)存分配鏈表以及空閑鏈表,申請(qǐng)與釋放內(nèi)存時(shí)只需移動(dòng)指針位置。既避免了內(nèi)存碎片的問(wèn)題,又提高了內(nèi)存的申請(qǐng)釋放效率,同時(shí)增加了調(diào)試診斷的接口。

進(jìn)程啟動(dòng)時(shí),先內(nèi)存初始化,預(yù)先從系統(tǒng)堆中申請(qǐng)大塊內(nèi)存池,然后把該池切分成內(nèi)存塊結(jié)構(gòu),相同大小的內(nèi)存塊屬于同一個(gè)內(nèi)存桶,如圖5所示;通過(guò)內(nèi)存頭結(jié)構(gòu)中的雙向指針把所有內(nèi)存塊連接起來(lái),形成內(nèi)存空閑鏈表。每個(gè)固定大小的內(nèi)存桶有一個(gè)內(nèi)存空閑鏈表結(jié)構(gòu)。

在申請(qǐng)內(nèi)存時(shí),從空閑鏈表移除內(nèi)存塊給用戶,并增加該內(nèi)存塊到內(nèi)存占用鏈表,然后更新想統(tǒng)計(jì)和診斷信息,具體的,如圖6a所示。

釋放內(nèi)存時(shí),把該內(nèi)存塊從占用鏈表中移除,并還回到空閑鏈表,然后更新想統(tǒng)計(jì)和診斷信息,具體的,如圖6b所示。

此外,還提供接口,供內(nèi)存診斷使用,診斷流程如圖6c所示。

本實(shí)施例采用預(yù)分配內(nèi)存桶的方法,增加內(nèi)存頭和診斷尾,利用空閑鏈表和占用鏈表對(duì)內(nèi)存塊進(jìn)行統(tǒng)一管理。該方法可以很好的避免內(nèi)存碎片問(wèn)題,提升內(nèi)存處理的效率和準(zhǔn)確性,增加了內(nèi)存故障定位的簡(jiǎn)單有效手段。

基于相同的技術(shù)構(gòu)思,本發(fā)明實(shí)施例還提供一種內(nèi)存管理系統(tǒng),該系統(tǒng)可執(zhí)行上述方法實(shí)施例。本發(fā)明實(shí)施例提供的系統(tǒng)如圖7所示。包括內(nèi)存管理模塊10、查找模塊20、操作模塊30,所述內(nèi)存管理模塊10分別與所述查找模塊20、操作模塊30相連;其中:

當(dāng)所述內(nèi)存管理模塊10接收到內(nèi)存申請(qǐng)時(shí),根據(jù)業(yè)務(wù)信息申請(qǐng)內(nèi)存的需求,通過(guò)所述查找模塊20查找相應(yīng)規(guī)格的內(nèi)存空閑鏈表中是否存在空閑內(nèi)存塊,若是,則所述操作模塊30在所述內(nèi)存管理模塊10的控制下,從所述內(nèi)存空閑鏈表中移除一空閑內(nèi)存塊,否則所述內(nèi)存管理模塊10向系統(tǒng)申請(qǐng)相應(yīng)的空閑內(nèi)存塊;

所述內(nèi)存管理模塊10將所述空閑內(nèi)存塊分配給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息,所述操作模塊30將所述存儲(chǔ)數(shù)據(jù)信息的內(nèi)存塊添加到所述業(yè)務(wù)所屬的模塊號(hào)的內(nèi)存占用鏈表中;

當(dāng)所述內(nèi)存管理模塊10接收到內(nèi)存釋放申請(qǐng)時(shí),所述操作模塊30在所述內(nèi)存管理模塊10的控制下,將待釋放的內(nèi)存塊從所述模塊號(hào)的內(nèi)存占用鏈表中移除;并將所述內(nèi)存塊進(jìn)行清空處理,還原至空閑內(nèi)存塊狀態(tài);再根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊鏈接在相應(yīng)規(guī)格的內(nèi)存空閑鏈表中。

比如空閑內(nèi)存鏈表的規(guī)格有16字節(jié)、32字節(jié)、64字節(jié)、128字節(jié)等若干規(guī)格,當(dāng)進(jìn)程中的某個(gè)模塊號(hào)下的一個(gè)業(yè)務(wù)申請(qǐng)54字節(jié)大小的內(nèi)存時(shí),內(nèi)存管理模塊10根據(jù)申請(qǐng)的內(nèi)存大小54字節(jié),從大于或等于54字節(jié),且最接近的空閑內(nèi)存鏈表中查找空閑內(nèi)存塊來(lái)分配給該業(yè)務(wù)。因此,管理模塊會(huì)從規(guī)格為64的空閑內(nèi)存鏈表中移除一內(nèi)存塊給該業(yè)務(wù)。規(guī)格為64字節(jié)的空閑內(nèi)存鏈表中,所有的內(nèi)存塊均為64字節(jié)大小。而內(nèi)存占用鏈表是以模塊號(hào)來(lái)分組的,同一模塊號(hào)的內(nèi)存占用鏈表中占用的內(nèi)存塊大小不一定相等,但都屬于同一個(gè)進(jìn)程中的同一個(gè)模塊號(hào)。由于每一個(gè)業(yè)務(wù)申請(qǐng)分配一個(gè)內(nèi)存塊,內(nèi)存塊釋放后又會(huì)掛載到相應(yīng)規(guī)格的空閑內(nèi)存鏈表中,因此不會(huì)產(chǎn)生內(nèi)存碎片的問(wèn)題,都可使用。

本發(fā)明的內(nèi)存管理系統(tǒng),操作簡(jiǎn)單,避免內(nèi)存碎片問(wèn)題,提升內(nèi)存處理的效率和準(zhǔn)確性。

本發(fā)明內(nèi)存管理系統(tǒng)的另一實(shí)施例,在上述實(shí)施例的基礎(chǔ)上,還包括初始化模塊40,內(nèi)存空間申請(qǐng)模塊50、內(nèi)存空間劃分模塊60;所述內(nèi)存空間申請(qǐng)模塊50分別與所述初始化模塊40及所述內(nèi)存空間劃分模塊60相連,且所述內(nèi)存管理模塊10分別與所述內(nèi)存空間申請(qǐng)模塊50、內(nèi)存空間劃分模塊60相連,其中:

當(dāng)進(jìn)程啟動(dòng)時(shí),所述初始模塊將內(nèi)存初始化,所述內(nèi)存空間申請(qǐng)模塊50根據(jù)所述進(jìn)程向系統(tǒng)申請(qǐng)一內(nèi)存池;

所述內(nèi)存空間劃分模塊60根據(jù)所述進(jìn)程,將所述內(nèi)存池劃分成不同規(guī)格的內(nèi)存塊組;同一內(nèi)存塊組中包含若干大小相等的空閑內(nèi)存塊;所述內(nèi)存塊包括結(jié)構(gòu)頭、可存儲(chǔ)區(qū)、和診斷尾;所述結(jié)構(gòu)頭和診斷尾用于存儲(chǔ)數(shù)據(jù)的相關(guān)信息,且所述結(jié)構(gòu)頭上存儲(chǔ)有雙向指針;

所述內(nèi)存管理模塊10將同一內(nèi)存塊組的空閑內(nèi)存塊通過(guò)所述雙向指針鏈接起來(lái),形成所述規(guī)格的內(nèi)存空閑鏈表;

當(dāng)所述內(nèi)存管理模塊10判斷進(jìn)程中的模塊號(hào)下的業(yè)務(wù)占用了內(nèi)存塊時(shí),所述內(nèi)存管理模塊10利用所述雙向指針,將所述進(jìn)程中同一個(gè)模塊號(hào)下已占用的內(nèi)存塊鏈接起來(lái)構(gòu)成內(nèi)存占用鏈表。

申請(qǐng)的內(nèi)存池由于已被初始化,因此劃分成內(nèi)存塊后,內(nèi)存申請(qǐng)時(shí)可快速分配使用。

內(nèi)存池大小的申請(qǐng)及內(nèi)存塊的劃分是根據(jù)進(jìn)程預(yù)估的,因此在該進(jìn)程后續(xù)的內(nèi)存使用中較為便捷,適用,相當(dāng)于為該進(jìn)程量身定制。不同的進(jìn)程申請(qǐng)的內(nèi)存池大小不同,劃分也不同,通過(guò)預(yù)估,可獲得這個(gè)進(jìn)程的大概適用內(nèi)存大小,一方面避免了內(nèi)存的浪費(fèi),另一方面降低了內(nèi)存不足的概率。一般情況下內(nèi)存塊組中的空閑內(nèi)存塊不會(huì)出現(xiàn)短缺現(xiàn)象,如果萬(wàn)一使用時(shí)該規(guī)格的內(nèi)存塊沒(méi)有了的話,可再像系統(tǒng)申請(qǐng),或者也可向數(shù)量較多的大于該內(nèi)存的內(nèi)存塊申請(qǐng)使用。

空閑內(nèi)存鏈表和占用內(nèi)存鏈表的創(chuàng)建,大大提高了內(nèi)存管理的有效性,準(zhǔn)確性,也避免了內(nèi)存碎片的問(wèn)題。

較佳的,在上述實(shí)施例的基礎(chǔ)上還包括遍歷判斷模塊70,所述遍歷判斷模塊70分別與所述查找模塊20及內(nèi)存管理模塊10相連,其中:

所述查找模塊20查找相應(yīng)模塊號(hào)的內(nèi)存占用鏈表;

所述遍歷判斷模塊70遍歷所述內(nèi)存占用鏈表,判斷所述內(nèi)存占用鏈表中的內(nèi)存塊的結(jié)構(gòu)頭信息是否被擦寫,若是,則判斷所述內(nèi)存塊為壞塊。

內(nèi)存塊的結(jié)構(gòu)頭或診斷尾部分可為內(nèi)存診斷提供依據(jù)。通過(guò)內(nèi)存塊的結(jié)構(gòu)頭信息判斷內(nèi)存塊為壞塊后,可再根據(jù)診斷尾信息,查找到該內(nèi)存塊的相關(guān)信息,比如申請(qǐng)?jiān)搩?nèi)存塊的位置等。

本發(fā)明系統(tǒng)的另一實(shí)施例,在上述實(shí)施例的基礎(chǔ)上,在內(nèi)存申請(qǐng)時(shí):

所述操作模塊30在所述內(nèi)存管理模塊10的控制下,從所述內(nèi)存空閑鏈表中移除一空閑內(nèi)存塊是指所述操作模塊30在所述內(nèi)存管理模塊10的控制下,從所述內(nèi)存空閑鏈表的頭部或尾部移除一空閑內(nèi)存塊;

所述內(nèi)存管理模塊10將所述空閑內(nèi)存塊分配給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息,所述操作模塊30將所述存儲(chǔ)數(shù)據(jù)信息的內(nèi)存塊添加到所述業(yè)務(wù)所屬的模塊號(hào)下的內(nèi)存占用鏈表中包括:所述內(nèi)存管理模塊10根據(jù)所述業(yè)務(wù)信息,填充所述內(nèi)存塊的結(jié)構(gòu)頭和診斷尾信息,所述內(nèi)存塊的可存儲(chǔ)區(qū)用于給業(yè)務(wù)存儲(chǔ)數(shù)據(jù)信息;所述操作模塊30在所述內(nèi)存管理模塊10的控制下將所述內(nèi)存塊掛載在以所述業(yè)務(wù)所屬的模塊號(hào)為下標(biāo)的內(nèi)存占用鏈表頭部或尾部;

在內(nèi)存釋放時(shí):

所述操作模塊30在所述內(nèi)存管理模塊10的控制下,將待釋放的內(nèi)存塊從所述模塊號(hào)的內(nèi)存占用鏈表中移除包括:所述操作模塊30在所述內(nèi)存管理模塊10的控制下,根據(jù)待釋放內(nèi)存塊的雙向指針,在所述模塊號(hào)的內(nèi)存占用鏈表中找到所述待釋放內(nèi)存塊的前一內(nèi)存塊及后一內(nèi)存塊;所述操作模塊30將所述待釋放內(nèi)存塊從所述內(nèi)存占用鏈表中移除;所述操作模塊30將所述待釋放內(nèi)存塊的前一內(nèi)存塊和后一內(nèi)存塊鏈接起來(lái);

所述操作模塊30根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊鏈接在相應(yīng)規(guī)格的內(nèi)存空閑鏈表中是指所述操作模塊30根據(jù)所述內(nèi)存塊的大小,將所述內(nèi)存塊掛載在相應(yīng)規(guī)格的內(nèi)存空閑鏈表頭部或尾部。

鏈表中內(nèi)存塊添加均可根據(jù)預(yù)設(shè)規(guī)則,掛載在鏈表的頭部或尾部,不用根據(jù)內(nèi)存塊的地址來(lái)插入鏈表中間的相應(yīng)位置,簡(jiǎn)單而便捷。

空閑鏈表中的內(nèi)存塊使用也是如此,根據(jù)預(yù)設(shè)規(guī)則,從空閑內(nèi)存鏈表的頭部或尾部移除即可,使得內(nèi)存申請(qǐng)更為高效。

較佳的,在上述實(shí)施例的基礎(chǔ)上,所述內(nèi)存塊的結(jié)構(gòu)頭,用于存儲(chǔ)雙向指針、內(nèi)存塊的總大小、存儲(chǔ)的數(shù)據(jù)標(biāo)識(shí)位、及所屬的模塊號(hào)信息;

所述內(nèi)存塊的診斷尾,用于存儲(chǔ)申請(qǐng)所述內(nèi)存塊的文件名、行號(hào)信息。

所述內(nèi)存塊的大小為2i,其中i為自然數(shù)。

盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。

顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1