,首先將上層傳入的指針 進(jìn)行判斷,判斷上層應(yīng)用傳入的指針是否合法,即決定上層應(yīng)用傳入指針是否是的有效的 內(nèi)存釋放指針。
[0077] 如圖7,具體的一個(gè)示例描述如下:
[0078] 將上層應(yīng)用傳入的指針依次與所述單鏈表中的元素做比較,如果單鏈表中不存在 與之匹配的元素,則決定上層應(yīng)用傳入的指針并非與一個(gè)有效的動(dòng)態(tài)內(nèi)存塊匹配,即上層 應(yīng)用傳入的是非法指針,可忽略該次回收操作(大多數(shù)應(yīng)用)或做相應(yīng)錯(cuò)誤處理;否則,決 定上層傳入的就是有效指針,執(zhí)行內(nèi)存回收操作。
[0079] 也就是說,響應(yīng)于上層應(yīng)用的有效的內(nèi)存釋放指針,執(zhí)行內(nèi)存回收操作,釋放相應(yīng) 動(dòng)態(tài)內(nèi)存塊的內(nèi)存空間。
[0080] 由于本例子中采取的頭部堆疊和設(shè)置的一個(gè)單鏈表,在執(zhí)行內(nèi)存回收后,連續(xù)的 空閑內(nèi)存空間自動(dòng)合并。
[0081] 本例中,關(guān)于回收后的連續(xù)內(nèi)存塊(被釋放的內(nèi)存空間其前、后的連續(xù)空閑空間) 如何合并的問題,其關(guān)鍵在于單鏈表Using List的存在,由于本例設(shè)置的內(nèi)存釋放過程 (將在下文具體描述),當(dāng)動(dòng)態(tài)內(nèi)存塊從Using List中刪除時(shí),該塊動(dòng)態(tài)內(nèi)存就自動(dòng)與其 前、后的連續(xù)空閑空間合并。因?yàn)閷?duì)于內(nèi)存管理而言,當(dāng)因分配動(dòng)態(tài)內(nèi)存而再次掃描空閑空 間時(shí),之前回歸空閑的那一塊空間實(shí)際上是與其前后的連續(xù)空閑空間一起,作為一整塊空 閑空間接受掃描的。
[0082] 也就是說,在執(zhí)行內(nèi)存回收(內(nèi)存釋放)后,將被釋放的內(nèi)存空間與其前、后的連 續(xù)空閑空間自動(dòng)合并。
[0083] 下面結(jié)合圖4-10所示,具體說明前述描述的關(guān)于動(dòng)態(tài)內(nèi)存申請(qǐng)、動(dòng)態(tài)內(nèi)存釋放的 一些可選的實(shí)現(xiàn)方案。
[0084] -、動(dòng)態(tài)內(nèi)存申請(qǐng)
[0085] 假設(shè)上層應(yīng)用所需尺寸定義為wantSize。由于要在動(dòng)態(tài)內(nèi)存塊之前插入一個(gè)結(jié)構(gòu) 體madMemHead_t,因此所需動(dòng)態(tài)內(nèi)存塊的實(shí)際尺寸realSize為:
[0086] realSize = wantSize+sizeof(madMemHead_t);
[0087] 為使本公開的文字描述和流程圖更加簡潔易懂,用英文縮寫代替圖中的文字描 述,約定如下:
[0088]
【主權(quán)項(xiàng)】
1. 一種用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,其特征在于,包括: 為內(nèi)存堆內(nèi)每一塊被分配的動(dòng)態(tài)內(nèi)存前面插入一個(gè)結(jié)構(gòu)體(head)形成一個(gè)動(dòng)態(tài)內(nèi)存 塊,使得每個(gè)動(dòng)態(tài)內(nèi)存塊包括該結(jié)構(gòu)體和數(shù)據(jù)內(nèi)存區(qū);每個(gè)動(dòng)態(tài)內(nèi)存塊的首地址都鏈接在 一條單鏈表上,其中所述的結(jié)構(gòu)體包括動(dòng)態(tài)內(nèi)存塊的整體尺寸(size)與指向單鏈表中下 一個(gè)元素的指針(next); 在前述單鏈表中,所有元素以動(dòng)態(tài)內(nèi)存塊的首地址的升序進(jìn)行排列; 響應(yīng)于上層應(yīng)用的有效的內(nèi)存申請(qǐng)分配動(dòng)態(tài)內(nèi)存時(shí),盡可能在靠近內(nèi)存堆堆頭的位置 分配新的動(dòng)態(tài)內(nèi)存,即向內(nèi)存堆頭部堆疊,以形成動(dòng)態(tài)內(nèi)存塊; 響應(yīng)于上層應(yīng)用的有效的內(nèi)存釋放指針,執(zhí)行內(nèi)存回收操作,釋放相應(yīng)動(dòng)態(tài)內(nèi)存塊的 內(nèi)存空間。
2. 根據(jù)權(quán)利要求1所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,其特征在于,前述方法更加 包含: 執(zhí)行內(nèi)存回收后,連續(xù)的空閑內(nèi)存空間自動(dòng)合并。
3. 根據(jù)權(quán)利要求1或2所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,其特征在于,前述方法更 加包含: 執(zhí)行內(nèi)存回收操作后,將被釋放的內(nèi)存空間與其前、后的連續(xù)空閑空間自動(dòng)合并。
4. 根據(jù)權(quán)利要求1所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,其特征在于,前述方法更加 包含: 在接收到上層應(yīng)用的有效的內(nèi)存申請(qǐng)時(shí),判斷申請(qǐng)的內(nèi)存是否超過當(dāng)前時(shí)刻整個(gè)內(nèi)存 堆的總空閑內(nèi)存量,并響應(yīng)于申請(qǐng)的內(nèi)存未超過當(dāng)前時(shí)刻整個(gè)內(nèi)存堆的總空閑內(nèi)存量而分 配動(dòng)態(tài)內(nèi)存,否則返回錯(cuò)誤信息給上層應(yīng)用。
5. 根據(jù)權(quán)利要求1所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,其特征在于,前述方法更加 包含: 判斷上層應(yīng)用傳入的指針是否合法,即決定上層應(yīng)用傳入指針是否是的有效的內(nèi)存釋 放指針,包括以下過程: 將上層應(yīng)用傳入的指針依次與所述單鏈表中的元素做比較,如果單鏈表中不存與之匹 配的元素,則決定上層應(yīng)用傳入的指針并非與一個(gè)有效的動(dòng)態(tài)內(nèi)存塊匹配,即上層應(yīng)用傳 入的是非法指針;否則,決定上層傳入的就是有效指針。
6. 根據(jù)權(quán)利要求1所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,其特征在于,前述方法更加 包含: 在分配動(dòng)態(tài)內(nèi)存時(shí),如果整個(gè)內(nèi)存堆的內(nèi)存空間不連續(xù),則依次掃描每塊連續(xù)的空閑 空間,并且響應(yīng)于某一空閑空間的尺寸滿足申請(qǐng)的內(nèi)存空間,則在該空閑空間內(nèi)分配新的 動(dòng)態(tài)內(nèi)存,插入結(jié)構(gòu)體形成一個(gè)動(dòng)態(tài)內(nèi)存塊,并將動(dòng)態(tài)內(nèi)存塊的首地址都鏈接到前述的單 鏈表上。
7. 根據(jù)前述權(quán)利要求1-6中任意一項(xiàng)所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,其特征在 于,前述方法更加包含: 將根據(jù)新分配的動(dòng)態(tài)內(nèi)存塊的首地址計(jì)算得到的對(duì)應(yīng)用戶數(shù)據(jù)區(qū)域的首地址返回給 上層應(yīng)用: 用戶數(shù)據(jù)區(qū)域首地址=動(dòng)態(tài)內(nèi)存塊首地址+結(jié)構(gòu)體(head)的尺寸
8. -種用于實(shí)時(shí)內(nèi)核的內(nèi)存管理系統(tǒng),其特征在于,包括: 用于為內(nèi)存堆內(nèi)每一塊被分配的動(dòng)態(tài)內(nèi)存前面插入一個(gè)結(jié)構(gòu)體形成一個(gè)動(dòng)態(tài)內(nèi)存塊, 使得每個(gè)動(dòng)態(tài)內(nèi)存塊包括該結(jié)構(gòu)體和數(shù)據(jù)內(nèi)存區(qū),并使得每個(gè)動(dòng)態(tài)內(nèi)存塊的首地址都鏈接 在一條單鏈表上的模塊,其中所述的結(jié)構(gòu)體包括動(dòng)態(tài)內(nèi)存塊的整體尺寸(size)與指向單 鏈表中下一個(gè)元素的指針(next); 用于將前述單鏈表中所有元素以動(dòng)態(tài)內(nèi)存塊的首地址的升序進(jìn)行排列的模塊; 用于響應(yīng)于上層應(yīng)用的有效的內(nèi)存申請(qǐng)分配動(dòng)態(tài)內(nèi)存時(shí),盡可能在靠近內(nèi)存堆堆頭的 位置分配新的動(dòng)態(tài)內(nèi)存的,以形成動(dòng)態(tài)內(nèi)存塊的模塊; 用于響應(yīng)于上層應(yīng)用的有效的內(nèi)存釋放指針,執(zhí)行內(nèi)存回收操作,釋放相應(yīng)動(dòng)態(tài)內(nèi)存 塊的內(nèi)存空間的模塊。
9. 根據(jù)權(quán)利要求8所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理系統(tǒng),其特征在于,該裝置更加包 括: 用于在執(zhí)行內(nèi)存回收操作后,將被釋放的內(nèi)存空間與其前、后的連續(xù)空閑空間自動(dòng)合 并的模塊。
10. 根據(jù)權(quán)利要求8所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理系統(tǒng),其特征在于,該裝置更加包 括: 用于判斷上層應(yīng)用的所申請(qǐng)的內(nèi)存是否超過當(dāng)前時(shí)刻整個(gè)內(nèi)存堆的總空閑內(nèi)存量的 模塊,該模塊在接收到上層應(yīng)用的有效的內(nèi)存申請(qǐng)時(shí),判斷申請(qǐng)的內(nèi)存是否超過當(dāng)前時(shí)刻 整個(gè)內(nèi)存堆的總空閑內(nèi)存量,并響應(yīng)于申請(qǐng)的內(nèi)存未超過當(dāng)前時(shí)刻整個(gè)內(nèi)存堆的總空閑內(nèi) 存量而分配動(dòng)態(tài)內(nèi)存,否則返回錯(cuò)誤信息給上層應(yīng)用。
11. 根據(jù)權(quán)利要求8所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理系統(tǒng),其特征在于,該裝置更加包 括: 用于判斷上層應(yīng)用傳入的指針是否合法,即決定上層應(yīng)用傳入指針是否是的有效的內(nèi) 存釋放指針的模塊,該模塊將上層應(yīng)用傳入的指針依次與所述單鏈表中的元素做比較,如 果單鏈表中不存與之匹配的元素,則決定上層應(yīng)用傳入的指針并非與一個(gè)有效的動(dòng)態(tài)內(nèi)存 塊匹配,即上層應(yīng)用傳入的是非法指針;否則,決定上層傳入的就是有效指針。
12. 根據(jù)權(quán)利要求8所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理系統(tǒng),其特征在于,所述用于響應(yīng) 于上層應(yīng)用的有效的內(nèi)存申請(qǐng)分配動(dòng)態(tài)內(nèi)存時(shí),盡可能在靠近內(nèi)存堆堆頭的位置分配新的 動(dòng)態(tài)內(nèi)存的,以形成動(dòng)態(tài)內(nèi)存塊的模塊,被設(shè)置成在分配動(dòng)態(tài)內(nèi)存時(shí),如果整個(gè)內(nèi)存堆內(nèi)的 內(nèi)存空間不連續(xù),則依次掃描每塊連續(xù)的空閑空間,并且響應(yīng)于某一空閑空間的尺寸滿足 申請(qǐng)的內(nèi)存空間,則在該空閑空間內(nèi)分配新的動(dòng)態(tài)內(nèi)存,插入結(jié)構(gòu)體形成一個(gè)動(dòng)態(tài)內(nèi)存塊, 將動(dòng)態(tài)內(nèi)存塊的首地址都鏈接到前述的條單鏈表上。
13. 根據(jù)權(quán)利要求8所述的用于實(shí)時(shí)內(nèi)核的內(nèi)存管理系統(tǒng),其特征在于,該裝置更加包 括: 用于將根據(jù)新分配的動(dòng)態(tài)內(nèi)存塊的首地址計(jì)算得到的對(duì)應(yīng)用戶數(shù)據(jù)區(qū)域的首地址返 回給上層應(yīng)用: 用戶數(shù)據(jù)區(qū)域首地址=動(dòng)態(tài)內(nèi)存塊首地址+結(jié)構(gòu)體(head)的尺寸。
【專利摘要】本發(fā)明提供一種用于實(shí)時(shí)內(nèi)核的內(nèi)存管理方法,包括:為內(nèi)存堆內(nèi)每一塊被分配的動(dòng)態(tài)內(nèi)存前面插入一個(gè)結(jié)構(gòu)體形成一個(gè)動(dòng)態(tài)內(nèi)存塊,以存儲(chǔ)該動(dòng)態(tài)內(nèi)存塊的信息;響應(yīng)于上層應(yīng)用的有效的內(nèi)存申請(qǐng)分配動(dòng)態(tài)內(nèi)存時(shí),盡可能在靠近內(nèi)存堆堆頭的位置分配新的動(dòng)態(tài)內(nèi)存,即向內(nèi)存堆頭部堆疊,形成動(dòng)態(tài)內(nèi)存塊;將所有動(dòng)態(tài)內(nèi)存塊的首地址都鏈接在一條單鏈表上,并且在該單鏈表中,所有元素以動(dòng)態(tài)內(nèi)存塊的首地址的升序進(jìn)行排列;以及響應(yīng)于上層應(yīng)用的有效的內(nèi)存釋放指針,執(zhí)行內(nèi)存回收操作,釋放相應(yīng)動(dòng)態(tài)內(nèi)存塊的內(nèi)存空間。本發(fā)明采用鏈?zhǔn)蕉询B策略,使得已分配內(nèi)存塊向內(nèi)存堆的頭部“堆積”,從而減少內(nèi)存碎片的產(chǎn)生,同時(shí)提高實(shí)時(shí)內(nèi)核運(yùn)行時(shí)動(dòng)態(tài)內(nèi)存的使用效率。
【IPC分類】G06F12-02
【公開號(hào)】CN104850505
【申請(qǐng)?zhí)枴緾N201510275497
【發(fā)明人】左應(yīng)鵬
【申請(qǐng)人】左應(yīng)鵬
【公開日】2015年8月19日
【申請(qǐng)日】2015年5月26日