內(nèi)存管理的方法及Linux終端的制作方法
【專利摘要】本發(fā)明涉及一種內(nèi)存管理的方法及Linux終端,內(nèi)存管理的方法包括以下步驟:當(dāng)在Linux終端上運行程序后,獲取為所述程序分配內(nèi)存空間的分頁請求標(biāo)識;判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間,本發(fā)明能夠根據(jù)程序運行的需要,動態(tài)地為CPU及GPU分配內(nèi)存空間,提高系統(tǒng)的性能。
【專利說明】內(nèi)存管理的方法及Linux終端
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機【技術(shù)領(lǐng)域】,尤其涉及一種內(nèi)存管理的方法及Linux終端。
【背景技術(shù)】
[0002]目前很多Android設(shè)備采用Linux操作系統(tǒng),如計算機或者智能電視等。這些采用Linux操作系統(tǒng)的設(shè)備的內(nèi)存硬件電路基本上都包括CPU、GPU、兩個MIU((memoryinterface unit,存儲接口單兀)及兩個隨機存儲器(random access memory, RAM),如圖1所示,CPU或GPU分別通過總線及對應(yīng)的MIU訪問對應(yīng)的內(nèi)存。
[0003]在內(nèi)存管理中,由于CPU相比GPU使用的內(nèi)存空間要多很多,因此通常在上述的RAMl部分劃分出一塊內(nèi)存區(qū)域,以供GPU專用,而剩余部分內(nèi)存由操作系統(tǒng)內(nèi)核統(tǒng)一管理,并供運行于CPU上的程序使用。這種方法的優(yōu)點是:內(nèi)存管理比較簡單,系統(tǒng)并發(fā)內(nèi)存訪問速度也比較快。
[0004]但是,由于上述RAMl是固定劃分出來的,在實際使用中具有一定的限制,例如當(dāng)有較多復(fù)雜的渲染任務(wù)時,GTO需要的內(nèi)存空間過大而無法滿足,這時將導(dǎo)致渲染不能順利進行,用戶界面顯示異常;而此時正在運行的應(yīng)用可能比較少,系統(tǒng)內(nèi)存有很多剩余,卻無法使用;再如當(dāng)有較多應(yīng)用程序在運行時,CPU需要的內(nèi)存空間較大,由于系統(tǒng)內(nèi)存的使用限制,將導(dǎo)致一些應(yīng)用程序無法運行或者被強行關(guān)閉;而此時GPU專用內(nèi)存可能還有剩余,卻無法使用。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的主要目的在于提供一種內(nèi)存管理的方法及Linux終端,旨在根據(jù)程序運行的需要,動態(tài)地為CPU及GPU分配內(nèi)存空間,提高系統(tǒng)的性能。
[0006]為了達到上述目的,本發(fā)明提出一種內(nèi)存管理的方法,包括以下步驟:
[0007]S1、當(dāng)在Linux終端上運行程序后,獲取為所述程序分配內(nèi)存空間的分頁請求標(biāo)識;
[0008]S2、判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0009]優(yōu)選地,所述步驟S2具體為:
[0010]S21、判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,若是則轉(zhuǎn)到步驟S22,否則轉(zhuǎn)到步驟S23 ;S22、在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間;
[0011]S23、在所述CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0012]優(yōu)選地,所述步驟S22后還包括:
[0013]S24、當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間;
[0014]所述步驟S23之后還包括:
[0015]S25、當(dāng)在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
[0016]優(yōu)選地,所述步驟SI之前包括:
[0017]S01、在所述Linux終2而中設(shè)直所述圖像內(nèi)存區(qū)域;
[0018]S02、將所述Linux終端的圖像專用內(nèi)存區(qū)域映射到所述圖像內(nèi)存區(qū)域中,并初始化所述圖像內(nèi)存區(qū)域。
[0019]優(yōu)選地,所述CPU內(nèi)存區(qū)域包括:直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域;
[0020]所述步驟S24具體包括:
[0021]S241、采用預(yù)定算法在所述直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足所述程序運行的頁面塊;
[0022]S242、在首先查找到的滿足所述程序運行的頁面塊對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間。
[0023]優(yōu)選地,所述步驟S25之后包括:
[0024]S26、當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)所述Linux終端的內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次在所述圖像內(nèi)存區(qū)域為所述程序分配內(nèi)存空間。
[0025]本發(fā)明還提供一種Linux終端,包括:
[0026]獲取模塊,用于當(dāng)在Linux終端上運行程序后,獲取為所述程序分配內(nèi)存空間的分頁請求標(biāo)識;
[0027]分配模塊,用于判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0028]優(yōu)選地,所述分配模塊包括:
[0029]判斷單元,用于判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識;
[0030]第一分配單元,用于若是預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間;
[0031]第二分配單元,用于若不是預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,在所述CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0032]優(yōu)選地,所述分配模塊還包括:
[0033]第三分配單元,用于當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間;
[0034]第四分配單元,用于當(dāng)在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
[0035]優(yōu)選地,還包括:
[0036]設(shè)置模塊,用于在所述Linux終端中設(shè)置所述圖像內(nèi)存區(qū)域;
[0037]初始化模塊,用于將所述Linux終端的圖像專用內(nèi)存區(qū)域映射到所述圖像內(nèi)存區(qū)域中,并初始化所述圖像內(nèi)存區(qū)域。
[0038]優(yōu)選地,所述CPU內(nèi)存區(qū)域包括:直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域;所述第三分配單元包括:
[0039]查找子單元,用于采用預(yù)定算法在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足所述程序運行的頁面塊;
[0040]分配子單元,用于在第一個查找到的滿足所述程序運行的頁面塊對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間。
[0041]優(yōu)選地,所述分配模塊還包括第五分配單元,用于當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)所述Linux終端的內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次在所述圖像內(nèi)存區(qū)域為所述程序分配內(nèi)存空間。
[0042]本發(fā)明提出的一種內(nèi)存管理的方法及Linux終端,根據(jù)所獲取的分頁請求標(biāo)識,首先在該分頁請求標(biāo)識對應(yīng)的內(nèi)存區(qū)域中為程序分配內(nèi)存空間,即當(dāng)為圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識時,優(yōu)先在圖像內(nèi)存區(qū)域中分配內(nèi)存空間,在分配失敗時,可在CPU內(nèi)存區(qū)域分配內(nèi)存空間;當(dāng)不是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識時,優(yōu)先在CPU內(nèi)存區(qū)域中分配內(nèi)存空間,在分配失敗時,可在圖像內(nèi)存區(qū)域中分配內(nèi)存空間,本發(fā)明在保證并發(fā)訪問速度不變的前提下,根據(jù)程序運行的需要,動態(tài)地為CPU及GPU分配內(nèi)存空間,可以解除現(xiàn)有技術(shù)中GPU專用內(nèi)存的限制,充分高效地使用所有內(nèi)存空間,在相同內(nèi)存配置的條件下,本實施例的系統(tǒng)性能更優(yōu)越。
【專利附圖】
【附圖說明】
[0043]圖1是現(xiàn)有技術(shù)中CPU及GPU的內(nèi)存的電路圖;
[0044]圖2是本發(fā)明內(nèi)存管理的方法第一實施例的流程示意圖;
[0045]圖3是本發(fā)明內(nèi)存管理的方法第二實施例的流程示意圖;
[0046]圖4是圖3所示的在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域中分配內(nèi)存空間的一實施例的流程示意圖;
[0047]圖5是圖3所示的在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域中分配內(nèi)存空間的另一實施例的流程示意圖;
[0048]圖6是圖5所示的當(dāng)在圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在CPU內(nèi)存區(qū)域中分配內(nèi)存空間的一實施例的流程示意圖;
[0049]圖7是本發(fā)明Linux終端第一實施例的結(jié)構(gòu)示意圖;
[0050]圖8是本發(fā)明Linux終端第二實施例的結(jié)構(gòu)示意圖;
[0051]圖9是圖8所示的分配模塊一實施例的結(jié)構(gòu)示意圖;
[0052]圖10是圖8所示的分配模塊另一實施例的結(jié)構(gòu)示意圖;
[0053]圖11是圖10所示的第三分配單元的結(jié)構(gòu)示意圖。
[0054]為了使發(fā)明的技術(shù)方案更加清楚、明了,下面將結(jié)合附圖作進一步詳述。
【具體實施方式】
[0055]具體地,如圖2所示,本發(fā)明一實施例提出一種內(nèi)存管理的方法,包括:
[0056]步驟SI,當(dāng)在Linux終端上運行程序后,獲取為所述程序分配內(nèi)存空間的分頁請求標(biāo)識;
[0057]其中,Linux終端可以為計算機或者智能電視等,本實施例以智能電視為例進行說明。
[0058]其中,分頁請求標(biāo)識與為程序分配的內(nèi)存區(qū)域?qū)?yīng)。通常來說,Linux終端上具有ZONE_DMA (Direct Memory Access,直接存取內(nèi)存區(qū)域)、Z0NE_N0RMAL (普通內(nèi)存區(qū)域)及ZONE_HIGHMEM (高端內(nèi)存區(qū)域),每一個內(nèi)存區(qū)域?qū)?yīng)一種分頁請求標(biāo)識,例如若分頁請求標(biāo)識為GFG_NORMAL,則在普通內(nèi)存區(qū)域為該程序分配內(nèi)存空間。
[0059]步驟S2,判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0060]其中,本實施例還預(yù)先設(shè)置一圖像內(nèi)存區(qū)域,圖像內(nèi)存區(qū)域可以位于上述三個內(nèi)存區(qū)域的任意兩個內(nèi)存區(qū)域之間,例如位于直接存取內(nèi)存區(qū)域與普通內(nèi)存區(qū)域之間。
[0061]其中,定義上述直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域為CPU內(nèi)存區(qū)域。
[0062]當(dāng)獲取分頁請求標(biāo)識后,首先判斷該分頁請求標(biāo)識是否是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,即是否為GFG_GPU,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0063]其中,本實施例中若判斷是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則優(yōu)先在圖像內(nèi)存區(qū)域分配內(nèi)存空間,在圖像內(nèi)存區(qū)域分配內(nèi)存空間失敗時,可在CPU內(nèi)存區(qū)域分配內(nèi)存空間;同理,若判斷是CPU內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則優(yōu)先在CPU內(nèi)存區(qū)域分配內(nèi)存空間,在CPU內(nèi)存區(qū)域分配內(nèi)存空間失敗時,可在圖像內(nèi)存區(qū)域分配內(nèi)存空間。
[0064]本實施例根據(jù)所獲取的分頁請求標(biāo)識,首先在該分頁請求標(biāo)識對應(yīng)的內(nèi)存區(qū)域中為程序分配內(nèi)存空間,即當(dāng)為圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識時,優(yōu)先在圖像內(nèi)存區(qū)域中分配內(nèi)存空間,在分配失敗時,可在CPU內(nèi)存區(qū)域分配內(nèi)存空間;當(dāng)不是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識時,優(yōu)先在CPU內(nèi)存區(qū)域中分配內(nèi)存空間,在分配失敗時,可在圖像內(nèi)存區(qū)域中分配內(nèi)存空間,本實施例在保證并發(fā)訪問速度不變的前提下,根據(jù)程序運行的需要,動態(tài)地為CPU及GPU分配內(nèi)存空間,可以解除現(xiàn)有技術(shù)中GPU專用內(nèi)存的限制,充分高效地使用所有內(nèi)存空間,在相同內(nèi)存配置的條件下,本實施例的系統(tǒng)性能更優(yōu)越。
[0065]在一優(yōu)選的實施例中,如圖3所不,本發(fā)明另一實施例提出一種內(nèi)存管理的方法,在上述圖2實施例的基礎(chǔ)上,在上述步驟SI之前還包括步驟SOl及步驟S02,其中:
[0066]步驟SOl,在所述Linux終端中設(shè)置所述圖像內(nèi)存區(qū)域;
[0067]步驟S02,將所述Linux終端的圖像專用內(nèi)存區(qū)域映射到所述圖像內(nèi)存區(qū)域中,并初始化所述圖像內(nèi)存區(qū)域。
[0068]本實施例的圖像內(nèi)存區(qū)域可位于CPU內(nèi)存區(qū)域中的任意兩個內(nèi)存區(qū)域之間,設(shè)置圖像內(nèi)存區(qū)域包括修改初始化函數(shù)、內(nèi)存分配函數(shù)、內(nèi)存釋放函數(shù)及增加GFP_GPU分頁請求標(biāo)識等。其中,修改初始化函數(shù)主要是修改init.c文件中的arm_bootmem_free函數(shù),修改內(nèi)存分配函數(shù)主要是修改page_alloc.c文件中的alloc_pages_nodemask函數(shù)及相關(guān)聯(lián)函數(shù)。
[0069]將Linux終端的圖像專用內(nèi)存區(qū)域映射到圖像內(nèi)存區(qū)域中,可使得所有的內(nèi)存均由操作系統(tǒng)內(nèi)核同一管理。
[0070]在設(shè)置圖像內(nèi)存區(qū)域完成后,執(zhí)行初始化圖像內(nèi)存區(qū)域的流程,即獲取圖像內(nèi)存區(qū)域的起始地址、結(jié)束地址及圖像內(nèi)存區(qū)域的大小,對圖像內(nèi)存區(qū)域的空閑頁劃分為對應(yīng)的頁面塊,對圖像內(nèi)存區(qū)域?qū)?yīng)的頁表初始化等。
[0071]在一優(yōu)選的實施例中,如圖4所示,上述步驟S2在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域中分配內(nèi)存空間的步驟包括:
[0072]步驟S21,判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,若是則轉(zhuǎn)到步驟S22,否則轉(zhuǎn)到步驟S23 ;
[0073]步驟S22,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間;
[0074]步驟S23,在所述CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0075]在另一優(yōu)選的實施例中,如圖5所示,上述步驟S2在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域中分配內(nèi)存空間的步驟還可以包括:
[0076]步驟S21,判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,若是則轉(zhuǎn)到步驟S22,否則轉(zhuǎn)到步驟S23 ;
[0077]步驟S22,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間,若分配成功則結(jié)束流程,若分配失敗進入步驟S24 ;
[0078]步驟S23,在所述CPU內(nèi)存區(qū)域分配內(nèi)存空間,若分配成功則結(jié)束流程,若分配失敗進入步驟S25 ;
[0079]步驟S24,當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間;
[0080]步驟S25,當(dāng)在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間;
[0081]步驟S26,當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)所述Linux終端的內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次在所述圖像內(nèi)存區(qū)域為所述程序分配內(nèi)存空間。
[0082]若分頁請求標(biāo)識為圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則確定在圖像內(nèi)存區(qū)域中分配內(nèi)存空間,當(dāng)在圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,即圖像內(nèi)存區(qū)域中沒有足夠的剩余內(nèi)存空間時,按照操作系統(tǒng)內(nèi)核默認的順序在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足條件的內(nèi)存區(qū)域。
[0083]本實施例與現(xiàn)有技術(shù)不同的是,本實施例預(yù)設(shè)的圖像內(nèi)存區(qū)域優(yōu)先供GPU使用,但并不僅僅專門供GPU使用,例如當(dāng)有較多復(fù)雜的渲染任務(wù)時,預(yù)設(shè)的圖像內(nèi)存區(qū)域可能由于內(nèi)存空間過小而無法滿足條件,此時可以在優(yōu)先供CPU使用的CPU內(nèi)存區(qū)域中按照默認的順序查找滿足條件的內(nèi)存區(qū)域,避免界面顯示異常的問題并保證Linux終端的正常運行。
[0084]若分頁請求標(biāo)識不是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則確定在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域或高端內(nèi)存區(qū)域中分配內(nèi)存空間,當(dāng)在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域或高端內(nèi)存區(qū)域分配內(nèi)存空間失敗時,即這三個內(nèi)存區(qū)域中沒有足夠的剩余內(nèi)存空間時,可以在圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
[0085]本實施例與現(xiàn)有技術(shù)不同的是,本實施例的CPU內(nèi)存區(qū)域優(yōu)先供CPU使用,但當(dāng)有較多應(yīng)用程序在運行時,CPU內(nèi)存區(qū)域可能由于內(nèi)存空間過小而無法滿足條件,此時可以在優(yōu)先供GPU使用的圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
[0086]另外,在上述步驟S25中的在圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)Linux終端的內(nèi)存溢出機制(Out Of Memory, 00M)進行內(nèi)存空間的釋放,如強行關(guān)閉一些不常用的程序以增加可分配的內(nèi)存空間,并再次嘗試為當(dāng)前的程序分配內(nèi)存空間。[0087]與上述實施例不同的是,本實施例在分頁請求標(biāo)識不對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間時,若仍然失敗,則觸發(fā)內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次嘗試為當(dāng)前的程序分配內(nèi)存空間。
[0088]在一優(yōu)選的實施例中,如圖6所示,上述步驟S24在CPU內(nèi)存區(qū)域中分配內(nèi)存空間包括:
[0089]步驟S241,采用預(yù)定算法在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足所述程序運行的頁面塊;
[0090]步驟S242,在首先查找到的滿足所述程序運行的頁面塊對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間。
[0091]本實施例在CPU內(nèi)存區(qū)域中分配內(nèi)存空間時,優(yōu)選采用伙伴算法查找CPU內(nèi)存區(qū)域中滿足程序運行的頁面塊,具體為在與程序所需內(nèi)存大小相近的頁面塊的鏈表中查找,查找是否有該大小的頁面塊,若有,則直接分配;若無,則在頁面塊更大的鏈表中查找。與在CPU內(nèi)存區(qū)域中分配內(nèi)存空間一樣,在圖像內(nèi)存區(qū)域中分配內(nèi)存空間也采用伙伴算法。
[0092]如圖7所示,本發(fā)明一實施例提出一種Linux終端,包括:
[0093]獲取模塊101,用于當(dāng)在Linux終端上運行程序后,獲取為所述程序分配內(nèi)存空間的分頁請求標(biāo)識;
[0094]其中,Linux終端可以為計算機或者智能電視等,本實施例以智能電視為例進行說明。
[0095]其中,分頁請求標(biāo)識與為程序分配的內(nèi)存區(qū)域?qū)?yīng)。通常來說,Linux終端上具有Z0NE_DMA (Direct Memory Access,直接存取內(nèi)存區(qū)域)、Z0NE_N0RMAL (普通內(nèi)存區(qū)域)及Z0NE_HIGHMEM (高端內(nèi)存區(qū)域),每一個內(nèi)存區(qū)域?qū)?yīng)一種分頁請求標(biāo)識,例如若分頁請求標(biāo)識為GFG_N0RMAL,則在普通內(nèi)存區(qū)域為該程序分配內(nèi)存空間。
[0096]分配模塊102,用于判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0097]其中,本實施例還預(yù)先設(shè)置一圖像內(nèi)存區(qū)域,圖像內(nèi)存區(qū)域可以位于上述三個內(nèi)存區(qū)域的任意兩個內(nèi)存區(qū)域之間,例如位于直接存取內(nèi)存區(qū)域與普通內(nèi)存區(qū)域之間。
[0098]其中,定義上述直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域為CPU內(nèi)存區(qū)域。
[0099]當(dāng)獲取分頁請求標(biāo)識后,分配模塊102判斷該分頁請求標(biāo)識是否是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,即是否為GFG_GPU,并根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0100]其中,本實施例的分配模塊102若判斷是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則優(yōu)先在圖像內(nèi)存區(qū)域分配內(nèi)存空間,在圖像內(nèi)存區(qū)域分配內(nèi)存空間失敗時,可在CPU內(nèi)存區(qū)域分配內(nèi)存空間;同理,若判斷是CPU內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則優(yōu)先在CPU內(nèi)存區(qū)域分配內(nèi)存空間,在CPU內(nèi)存區(qū)域分配內(nèi)存空間失敗時,可在圖像內(nèi)存區(qū)域分配內(nèi)存空間。
[0101]在一優(yōu)選的實施例中,如圖8所示,本發(fā)明另一實施例提出一種Linux終端,在上述圖7所述的實施例的基礎(chǔ)上,還包括:
[0102]設(shè)置模塊099,用于在所述Linux終端中設(shè)置所述圖像內(nèi)存區(qū)域;[0103]初始化模塊100,用于將所述Linux終端的圖像專用內(nèi)存區(qū)域映射到所述圖像內(nèi)存區(qū)域中,并初始化所述圖像內(nèi)存區(qū)域。
[0104]本實施例的圖像內(nèi)存區(qū)域可位于CPU內(nèi)存區(qū)域中的任意兩個內(nèi)存區(qū)域之間,設(shè)置模塊099設(shè)置圖像內(nèi)存區(qū)域包括修改初始化函數(shù)、內(nèi)存分配函數(shù)、內(nèi)存釋放函數(shù)及增加GFP_GPU分頁請求標(biāo)識等。其中,修改初始化函數(shù)主要是修改init.c文件中的arm_bootmem_free函數(shù),修改內(nèi)存分配函數(shù)主要是修改page_alloc.c文件中的alloc_pages_nodemask函數(shù)及相關(guān)聯(lián)函數(shù)。
[0105]初始化模塊100將Linux終端的圖像專用內(nèi)存區(qū)域映射到圖像內(nèi)存區(qū)域中,使得所有的內(nèi)存均由操作系統(tǒng)內(nèi)核同一管理。
[0106]在設(shè)置圖像內(nèi)存區(qū)域完成后,初始化模塊100進行初始化圖像內(nèi)存區(qū)域,即獲取圖像內(nèi)存區(qū)域的起始地址、結(jié)束地址及圖像內(nèi)存區(qū)域的大小,對圖像內(nèi)存區(qū)域的空閑頁劃分為對應(yīng)的頁面塊,對圖像內(nèi)存區(qū)域?qū)?yīng)的頁表初始化等。
[0107]在一優(yōu)選的實施例中,如圖9所示,分配模塊102包括:
[0108]判斷單元1021,用于判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識;
[0109]第一分配單元1022,用于若是預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間;
[0110]第二分配單元1023,用于若不是預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,在所述CPU內(nèi)存區(qū)域分配內(nèi)存空間。
[0111]在另一優(yōu)選的實施例中,如圖10所示,在上述圖9的實施例的基礎(chǔ)上,分配模塊還包括:
[0112]第三分配單元1024,用于當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間;
[0113]第四分配單元1025,用于當(dāng)在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間;
[0114]第五分配單元1026,用于當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)所述Linux終端的內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次在所述圖像內(nèi)存區(qū)域為所述程序分配內(nèi)存空間。
[0115]若分頁請求標(biāo)識為圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則確定在圖像內(nèi)存區(qū)域中分配內(nèi)存空間,當(dāng)在圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,即圖像內(nèi)存區(qū)域中沒有足夠的剩余內(nèi)存空間時,按照操作系統(tǒng)內(nèi)核默認的順序在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足條件的內(nèi)存區(qū)域。
[0116]本實施例與現(xiàn)有技術(shù)不同的是,本實施例預(yù)設(shè)的圖像內(nèi)存區(qū)域優(yōu)先供GPU使用,但并不僅僅專門供GPU使用,例如當(dāng)有較多復(fù)雜的渲染任務(wù)時,預(yù)設(shè)的圖像內(nèi)存區(qū)域可能由于內(nèi)存空間過小而無法滿足條件,此時可以在優(yōu)先供CPU使用的CPU內(nèi)存區(qū)域中按照默認的順序查找滿足條件的內(nèi)存區(qū)域,避免界面顯示異常的問題并保證Linux終端的正常運行。
[0117]若分頁請求標(biāo)識不是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,則確定在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域或高端內(nèi)存區(qū)域中分配內(nèi)存空間,當(dāng)在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域或高端內(nèi)存區(qū)域分配內(nèi)存空間失敗時,即這三個內(nèi)存區(qū)域中沒有足夠的剩余內(nèi)存空間時,可以在圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
[0118]本實施例與現(xiàn)有技術(shù)不同的是,本實施例的CPU內(nèi)存區(qū)域優(yōu)先供CPU使用,但當(dāng)有較多應(yīng)用程序在運行時,CPU內(nèi)存區(qū)域可能由于內(nèi)存空間過小而無法滿足條件,此時可以在優(yōu)先供GPU使用的圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
[0119]另外,在上述第四分配單元1025中的在圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)Linux終端的內(nèi)存溢出機制(Out Of Memory, 00M)進行內(nèi)存空間的釋放,如強行關(guān)閉一些不常用的程序以增加可分配的內(nèi)存空間,并再次嘗試為當(dāng)前的程序分配內(nèi)存空間。
[0120]與上述實施例不同的是,本實施例在分頁請求標(biāo)識不對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間時,若仍然失敗,則觸發(fā)內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次嘗試為當(dāng)前的程序分配內(nèi)存空間。
[0121]在一優(yōu)選的實施例中,如圖11所示,第三分配單元1024包括:
[0122]查找子單元10241,用于采用預(yù)定算法在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足所述程序運行的頁面塊;
[0123]分配子單元10242,用于在首先查找到的滿足所述程序運行的頁面塊對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間。
[0124]本實施例在CPU內(nèi)存區(qū)域中分配內(nèi)存空間時,查找子單元10241優(yōu)選采用伙伴算法查找CPU內(nèi)存區(qū)域中滿足程序運行的頁面塊,具體為在與程序所需內(nèi)存大小相近的頁面塊的鏈表中查找,查找是否有該大小的頁面塊,若有,則直接分配;若無,則在頁面塊更大的鏈表中查找。與在CPU內(nèi)存區(qū)域中分配內(nèi)存空間一樣,在圖像內(nèi)存區(qū)域中分配內(nèi)存空間也采用伙伴算法。
[0125]本發(fā)明一種內(nèi)存管理的方法及Linux終端,根據(jù)所獲取的分頁請求標(biāo)識,首先在該分頁請求標(biāo)識對應(yīng)的內(nèi)存區(qū)域中為程序分配內(nèi)存空間,即當(dāng)為圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識時,優(yōu)先在圖像內(nèi)存區(qū)域中分配內(nèi)存空間,在分配失敗時,可在CPU內(nèi)存區(qū)域分配內(nèi)存空間;當(dāng)不是圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識時,優(yōu)先在CPU內(nèi)存區(qū)域中分配內(nèi)存空間,在分配失敗時,可在圖像內(nèi)存區(qū)域中分配內(nèi)存空間;在第二次配內(nèi)存空間,即在分頁請求標(biāo)識不對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間時,若仍然失敗,則觸發(fā)內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次嘗試為當(dāng)前的程序分配內(nèi)存空間,本發(fā)明在保證并發(fā)訪問速度不變的前提下,根據(jù)程序運行的需要,動態(tài)地為CPU及GPU分配內(nèi)存空間,可以解除現(xiàn)有技術(shù)中GI3U專用內(nèi)存的限制,充分高效地使用所有內(nèi)存空間,在相同內(nèi)存配置的條件下,本發(fā)明的系統(tǒng)性能更優(yōu)越。
[0126]以上所述僅為本發(fā)明的優(yōu)選實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或流程變換,或直接或間接運用在其它相關(guān)的【技術(shù)領(lǐng)域】,均同理包括在本發(fā)明的專利保護范圍內(nèi)。
【權(quán)利要求】
1.一種內(nèi)存管理的方法,其特征在于,包括以下步驟: 51、當(dāng)在Linux終端上運行程序后,獲取為所述程序分配內(nèi)存空間的分頁請求標(biāo)識; 52、判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟S2具體為: 521、判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,若是則轉(zhuǎn)到步驟S22,否則轉(zhuǎn)到步驟S23 ; 522、在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間; 523、在所述CPU內(nèi)存區(qū)域分配內(nèi)存空間。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述步驟S22后還包括: 524、當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間; 所述步驟S23之后還包括: 525、當(dāng)在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟SI之前包括: 501、在所述Linux終端中設(shè)置所述圖像內(nèi)存區(qū)域; 502、將所述Linux終端的圖像專用內(nèi)存區(qū)域映射到所述圖像內(nèi)存區(qū)域中,并初始化所述圖像內(nèi)存區(qū)域。
5.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述CPU內(nèi)存區(qū)域包括:直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域; 所述步驟S24具體包括: 5241、采用預(yù)定算法在所述直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足所述程序運行的頁面塊; 5242、在首先查找到的滿足所述程序運行的頁面塊對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間。
6.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述步驟S25之后包括: 526、當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)所述Linux終端的內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次在所述圖像內(nèi)存區(qū)域為所述程序分配內(nèi)存空間。
7.—種Linux終端,其特征在于,包括: 獲取模塊,用于當(dāng)在Linux終端上運行程序后,獲取為所述程序分配內(nèi)存空間的分頁請求標(biāo)識; 分配模塊,用于判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,根據(jù)判斷結(jié)果在圖像內(nèi)存區(qū)域或CPU內(nèi)存區(qū)域分配內(nèi)存空間。
8.根據(jù)權(quán)利要求7所述的終端,其特征在于,所述分配模塊包括: 判斷單元,用于判斷所述分頁請求標(biāo)識是否為預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識; 第一分配單元,用于若是預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間; 第二分配單元,用于若不是預(yù)設(shè)的圖像內(nèi)存區(qū)域?qū)?yīng)的分頁請求標(biāo)識,在所述CPU內(nèi)存區(qū)域分配內(nèi)存空間。
9.根據(jù)權(quán)利要求8所述的終端,其特征在于,所述分配模塊還包括: 第三分配單元,用于當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間; 第四分配單元,用于當(dāng)在所述CPU內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間。
10.根據(jù)權(quán)利要求7所述的終端,其特征在于,還包括: 設(shè)置模塊,用于在所述Linux終端中設(shè)置所述圖像內(nèi)存區(qū)域; 初始化模塊,用于將所述Linux終端的圖像專用內(nèi)存區(qū)域映射到所述圖像內(nèi)存區(qū)域中,并初始化所述圖像內(nèi)存區(qū)域。
11.根據(jù)權(quán)利要求9所述的終端,其特征在于,所述CPU內(nèi)存區(qū)域包括:直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域;所述第三分配單元包括: 查找子單元,用于采用預(yù)定算法在直接存取內(nèi)存區(qū)域、普通內(nèi)存區(qū)域及高端內(nèi)存區(qū)域中查找滿足所述程序運行的頁面塊; 分配子單元,用于在第 一個查找到的滿足所述程序運行的頁面塊對應(yīng)的內(nèi)存區(qū)域中分配內(nèi)存空間。
12.根據(jù)權(quán)利要求9所述的終端,其特征在于,所述分配模塊還包括第五分配單元,用于當(dāng)在所述圖像內(nèi)存區(qū)域中分配內(nèi)存空間失敗時,觸發(fā)所述Linux終端的內(nèi)存溢出機制進行內(nèi)存空間的釋放,并再次在所述圖像內(nèi)存區(qū)域為所述程序分配內(nèi)存空間。
【文檔編號】G06F9/50GK103744736SQ201410010312
【公開日】2014年4月23日 申請日期:2014年1月9日 優(yōu)先權(quán)日:2014年1月9日
【發(fā)明者】姜國定 申請人:深圳Tcl新技術(shù)有限公司