一種內存分配方法及裝置與流程
2023-06-09 06:31:17
本發明涉及計算機技術領域,特別涉及一種內存分配方法及裝置。
背景技術:
內存是計算機的重要組件之一,計算機中所有程序的運行都是在內存中進行的,因此計算機的性能嚴重依賴於內存性能的好壞。
目前,在linux系統中,通常我們習慣於使用malloc等api(applicationprogramminginterface,應用程式編程接口)函數來申請及分配運行進程所需要的內存。
但是,頻繁使用api函數會造成大量的內存碎片,同時,通過api函數申請分配內存時還會存在跨cpu(centralprocessingunit,中央處理器)節點分配內存的情況,因此,通過上述技術方案分配運行進程所需要的內存時,會影響內存的訪問速度。
技術實現要素:
本發明實施例提供了一種內存分配的方法及裝置,能夠提高內存訪問速度。
第一方面,本發明實施例提供了一種內存分配的方法,包括:
確定運行進程所對應的cpu;
在確定的所述cpu所對應的本地內存中申請所述運行進程相對應的內存池;
當所述運行進程申請內存時,從所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程。
優選地,進一步包括:
當所述運行進程釋放內存時,將所述運行進程分配的內存區域釋放回所述運行進程相對應的內存池中。
優選地,所述確定運行進程所對應的cpu,包括:
確定運行進程所需內存池的大小;
確定每一個待選擇cpu所分別對應的本地內存的剩餘空間;
根據每一個所述待選擇cpu分別對應的本地內存的剩餘空間,以及所述運行進程所需內存池的大小,從所述至少一個待選擇cpu中確定一個所述運行進程所對應的cpu。
優選地,在所述在確定的所述cpu所對應的本地內存中申請所述運行進程相對應的內存池之後,在所述從所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程之前,進一步包括:
預先將確定的所述內存池劃分為預設數量個內存區域;
則,所述當所述運行進程申請內存時,從所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程,包括:
當所述運行進程申請內存時,確定所述運行進程所需要申請的內存大小;
根據確定的內存大小,以及所述運行進程相對應的所述內存池中各個所述內存區域的大小,從所述預設數量個內存區域中選擇一個內存區域,將選擇的所述內存區域分配給所述運行進程。
優選地,還包括:
監測所述運行進程是否結束運行,在所述運行進程結束運行時,將所述運行進程相對應的所述內存池釋放回所述運行進程所對應的cpu的本地內存中。
第二方面,本發明實施例提供了一種內存分配裝置,包括:
確定單元、申請單元、分配單元;其中,
所述確定單元,用於確定運行進程所對應的cpu;
所述申請單元,用於在確定的所述cpu所對應的本地內存中申請所述運行進程相對應的內存池;
所述分配單元,用於當所述運行進程申請內存時,從所述申請單元申請的所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程。
優選地,進一步包括:
釋放單元,用於當所述運行進程釋放內存時,將所述運行進程分配的內存區域釋放回所述運行進程相對應的內存池中。
優選地,所述確定單元,包括:內存池大小確定子單元、剩餘空間確定子單元和cpu確定子單元;其中,
內存池大小確定子單元,用於確定運行進程所需內存池的大小;
剩餘空間確定子單元,用於確定每一個待選擇cpu所分別對應的本地內存的剩餘空間。
cpu確定子單元,用於根據每一個所述待選擇cpu分別對應的本地內存的剩餘空間,以及所述運行進程所需內存池的大小,從所述至少一個待選擇cpu中確定一個所述運行進程所對應的cpu。
優選地,進一步包括:
劃分單元,用於預先將所述申請單元申請的所述內存池劃分為預設數量個內存區域;
所述分配單元,包括:
內存大小確定子單元,用於當所述運行進程申請內存時,確定所述運行進程所需要申請的內存大小;
分配子單元,用於根據獲取的內存大小,以及所述運行進程相對應的所述內存池中各個所述內存區域的大小,從所述預設數量個內存區域中選擇一個內存區域,將選擇的所述內存區域分配給所述運行進程。
優選地,進一步包括:
內存池處理單元,用於監測所述運行進程是否結束運行,在所述運行進程結束運行時,將所述運行進程相對應的所述內存池釋放回所述運行進程所對應的cpu的本地內存中。
本發明實施例提供了一種內存分配方法及裝置,該方法通過預先給運行進程確定一個cpu,便於在該cpu的本地內存中給運行進程申請相對應的內存池;當運行進程申請內存時,從運行進程相對應的內存池中分配對應內存區域給運行進程;由於每個進程有確定的cpu和相對應的內存池,從而避免了運行進程跨cpu節點申請內存的情況,且在同一內存池中分配運行進程所需要的內存,也避免產生大量的內存碎片,從而利於提高內存訪問速度。
附圖說明
為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖是本發明的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
圖1是本發明一實施例提供的一種內存分配方法流程圖;
圖2是本發明一實施例提供的另一種內存分配方法流程圖;
圖3是本發明一實施例提供的一種內存分配裝置的結構示意圖;
圖4是本發明一實施例提供的另一種內存分配裝置的結構示意圖;
圖5是本發明一實施例提供的又一種內存分配裝置的結構示意圖;
圖6是本發明一實施例提供的再一種內存分配裝置的結構示意圖。
具體實施方式
為使本發明實施例的目的、技術方案和優點更加清楚,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例是本發明一部分實施例,而不是全部的實施例,基於本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動的前提下所獲得的所有其他實施例,都屬於本發明保護的範圍。
如圖1所示,本發明實施例提供了一種內存分配方法,該方法可以包括以下步驟:
步驟101:確定運行進程所對應的cpu;
步驟102:在確定的所述cpu所對應的本地內存中申請所述運行進程相對應的內存池;
步驟103:當所述運行進程申請內存時,從所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程。
本發明實施例提供了一種內存分配方法及裝置,該方法通過預先給運行進程確定一個cpu,便於在該cpu的本地內存中給運行進程申請相對應的內存池;當運行進程申請內存時,從運行進程相對應的內存池中分配對應內存區域給運行進程;由於每個進程有確定的cpu和相對應的內存池,從而避免了運行進程跨cpu節點申請內存的情況,且在同一內存池中分配運行進程所需要的內存,也避免產生大量的內存碎片,從而利於提高內存訪問速度。
舉例來說,運行進程f對應cpu2,在cpu2的本地內存中申請內存池f。在內存池f中有內存區域a、內存區域b、內存區域c3個內存區域且對應的內存大小分別為:0.7gb、1.5gb、3gb,當運行進程f申請1.3gb的內存時,為了避免浪費內存,從內存池f中選擇內存區域應大於運行進程f所申請的內存且與運行進程f所申請的內存的大小之差最小,從而選擇內存區域b給運行進程f。
為了提高內存池的內存利用率,在本發明一實施例中,當所述運行進程釋放內存時,將所述運行進程分配的內存區域釋放回所述運行進程相對應的內存池中。
本發明實施例中,當運行進程不再使用內存時,會將分配給運行進程的內存區域釋放回運行進程相對應的內存池中,便於該運行進程再次申請內存,從而提高了內存池的內存利用率。
為了提高本地內存利用率,所述步驟101的具體實現方式可以包括:
確定運行進程所需內存池的大小;
確定每一個待選擇cpu所分別對應的本地內存的剩餘空間;
根據每一個所述待選擇cpu分別對應的本地內存的剩餘空間,以及所述運行進程所需內存池的大小,從所述至少一個待選擇cpu中確定一個所述運行進程所對應的cpu。
本發明實施例中,首先確定運行進程所需內存池的大小,再確定所有待選擇cpu所分別對應的本地內存的剩餘空間,便於與運行進程所需要的內存池的大小進行對比。通過將所有待選擇cpu分別對應的本地內存的剩餘空間逐個與運行進程所需內存池的大小對比,為了提高本地內存利用率,從所有待選擇cpu中確定一個cpu,所確定cpu的本地內存剩餘空間大於運行進程所需內存池的大小且與運行進程所需內存池的大小之差最小,從而避免了浪費cpu的本地內存空間。
舉例來說:確定運行進程f需要內存大小為2gb的內存池,又確定出待選擇cpu1、cpu2、cpu3所對應的本地內存剩餘空間分別為:0.7gb、3gb、5gb。經過將2gb與0.7gb、3gb、5gb逐個對比後,為了提高內存池的內存利用率,確定cpu2的本地內存剩餘空間剛好符合運行進程f所需內存池的大小。
為了避免浪費內存,本發明一實施例中,在所述在確定的所述cpu所對應的本地內存中申請所述運行進程相對應的內存池之後,在所述從所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程之前,進一步包括:
預先將確定的所述內存池劃分為預設數量個內存區域;
則,所述步驟103的具體實現方式可以包括:
當所述運行進程申請內存時,確定所述運行進程所需要申請的內存大小;
根據確定的內存大小,以及所述運行進程相對應的所述內存池中各個所述內存區域的大小,從所述預設數量個內存區域中選擇一個內存區域,將選擇的所述內存區域分配給所述運行進程。
本發明實施例中,在運行進程確定的cpu所對應的本地內存中申請運行進程對應的內存池之後,在從運行進程相對應的內存池中分配對應的內存區域給運行進程之前,根據內存池的大小將內存池劃分為幾個不同大小的內存區域。當運行進程申請內存時,先確定需要申請的內存大小,便於從內存池的所有待選擇內存區域中選擇一個既大於運行進程所申請的內存又與運行進程所申請的內存大小之差最小的內存區域,並將選擇的內存區域分配給運行進程,從而避免了大量內存碎片的產生。
舉例來說:根據運行進程f相對應的內存池f內存大小為6gb,將內存池f劃分為a、b、c3個內存區域分別對應的內存大小依次為1gb、2gb、3gb。當運行進程f向內存池f申請1.5gb內存時,為了避免大量內存碎片的產生,內存池f會將內存區域b分配給運行進程f。
為了方便其他運行進程申請內存,本發明一實施例中,監測所述運行進程是否結束運行,在所述運行進程結束運行時,將所述運行進程相對應的所述內存池釋放回所述運行進程所對應的cpu的本地內存中。
本發明實施例中,通過監測運行進程,可以及時得知運行進程是否已結束運行,當監測到運行進程已經結束運行時,會將運行進程相對應的內存池釋放回運行進程所對應的cpu的本地內存中,從而避免了資源浪費。
舉例來說:通過監控模塊檢測運行進程,當監測到運行進程f結束運行時,會將運行進程f的內存池f通過內存釋放接口釋放回運行進程f對應的本地內存中。
為了更加清楚的說明本發明的技術方案及優點,下面以系統中包括cpu1、2、3,各個cpu分別對應的本地內存依次為a、b、c,通過本發明的技術方案實現向運行進程f分配內存為例,如圖2所示,具體可以包括以下步驟:
步驟201:確定運行進程f所需內存池的大小。
在本發明實施例中,確定運行進程所需內存池的大小,便於與所有待選擇cpu的本地內存剩餘空間對比。
舉例來說,在linux系統中,運行進程f創建時調用綁定cpux並在cpux的本地內存z中分配內存池接口,通過內存池接口確定運行進程f所需內存池的大小為6gb。
步驟202,確定cpu1對應的本地內存a的剩餘空間,確定cpu2對應的本地內存b的剩餘空間,確定cpu3對應的本地內存c的剩餘空間。
舉例來說,通過內存池接口確定cpu1的本地內存a的剩餘空間為3gb,cpu2的本地內存b的剩餘空間為6gb,cpu3的本地內存c的剩餘空間為7gb。
步驟203,根據cpu1、cpu2、cpu3分別對應的本地內存的剩餘空間,以及運行進程f所需內存池的大小,從3個cpu中確定一個運行進程所對應的cpu。
舉例來說,已知cpu1的本地內存a的剩餘空間為3gb、cpu2的本地內存b的剩餘空間為6gb、cpu3的本地內存c的剩餘空間為7gb,將3個cpu的本地內存的剩餘空間分別與運行進程f的所需內存池的大小為6gb進行對比,為了避免浪費內存,最後確定cpu2為運行進程f所對應的cpu。
步驟204:在cpu2的本地內存b中申請運行進程f的內存池f。
舉例來說,在numa架構下,通過內存池接口在cpu2的本地內存b中申請運行進程f的內存池f。
步驟205:預先將內存池f劃分為3個內存區域;
舉例來說,根據內存池f的空間為6gb,將內存池f劃分為內存區域f1、內存區域f2、內存區域f3,且f1、f2、f3相對應內存區域的空間大小依次為:1gb、2gb、3gb。
步驟206:當運行進程f申請內存時,確定運行進程f所申請的內存大小。
舉例來說,當運行進程f申請內存時,通過內存申請接口確認運行進程f需要申請2gb的內存。
步驟207:根據確定的內存大小,以及內存池f所對應的f1、f2、f3三個內存區域相對應的內存區域大小,從3個內存區域中選擇一個內存區域,並將選擇的內存區域分配給運行進程f。
舉例來說,運行進程f需要申請2gb的內存,內存池f所對應的f1、f2、f3三個內存區域相對應的內存區域大小依次為1gb、2gb、3gb,通過將需要申請的內存大小和3個內存區域的大小比對,將內存區域f2分配給運行進程f。
步驟208:當運行進程f釋放內存時,將內存區域f2釋放回內存池f中。
舉例來說,當運行進程f釋放內存時,通過內存釋放接口將內存區域f2釋放回內存池f中。
步驟209:監測運行進程f是否結束運行,在運行進程f結束運行時,將運行進程f相對應的內存池f釋放回運行進程f所對應的cpu2的本地內存b中。
舉例來說,通過檢測模塊監測運行進程,當運行進程f結束運行時,通過內存釋放接口內存池f釋放回本地內存b中。
在本發明實施例中,首先確定運行進程所需內存池的大小和每個待選擇cpu所分別對應的本地內存的剩餘空間,根據將運行進程所需內存池大小與每個待選擇cpu分別對應的本地內存的剩餘空間逐個對比,可以快速確定一個cpu,並可以實現在該cpu的本地內存中給運行進程申請一個內存池。在從運行進程相對應的內存池中分配對應的內存區域給運行進程之前,先將內存池劃分為預設數量個內存區域,當運行進程申請內存時,從預設數量個內存區域中選擇一個能滿足運行進程需要申請的內存大小的內存區域並分配給運行進程。當運行進程釋放內存時,將分配給運行進程的內存能區域釋放回運行進程對應的內存池中,只有當運行進程結束運行時,才會將申請的內存池釋放回本地內存中,便於其他進程從該cpu的本地內存中申請內存池。
如圖3所示,本發明一實施例提供了一種內存分配裝置,包括:確定單元301、申請單元302、分配單元303;其中,
確定單元301,用於確定運行進程所對應的cpu;
申請單元302,用於在確定單元確定的所述cpu所對應的本地內存中申請所述運行進程相對應的內存池;
分配單元303,用於當所述運行進程申請內存時,從所述申請單元申請的所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程。
本發明實施例中,確定單元確定了運行進程所對應的cpu,通過申請單元在該cpu的本地內存中申請內存池,當運行進程申請內存時,分配單元從內存池中分配內存區域給運行進程,由於每個運行進程有固定的cpu和內存池,從而避免了運行進程跨cpu節點申請內存的情況,且在同一內存池中分配內存,也避免了內存碎片,從而利於提高內存訪問速度。
基於圖3所示的一種內存分配裝置,本發明一實施例中,如圖4所示,該裝置中的所述確定單元301包括:內存池大小確定子單元3011、剩餘空間確定子單元3012和cpu確定子單元3013;其中,
內存池大小確定子單元3011,用於確定運行進程所需內存池的大小;
剩餘空間確定子單元3012,用於確定每一個待選擇cpu所分別對應的本地內存的剩餘空間。
cpu確定子單元3013,用於根據每一個所述待選擇cpu分別對應的本地內存的剩餘空間,以及所述運行進程所需內存池的大小,從所述至少一個待選擇cpu中確定一個所述運行進程所對應的cpu。
基於圖4所示的一種內存分配裝置,本發明一實施例中,如圖5所示,在所述在確定的所述cpu所對應的本地內存中申請所述運行進程相對應的內存池之後,在所述從所述運行進程相對應的所述內存池中分配對應的內存區域給所述運行進程之前,該裝置進一步包括:
劃分單元401:用於預先將所述申請單元申請的所述內存池劃分為預設數量個內存區域;
所述分配單元303,包括:
內存大小確定子單元3031,用於當所述運行進程申請內存時,確定所述運行進程所需要申請的內存大小;
分配子單元3032,用於根據獲取的內存大小,以及所述運行進程相對應的所述內存池中各個所述內存區域的大小,從所述預設數量個內存區域中選擇一個內存區域,將選擇的所述內存區域分配給所述運行進程。
基於圖5所示的一種內存分配裝置,本發明一實施例中,如圖6所示,該裝置進一步包括:
內存池處理單元501,用於監測所述運行進程是否結束運行,在所述運行進程結束運行時,將所述運行進程相對應的所述內存池釋放回所述運行進程所對應的cpu的本地內存中。
本發明各個實施例至少具有如下有益效果:
1、本發明一實施例中,預先確定運行進程所對應的cpu,並在該cpu的本地內存中申請內存池,當運行進程申請內存時,從內存池中分配內存區域給運行進程,由於每個運行進程有固定的cpu和內存池,從而避免了運行進程跨cpu節點申請內存的情況,且在同一內存池中分配內存,也避免了內存碎片,從而利於提高內存訪問速度。
2、本發明一實施例中,當運行進程不再使用內存時,會將分配給運行進程的內存區域釋放回運行進程相對應的內存池中,便於該運行進程再次申請內存,從而提高了內存池的內存利用率。
3、本發明一實施例中,首先確定運行進程所需內存池的大小,再確定所有待選擇cpu所分別對應的本地內存的剩餘空間,便於與運行進程所需要的內存池的大小進行對比。通過將所有待選擇cpu分別對應的本地內存的剩餘空間逐個與運行進程所需內存池的大小對比,從所有待選擇cpu中確定一個cpu,所確定cpu的本地內存剩餘空間大於運行進程所需內存池的大小且與運行進程所需內存池的大小之差最小,從而避免了浪費cpu的本地內存空間。
4、本發明一實施例中,在運行進程確定的cpu所對應的本地內存中申請運行進程對應的內存池之後,在從運行進程相對應的內存池中分配對應的內存區域給運行進程之前,根據內存池的大小將內存池劃分為幾個不同大小的內存區域。當運行進程申請內存時,先確定需要申請的內存大小,便於從內存池的所有待選擇內存區域中中選擇一個既大於運行進程所申請的內存又與運行進程所申請的內存大小之差最小的內存區域,並將選擇的內存區域分配給運行進程,從而避免了浪費內存。
5、本發明一實施例中,通過監測運行進程,可以及時得知運行進程是否已結束運行,當監測到運行進程已經結束運行時,會將運行進程相對應的內存池釋放回運行進程所對應的cpu的本地內存中,從而避免了資源浪費。
需要說明的是,在本文中,諸如第一和第二之類的關係術語僅僅用來將一個實體或者操作與另一個實體或操作區分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關係或者順序。而且,術語「包括」、「包含」或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設備所固有的要素。在沒有更多限制的情況下,由語句「包括一個〃·····」限定的要素,並不排除在包括所述要素的過程、方法、物品或者設備中還存在另外的相同因素。
本領域普通技術人員可以理解:實現上述方法實施例的全部或部分步驟可以通過程序指令相關的硬體來完成,前述的程序可以存儲在計算機可讀取的存儲介質中,該程序在執行時,執行包括上述方法實施例的步驟;而前述的存儲介質包括:rom、ram、磁碟或者光碟等各種可以存儲程序代碼的介質中。
最後需要說明的是:以上所述僅為本發明的較佳實施例,僅用於說明本發明的技術方案,並非用於限定本發明的保護範圍。凡在本發明的精神和原則之內所做的任何修改、等同替換、改進等,均包含在本發明的保護範圍內。