本發(fā)明涉及內(nèi)存領(lǐng)域,具體而言,涉及內(nèi)存管理方法及裝置。
背景技術(shù):
申請(qǐng)?zhí)枮?00910079057,發(fā)明名稱為內(nèi)存管理方法的專利,公開了一種內(nèi)存管理方法,其方法是把內(nèi)存區(qū)域劃分為托干內(nèi)存分區(qū)和若干單元內(nèi)存塊。
不足之處是:內(nèi)存單元大小和數(shù)量在任務(wù)啟動(dòng)的時(shí)候就已經(jīng)確定,在實(shí)際使用過程中不夠靈活。實(shí)際表現(xiàn)為:當(dāng)頻繁申請(qǐng)了某一個(gè)固定長(zhǎng)度內(nèi)存超過之前預(yù)定義的最大值時(shí),則會(huì)占用更大長(zhǎng)度的內(nèi)存單元,這就會(huì)造成浪費(fèi)。如果申請(qǐng)的小長(zhǎng)度內(nèi)存的數(shù)量超過了其所有長(zhǎng)度單元的內(nèi)存數(shù)量的總和時(shí),內(nèi)存分配則會(huì)失敗。
在現(xiàn)有技術(shù)中內(nèi)存單元大小和數(shù)量固定而導(dǎo)致在分配內(nèi)存時(shí)存在不足。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供了內(nèi)存管理方法及裝置,以至少解決現(xiàn)有技術(shù)中內(nèi)存單元大小和數(shù)量固定而導(dǎo)致在分配內(nèi)存時(shí)存在的不足。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種內(nèi)存管理方法,包括:接收內(nèi)存申請(qǐng),其中,所述內(nèi)存申請(qǐng)用于申請(qǐng)第一容量的內(nèi)存;從第一內(nèi)存池中分配一片第一內(nèi)存,其中,所述第一內(nèi)存池管理預(yù)定單元長(zhǎng)度的內(nèi)存,所述預(yù)定單元長(zhǎng)度大于所述第一容量;所述第一內(nèi)存池是根據(jù)總內(nèi)存的容量劃分的至少一個(gè)內(nèi)存池中的其中之一,不同的內(nèi)存池管理不同單元長(zhǎng)度的內(nèi)存;從所述第一內(nèi)存中切割出夠所述內(nèi)存申請(qǐng)使用的內(nèi)存,將所述第一內(nèi)存中剩余的內(nèi)存加入到對(duì)應(yīng)的內(nèi)存池中。
進(jìn)一步地,從所述第一內(nèi)存中切割出夠所述內(nèi)存申請(qǐng)使用的內(nèi)存包括:從所述第一內(nèi)存分割出第二容量的內(nèi)存供使用,并填寫內(nèi)存管理頭信息,其中,第二容量為第一容量以及對(duì)應(yīng)的所述內(nèi)存管理頭信息的容量和。
進(jìn)一步地,所述內(nèi)存管理頭信息包括以下至少之一:記錄該內(nèi)存的長(zhǎng)度、記錄前一個(gè)切割節(jié)點(diǎn)內(nèi)存的管理頭指針、記錄用于檢驗(yàn)該內(nèi)存節(jié)點(diǎn)的信息、前 一個(gè)相鄰內(nèi)存塊頭部信息地址指針。
進(jìn)一步地,所述方法還包括:釋放申請(qǐng)的所述內(nèi)存,其中,釋放申請(qǐng)的所述內(nèi)存包括:從所述內(nèi)存管理信息獲取該段內(nèi)存的長(zhǎng)度以及該段內(nèi)存相鄰內(nèi)存的管理頭指針;設(shè)置該段內(nèi)存的未使用標(biāo)志位;獲取相鄰節(jié)點(diǎn)內(nèi)存的管理頭信息,如果該內(nèi)存也是未使用的則與相鄰的內(nèi)存進(jìn)行合并,更新內(nèi)存管理頭信息中的長(zhǎng)度;如果相鄰節(jié)點(diǎn)的內(nèi)存為已使用,則不合并,直接將該段內(nèi)存添加到所屬的內(nèi)存池未使用鏈表。
進(jìn)一步地,根據(jù)總內(nèi)存的容量劃分內(nèi)存池包括:內(nèi)存池的劃分以N的倍數(shù)為基數(shù),其中,N為自然數(shù)。
根據(jù)本發(fā)明的另一個(gè)方面,還提供給了一種內(nèi)存管理裝置,包括:接收模塊,用于接收內(nèi)存申請(qǐng),其中,所述內(nèi)存申請(qǐng)用于申請(qǐng)第一容量的內(nèi)存;分配模塊,用于從第一內(nèi)存池中分配一片第一內(nèi)存,其中,所述第一內(nèi)存池管理預(yù)定單元長(zhǎng)度的內(nèi)存,所述預(yù)定單元長(zhǎng)度大于所述第一容量;所述第一內(nèi)存池是根據(jù)總內(nèi)存的容量劃分的至少一個(gè)內(nèi)存池中的其中之一,不同的內(nèi)存池管理不同單元長(zhǎng)度的內(nèi)存;分割模塊,用于從所述第一內(nèi)存中切割出夠所述內(nèi)存申請(qǐng)使用的內(nèi)存,將所述第一內(nèi)存中剩余的內(nèi)存加入到對(duì)應(yīng)的內(nèi)存池中。
進(jìn)一步地,所述分割模塊,用于從所述第一內(nèi)存分割出第二容量的內(nèi)存供使用,并填寫內(nèi)存管理頭信息,其中,第二容量為第一容量以及對(duì)應(yīng)的所述內(nèi)存管理頭信息的容量和。
進(jìn)一步地,所述內(nèi)存管理頭信息包括以下至少之一:記錄該內(nèi)存的長(zhǎng)度、記錄前一個(gè)切割節(jié)點(diǎn)內(nèi)存的管理頭指針、記錄用于檢驗(yàn)該內(nèi)存節(jié)點(diǎn)的信息、前一個(gè)相鄰內(nèi)存塊頭部信息地址指針。
進(jìn)一步地,還包括:釋放模塊,其中,所述釋放模塊包括:獲取單元,用于從所述內(nèi)存管理信息獲取該段內(nèi)存的長(zhǎng)度以及該段內(nèi)存相鄰內(nèi)存的管理頭指針;設(shè)置單元,用于設(shè)置該段內(nèi)存的未使用標(biāo)志位;處理單元,用于獲取相鄰節(jié)點(diǎn)內(nèi)存的管理頭信息,如果該內(nèi)存也是未使用的則與相鄰的內(nèi)存進(jìn)行合并,更新內(nèi)存管理頭信息中的長(zhǎng)度;如果相鄰節(jié)點(diǎn)的內(nèi)存為已使用,則不合并,直接將該段內(nèi)存添加到所屬的內(nèi)存池未使用鏈表。
進(jìn)一步地,內(nèi)存池的劃分以N的倍數(shù)為基數(shù),其中,N為自然數(shù)。
通過本發(fā)明,采用接收內(nèi)存申請(qǐng),其中,所述內(nèi)存申請(qǐng)用于申請(qǐng)第一容量 的內(nèi)存;從第一內(nèi)存池中分配一片第一內(nèi)存,其中,所述第一內(nèi)存池管理預(yù)定單元長(zhǎng)度的內(nèi)存,所述預(yù)定單元長(zhǎng)度大于所述第一容量;所述第一內(nèi)存池是根據(jù)總內(nèi)存的容量劃分的至少一個(gè)內(nèi)存池中的其中之一,不同的內(nèi)存池管理不同單元長(zhǎng)度的內(nèi)存;從所述第一內(nèi)存中切割出夠所述內(nèi)存申請(qǐng)使用的內(nèi)存,將所述第一內(nèi)存中剩余的內(nèi)存加入到對(duì)應(yīng)的內(nèi)存池中,解決現(xiàn)有技術(shù)中內(nèi)存單元大小和數(shù)量固定而導(dǎo)致在分配內(nèi)存時(shí)存在的不足,從而提高了內(nèi)存使用效率。
附圖說明
此處所說明的附圖用來提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:
圖1是根據(jù)本發(fā)明實(shí)施例的內(nèi)存管理方法的流程圖;
圖2是根據(jù)本發(fā)明實(shí)施例內(nèi)存申請(qǐng)時(shí)內(nèi)存切割示意圖;
圖3是根據(jù)本發(fā)明實(shí)施例的內(nèi)存釋放時(shí)內(nèi)存塊合并的示意圖;
圖4是根據(jù)本發(fā)明實(shí)施例的10M受管理內(nèi)存分布示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例;需要說明的是,在不沖突的情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中的特征可以相互組合?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
在本實(shí)施例中,提供了一種內(nèi)存管理方法,圖1是根據(jù)本發(fā)明實(shí)施例的內(nèi)存管理方法的流程圖,如圖1所示,該方法包括如下步驟:
步驟S102,接收內(nèi)存申請(qǐng),其中,內(nèi)存申請(qǐng)用于申請(qǐng)第一容量的內(nèi)存;
步驟S104,從第一內(nèi)存池中分配一片第一內(nèi)存,其中,第一內(nèi)存池管理預(yù)定單元長(zhǎng)度的內(nèi)存,預(yù)定單元長(zhǎng)度大于第一容量;第一內(nèi)存池是根據(jù)總內(nèi)存的容量劃分的至少一個(gè)內(nèi)存池中的其中之一,不同的內(nèi)存池管理不同單元長(zhǎng)度的內(nèi)存。內(nèi)存池的劃分可以有多種方式,例如,內(nèi)存池的劃分可以以N的倍數(shù) 為基數(shù),其中,N為自然數(shù)。
步驟S106,從第一內(nèi)存中切割出夠內(nèi)存申請(qǐng)使用的內(nèi)存,將第一內(nèi)存中剩余的內(nèi)存加入到對(duì)應(yīng)的內(nèi)存池中。
通過上述步驟,內(nèi)存基本長(zhǎng)度可變,解決了現(xiàn)有技術(shù)中內(nèi)存單元大小和數(shù)量固定而導(dǎo)致在分配內(nèi)存時(shí)存在的不足,提高了內(nèi)存資源利用率,減少了操作系統(tǒng)內(nèi)存碎片的產(chǎn)生量。
在一個(gè)可選實(shí)施例中,還可以增加內(nèi)存管理頭信息,此時(shí),從第一內(nèi)存中切割出夠內(nèi)存申請(qǐng)使用的內(nèi)存包括:從第一內(nèi)存分割出第二容量的內(nèi)存供使用,并填寫內(nèi)存管理頭信息,其中,第二容量為第一容量以及對(duì)應(yīng)的內(nèi)存管理頭信息的容量和。
可選地,內(nèi)存管理頭信息包括以下至少之一:記錄該內(nèi)存的長(zhǎng)度、記錄前一個(gè)切割節(jié)點(diǎn)內(nèi)存的管理頭指針、記錄用于檢驗(yàn)該內(nèi)存節(jié)點(diǎn)的信息、前一個(gè)相鄰內(nèi)存塊頭部信息地址指針。內(nèi)存管理頭信息中的內(nèi)容可以根據(jù)需要設(shè)置。
在一個(gè)可選實(shí)施例中,還可以釋放申請(qǐng)的內(nèi)存。例如,從內(nèi)存管理信息獲取該段內(nèi)存的長(zhǎng)度以及該段內(nèi)存相鄰內(nèi)存的管理頭指針;設(shè)置該段內(nèi)存的未使用標(biāo)志位;獲取相鄰節(jié)點(diǎn)內(nèi)存的管理頭信息,如果該內(nèi)存也是未使用的則與相鄰的內(nèi)存進(jìn)行合并,更新內(nèi)存管理頭信息中的長(zhǎng)度;如果相鄰節(jié)點(diǎn)的內(nèi)存為已使用,則不合并,直接將該段內(nèi)存添加到所屬的內(nèi)存池未使用鏈表。
在本實(shí)施例中還提供給了一種內(nèi)存管理裝置,包括:接收模塊,用于接收內(nèi)存申請(qǐng),其中,內(nèi)存申請(qǐng)用于申請(qǐng)第一容量的內(nèi)存;分配模塊,用于從第一內(nèi)存池中分配一片第一內(nèi)存,其中,第一內(nèi)存池管理預(yù)定單元長(zhǎng)度的內(nèi)存,預(yù)定單元長(zhǎng)度大于第一容量;第一內(nèi)存池是根據(jù)總內(nèi)存的容量劃分的至少一個(gè)內(nèi)存池中的其中之一,不同的內(nèi)存池管理不同單元長(zhǎng)度的內(nèi)存;分割模塊,用于從第一內(nèi)存中切割出夠內(nèi)存申請(qǐng)使用的內(nèi)存,將第一內(nèi)存中剩余的內(nèi)存加入到對(duì)應(yīng)的內(nèi)存池中。
在一個(gè)可選實(shí)施例中,分割模塊用于從第一內(nèi)存分割出第二容量的內(nèi)存供使用,并填寫內(nèi)存管理頭信息,其中,第二容量為第一容量以及對(duì)應(yīng)的內(nèi)存管理頭信息的容量和。
在一個(gè)可選實(shí)施例中,內(nèi)存管理頭信息包括以下至少之一:記錄該內(nèi)存的長(zhǎng)度、記錄前一個(gè)切割節(jié)點(diǎn)內(nèi)存的管理頭指針、記錄用于檢驗(yàn)該內(nèi)存節(jié)點(diǎn)的信 息、前一個(gè)相鄰內(nèi)存塊頭部信息地址指針。
在一個(gè)可選實(shí)施例中,該裝置還包括:釋放模塊,其中,釋放模塊包括:獲取單元,用于從內(nèi)存管理信息獲取該段內(nèi)存的長(zhǎng)度以及該段內(nèi)存相鄰內(nèi)存的管理頭指針;設(shè)置單元,用于設(shè)置該段內(nèi)存的未使用標(biāo)志位;處理單元,用于獲取相鄰節(jié)點(diǎn)內(nèi)存的管理頭信息,如果該內(nèi)存也是未使用的則與相鄰的內(nèi)存進(jìn)行合并,更新內(nèi)存管理頭信息中的長(zhǎng)度;如果相鄰節(jié)點(diǎn)的內(nèi)存為已使用,則不合并,直接將該段內(nèi)存添加到所屬的內(nèi)存池未使用鏈表。
下面結(jié)合優(yōu)選實(shí)施例進(jìn)行說明,在本優(yōu)選實(shí)施例中,提供一種可跟蹤調(diào)試的內(nèi)存管理裝置和方法。在本優(yōu)選實(shí)施例中,在任務(wù)初始化時(shí)向操作系統(tǒng)申請(qǐng)一定容量的內(nèi)存區(qū)域。當(dāng)需要提供內(nèi)存需求時(shí),從該大容量的內(nèi)存區(qū)域切割出來一片比所需內(nèi)存需求稍大的內(nèi)存供其使用。釋放內(nèi)存時(shí),根據(jù)釋放內(nèi)存的標(biāo)記信息,對(duì)內(nèi)存進(jìn)行釋放,并合并相鄰的未使用的內(nèi)存塊。下面對(duì)此進(jìn)行說明。
1、在內(nèi)存管理池初始化時(shí),向操作系統(tǒng)申請(qǐng)一大片內(nèi)存,并將該片內(nèi)存的基本信息保存到內(nèi)存管理信息頭中。
(a)按照內(nèi)存的長(zhǎng)度,將內(nèi)存劃分為至少一個(gè)內(nèi)存管理池。每個(gè)內(nèi)存池的管理節(jié)點(diǎn)保存以下信息:當(dāng)前池的內(nèi)存長(zhǎng)度,當(dāng)前池的未分配鏈表
(b)內(nèi)存池的劃分以4的倍數(shù)為基數(shù)。如分配4個(gè)內(nèi)存池,則第一個(gè)內(nèi)存池的的單元長(zhǎng)度為64,第二個(gè)內(nèi)存池長(zhǎng)度為64*4=256,第三個(gè)內(nèi)存池長(zhǎng)度為1024,第四個(gè)內(nèi)存池長(zhǎng)度為4096
(c)每個(gè)塊內(nèi)存的管理信息頭保存以下基本信息:內(nèi)存長(zhǎng)度,分配內(nèi)存地址,前一個(gè)相鄰內(nèi)存塊頭部信息地址指針。
2、申請(qǐng)內(nèi)存時(shí),根據(jù)申請(qǐng)內(nèi)存長(zhǎng)度,確定選擇內(nèi)存池。
(a)如果是申請(qǐng)長(zhǎng)度為128的內(nèi)存,根據(jù)計(jì)算得出從256的內(nèi)存池中獲取一塊未分配的內(nèi)存塊,把這個(gè)內(nèi)存塊的管理信息從256的未使用內(nèi)存鏈表中刪除。
(b)把這個(gè)內(nèi)存塊切割為長(zhǎng)度為102的內(nèi)存塊1和長(zhǎng)度為154的內(nèi)存塊2。
(c)設(shè)置內(nèi)存塊1的內(nèi)存管理頭并加入到長(zhǎng)度為64的內(nèi)存池中未使用鏈表
(d)如果256的內(nèi)存池的未使用鏈表沒有可用內(nèi)存塊,則從1024的內(nèi)存池中未使用鏈表獲取,如果1024的內(nèi)存池中的未使用鏈表中也沒有,則從4096 的內(nèi)存池中未使用鏈表獲??;如果4096的內(nèi)存池中的未使用鏈表中也沒有,則需要從操作系統(tǒng)中申請(qǐng)一大塊(長(zhǎng)度為4096*4=16384)內(nèi)存,初始化后加入到4096的內(nèi)存池中未使用鏈表中。
(e)然后將這個(gè)內(nèi)存塊進(jìn)行切割,切割成長(zhǎng)度為16230和154的兩塊內(nèi)存,把長(zhǎng)度為16230的內(nèi)存加入到4096的內(nèi)存池中未使用的鏈表中。
3、填充分配好的內(nèi)存的管理信息:
(a)記錄該內(nèi)存的長(zhǎng)度
(b)記錄前一個(gè)切割節(jié)點(diǎn)內(nèi)存的管理頭指針
(c)記錄該內(nèi)存節(jié)點(diǎn)用于校驗(yàn)的信息。
4、釋放內(nèi)存時(shí),進(jìn)行以下操作:
(a)從管理頭獲取以下信息:該段內(nèi)存的長(zhǎng)度、該段內(nèi)存相鄰節(jié)點(diǎn)內(nèi)存的管理頭指針。
(b)首先設(shè)置該段內(nèi)存的未使用標(biāo)志位
(c)獲取相鄰節(jié)點(diǎn)內(nèi)存的管理頭信息,如果該內(nèi)存也是未使用的,則與相鄰的內(nèi)存進(jìn)行合并。更新內(nèi)存管理頭信息中的長(zhǎng)度。
(d)如果相鄰節(jié)點(diǎn)的內(nèi)存為已使用,則不合并,直接將該段內(nèi)存添加的所屬的內(nèi)存池中未使用鏈表。
下面結(jié)合幾個(gè)附圖進(jìn)行說明。
圖2是根據(jù)本發(fā)明實(shí)施例內(nèi)存申請(qǐng)時(shí)內(nèi)存切割示意圖,如圖2所示,申請(qǐng)長(zhǎng)度為64B的內(nèi)存,從長(zhǎng)度為1024的內(nèi)存池中獲取一個(gè)未分配的內(nèi)存節(jié)點(diǎn),可用長(zhǎng)度為4072B(實(shí)際長(zhǎng)度為4096B)的內(nèi)存a。從長(zhǎng)度為4072B的內(nèi)存塊尾部分離出一個(gè)長(zhǎng)度為88B的內(nèi)存b。設(shè)置內(nèi)存b的管理頭信息:設(shè)置其可用長(zhǎng)度為64B;設(shè)置為已用的標(biāo)志;設(shè)置前一個(gè)相鄰節(jié)點(diǎn)的指針為內(nèi)存a;將該內(nèi)存b加入到長(zhǎng)度為64的內(nèi)存池已用鏈表中;設(shè)置內(nèi)存b的尾部校驗(yàn)信息。更新內(nèi)存a的管理頭信息:設(shè)置可用長(zhǎng)度為3984B;更新內(nèi)存a的尾部校驗(yàn)信息。
圖3是根據(jù)本發(fā)明實(shí)施例的內(nèi)存釋放時(shí)內(nèi)存塊合并的示意圖,如圖3所示,釋放內(nèi)存長(zhǎng)度為512B的內(nèi)存a。查詢到其相鄰節(jié)點(diǎn)的內(nèi)存b為未使用狀態(tài),進(jìn)行合并操作。更新內(nèi)存b的管理頭信息:設(shè)置可用長(zhǎng)度為4520B;可用內(nèi)存為4520B比其當(dāng)前所在內(nèi)存池的長(zhǎng)度要大,所以把內(nèi)存b從長(zhǎng)度為1024內(nèi)存 池的未使用鏈表中刪除,添加到長(zhǎng)度為4096內(nèi)存池的未使用鏈表中。
圖4是根據(jù)本發(fā)明實(shí)施例的10M受管理內(nèi)存分布示意圖,如圖4所示,箭頭的意思是地址連續(xù)相連的首尾相接。
上述優(yōu)選實(shí)施例,內(nèi)存基本長(zhǎng)度可變、內(nèi)存資源利用率高、減少了操作系統(tǒng)內(nèi)存碎片的產(chǎn)生量,可以檢測(cè)內(nèi)存發(fā)生的錯(cuò)誤和引起錯(cuò)誤的代碼行,統(tǒng)計(jì)了內(nèi)存的使用狀況。
本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括:ROM、RAM、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
最后應(yīng)說明的是:以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。