驟102:對所述多個內存對象進行組合劃分,得到至少一個對象簇。
[0053]其中,每個所述對象簇中具有至少兩個內存對象,且每個所述對象簇中的內存對象邏輯上連續(xù),每個所述對象簇中的內存對象以鏈表的結構相關聯。
[0054]具體的,本實施例中可以利用內存預分配函數MM_preal1c對申請到的內存對象進行邏輯劃分,以將獲得的連續(xù)內存邏輯上平均進行劃分,得到至少一個對象簇,如圖2b中所示,將24*64字節(jié)的內存對象平均劃分為8個對象簇,每個所述對象簇中含有8個內存對象。
[0055]需要說明的是,每個所述對象簇都有其相應的內存狀態(tài)參數,具體實現中,每個對象簇具有一個管理結構體數組來保存這些內存狀態(tài)參數。以第一個對象簇為例,其對應的管理結構體數組中具有該對象簇中相應的簇信息,包括:top值為該對象簇的上界內存對象、bottom為該對象簇的下界內存對象、total_blocks為該對象簇中的內存對象的個數、free_blocks為該對象簇當前未使用的內存對象的個數、map為該對象簇內存對象的詳細使用情況位圖,初始均為0(未使用)、head指針指向第一個未使用的內存對象、tail指針指向最后一個未使用的內存對象。其中,在一個對象簇中,從head指向的內存對象開始,向tai I指向的內存對象構建成該對象簇的內存對象鏈表,如圖2c中所示。
[0056]步驟103:在接收到至少一個內存使用請求時,為所述至少一個內存使用請求中的每個內存使用請求確定各自對應的一個對象簇。
[0057]其中,在為每個所述內存使用請求確定對應的對象簇時,可以采用輪詢的方式為每個內存使用請求確定未被鎖定的對象簇。
[0058]也就是說,本實施例支持多個線程并發(fā)實現,其中,每個線程對應一個內存使用請求,具體的,當同時出現多個內存使用請求時,每個內存使用請求承載到相應的線程上,多個線程同時調用,此時為每個線程輪詢對象簇,如果第一個簇被鎖,會輪詢到第二個簇、第三個簇等,索取鎖并執(zhí)行后續(xù)操作,由此提高多線程申請內存的并發(fā)度。
[0059]步驟104:為每個所述內存使用請求在其對應的對象簇內分配相應的內存對象。
[0060]步驟105:基于每個所述內存使用請求設置其對應的對象簇的內存狀態(tài)參數。
[0061 ]具體的,本實施例中可以利用內存申請函數1c實現內存的申請與分配。具體的,本實施例在為每個所述內存使用請求在其對應的對象簇內分配相應的內存對象時,先判斷該對象簇內未被使用的內存對象的個數即free_blocks是否大于0,在大于O時,將該對象簇內head指向的內存對象的地址進行返回,也就是說,為內存使用請求分配head指向的內存對象。
[0062]而在為每個所述內存使用請求分配內存對象之后,被分配的內存對象所在的對象簇的內存狀態(tài)參數需要相應設置,如該對象簇內未被使用的內存對象的個數、map中相應內存對象的占用變量賦值及使用該內存對象的線程id及簇內鏈表地址指針的指向設置等。
[0063 ]由上述方案可知,本申請實施例一提供的一種系統(tǒng)的內存管理方法,通過預先響應于內存建立請求,建立并劃分至少一個對象簇,對象簇中具有至少兩個以鏈表結構相關聯的內存對象,進而在接收到內存使用請求時,為每個內存使用請求確定對應的對象簇,并分配相應對象簇中的內存對象為內存使用請求服務,在這一實施例中,通過預先劃分出鏈表結構的內存對象區(qū)域,在內存申請時可以直接在對象簇中分配內存對象,不會出現頻繁使用較小的內存對象的現象,避免較高的系統(tǒng)開銷,實現內存申請后的重復利用,同時,本實施例利用鏈表結構連接對象簇中的內存對象為內存使用請求分配內存對象,由此也避免了內存碎片的產生,由此實現本實施例目的。
[0064]需要說明的是,上述建立的對象簇并非是建立之后一直存在,可以根據用戶需求進行銷毀,也就是說,用戶不需要使用本實施例中的方案進行內存管理時,可以使用MM_destory函數銷毀對象簇的管理結構體數組,由此實現對象簇的銷毀。具體的,本實施例中首先釋放原來從系統(tǒng)中獲得的內存對象,再釋放管理結構體數組,完成對象簇的銷毀。
[0065]由上述方案可知,本申請通過對內存空間的管理層次進行扁平化處理,從而在線程間,實現內存對象的完全共享,而線程可以通過調用API直接申請并獲取內存對象,提高處理效率,并通過簇機制實現了對多線程高并發(fā)場景的高效支撐。
[0066]在具體實現中,所述內存狀態(tài)參數至少包括:頭地址指針及尾地址指針,所述頭地址指針指向其所在對象簇中第一個未使用的內存對象,所述尾地址指針指向其所在對象簇中最后一個未使用的內存對象。也就是說,每個所述對象簇的內存狀態(tài)參數都具有該對象簇內鏈表的頭地址指針及尾地址指針,所述頭地址指針指向其所在對象簇中鏈表的第一個未被使用的內存對象,所述尾地址指針指向其所在對象簇中鏈表的最后一個未被使用的內存對象。
[0067]相應的,上述實施例中,所述步驟105中在基于所述內存使用請求設置其對應的對象簇的內存狀態(tài)參數時,具體可以通過以下方式實現:
[0068]更新所述內存使用請求所對應的對象簇內的頭地址指針指向為該內存使用請求分配的內存對象的下一個未使用的內存對象,如圖2d中所示,head指針下移,指向被分配的內存對象的下一個未使用的內存對象,free_blocks的值減I,map中指示相應內存對象被占用情況的變量賦值為I,并在map中記錄使用該內存對象的線程id。
[0069]參考圖3a,為本申請實施例二提供的一種系統(tǒng)的內存管理方法的實現流程圖,其中,所述方法還可以包括以下步驟:
[0070]步驟106:在接收到內存釋放請求時,釋放所述內存釋放請求所對應的內存對象到其所屬的對象簇。
[0071 ]步驟107:基于所述內存釋放請求,設置其對應的對象簇的內存狀態(tài)參數。
[0072]也就是說,在所述內存對象被使用完成之后,本實施例中將該內存對象進行釋放歸還,進而實現內存對象的重復利用。
[0073]具體的,本實施例中可以在接收到所述內存釋放請求時,利用內存釋放函數MM_free根據被釋放的內存對象的內存地址,直接定位到其所屬的對象簇,由此釋放該請求對應的內存對象到其所屬的對象簇,同時設置相應的內存狀態(tài)參數。
[0074]具體的,所述步驟107中在設置被釋放的內存對象所屬的對象簇的內存狀態(tài)參數時,可以包括以下設置操作:
[0075]更新所述內存使用請求所對應的對象簇內的尾地址指針指向被釋放的內存對象,被釋放的內存對象為其所在對象簇中最后一個未被使用的內存對象。
[0076]具體的,本實施例中可以首先將該對象簇中尾指針指向的內存對象與被釋放的內存對象連接起來,再將尾指針指向的內存對象歸還給相應的對象簇,由此維護這個對象簇中的內存對象鏈表。
[0077]如圖2e中所示,本實施例中釋放內存對象0x602010到原屬對象簇,并對該對象簇的內存狀態(tài)參數如指針指向的地址、未被使用的內存對象的個數等參數相應進行更新,如1^;11指向被釋放的內存對象(^602010,;^66_1310^^增加1,map中指示相應內存對象的被占用情況的變量賦值為O,并將map中記錄該內存對象線程id的變量清空,等等。
[0078]基于上述實施例,本申請可以為用戶提供內存使用情況查看服務。具體的,參考圖3b,為本申請實施例三提供的一種系統(tǒng)的內存管理方法的實現流程圖,其中,所述方法還可以包括以下步驟:
[0079]步驟108:在接收到內存查看請求時,確定與所述內存查看請求相對應的目標對象簇。
[0080]具體的,本實施例中在為用戶提供內存使用情況服務時,可以利用MM_status函數實現,根據用戶的內存查看請求,首先找到該內存查看請求對應的目標對象簇。
[0081]需要說明的是,這里的目標對象簇可以為單個的對象簇,也可以為所有的對象簇。也就是說,本實施例中可以實現對任一對象簇或所有對象簇的內存使用情況的查看。
當前第2頁
1 
2 
3 
4