也可隨機選擇正整數k進行劃分,即所述內存塊的內存空間可以是等同的、也可以是不等同的,可根據內存管理裝置的應用場景自行設定。
[0038]S202,當接收到任一節點程序的申請內存請求時,解析所述申請內存請求,確定內存分配空間為η字節;
[0039]具體的,當所述內存管理裝置接收到任一節點程序的申請內存請求時,先解析所述節點程序的申請內存請求可知申請內存空間為a字節,可根據2j 1 < a < 2j (j為正整數)確定需要對所述節點程序分配的內存空間為21字節,設為η字節。
[0040]S203,根據所述內存分配空間,判斷在所述內存池鏈表中是否存在處于空閑狀態的η字節內存塊;
[0041]具體的,在所述內存管理裝置確定對所述節點程序分配內存空間為η字節之后,判斷在所述內存池鏈表中是否存在處于空閑狀態的η字節內存塊;
[0042]需要說明的是,所述內存池鏈表是記錄內存池中內存塊的內存空間、標識/[目息、歸屬信息、狀態信息的。所述標識信息是用于區分各個內存塊的信息。所述歸屬信息是指內存塊最初屬于的內存塊信息,可以理解的是,在內存塊未被拆分之前,其標識信息與歸屬信息是相同的;當內存塊被拆分之后,每一個拆分塊都有一個新的標識信息,但是歸屬信息保持不變,并且可知由同一個內存塊拆分得到的拆分塊的歸屬信息相同。所述狀態信息是用以指示所述內存塊是處于空閑狀態還是占用狀態,處于空閑狀態的內存塊可在接收到節點程序申請內存請求時,進行分配并標記處于占用狀態;處于占用狀態的內存塊在接收到釋放內存請求時,進行釋放并標記處于空閑狀態。
[0043]S204,對所述任一節點程序分配內存塊,并在內存池鏈表中將所述內存塊標記為占用狀態;
[0044]具體的,若在所述內存池鏈表中存在處于空閑狀態的η字節內存塊,則所述內存管理裝置將對所述任一節點程序分配所述η字節內存塊,并在所述內存鏈表中將所述η字節內存塊標記為占用狀態,即所述η字節內存塊在被釋放之前不能被其余節點程序再次申請。
[0045]S205,判斷在所述內存池鏈表中是否存在處于所述空閑狀態的m字節內存塊,其中,m > η ;
[0046]具體的,若在所述內存池鏈表中不存在處于空閑狀態的η字節內存塊,則判斷在所述內存池鏈表中是否存在處于所述空閑狀態的m字節內存塊,其中,m > η。由S202可知,η字節為21字節,且所述內存池的內存塊是2k字節,設所述m字節為21字節,由于m >η,則i是大于j的正整數。
[0047]S206,將所述m字節內存塊平均分開且標記為第一拆分塊和第二拆分塊;
[0048]具體的,若在所述內存池鏈表中存在處于所述空閑狀態的m字節內存塊,根據S205所述m字節為21字節,而由S202可知所述任一節點程序所需的內存空間為η字節(2j字節),且i是大于j的正整數,則將所述21字節內存塊平均分開且標記為第一拆分塊和第二拆分塊。例如,當i = j+Ι時,即21 = 2J+1 = 2*2],可將所述21字節內存塊平均分為兩個2j字節內存塊;當i > j+Ι時,可將所述21字節內存塊平均分為兩個大于2j字節內存塊,兩種情況都滿足所述任一節點程序所需的內存空間為η字節(21字節)。
[0049]進而,再執行S204的步驟,對所述任一節點程序分配所述第一拆分塊,且在所述內存池鏈表中將第一拆分塊標記為所述占用狀態和第二拆分塊標記為所述空閑狀態,其中,所述第一拆分塊和所述第二拆分塊是對應的,即兩者的內存空間相同、歸屬信息相同。
[0050]S207,提示內存不足,且對所述任一節點程序不分配內存;
[0051]具體的,若在所述內存池鏈表中不存在處于所述空閑狀態的m字節內存塊,則所述內存管理裝置提示內存不足,且對所述任一節點程序不分配內存。
[0052]S208,當接收到所述任一節點程序的釋放內存請求時,根據所述釋放內存請求將釋放內存塊釋放,且在所述內存池鏈表中將所述釋放內存塊標記為空閑狀態;
[0053]具體的,當所述內存管理裝置接收到所述任一節點程序的釋放內存請求時,根據所述任一節點程序釋放內存的地址進行查詢,進而得到相對應的釋放內存塊,將所述釋放內存塊進行釋放,并且在所述內存池鏈表中將所述釋放內存塊標記為空閑狀態,用以提供其他節點程序申請并使用。
[0054]S209,當所述釋放內存塊是第一拆分塊時,且與所述第一拆分塊相對應的第二拆分塊處于所述空閑狀態,則將所述第一拆分塊與所述第二拆分塊組合為合并內存塊;
[0055]具體的,所述內存管理裝置在所述內存池鏈表中查詢所述釋放內存塊的標識信息與歸屬信息是否相同,若相同,則所述釋放內存塊不是拆分塊;若不相同,則所述釋放內存塊是拆分塊,標記為第一拆分塊,同時在所述內存池鏈表中查詢與第一拆分塊歸屬信息相同的第二拆分塊的狀態信息,若所述第二拆分塊處于空閑狀態,則可根據所述第一拆分塊與所述第二拆分塊的首地址先后順序將兩者組合為合并內存塊,并在所述內存池鏈表中更新合并內存塊的內存空間、標識信息、歸屬信息、狀態信息,用以提供其他節點程序申請并使用。
[0056]在本發明實施例中,當接收到任一節點程序的申請內存請求時,對任一節點程序分配內存塊,并在內存池鏈表中將內存塊標記為占用狀態,當接收到任一節點程序的釋放內存請求時,根據釋放內存請求將釋放內存塊釋放,且在內存池鏈表中將釋放內存塊標記為空閑狀態,當釋放內存塊是第一拆分塊時,且與第一拆分塊相對應的第二拆分塊處于空閑狀態,則將所述第一拆分塊與所述第二拆分塊組合為合并內存塊。在內存分配時,可通過拆分內存塊合理地利用內存空間,并通過釋放與任一節點程序的釋放內存請求相對應的內存塊,減少了由于不確定申請內存大小而產生的內存碎片,從而避免了資源的浪費,提高了內存利用率。
[0057]請參見圖3,為本發明實施例提供了又一種內存管理方法的流程示意圖。如圖3所示,本發明實施例的所述方法可以包括以下步驟S301-步驟S306。
[0058]S301,根據節點內存空間創建內存池,在所述內存池中將所述內存空間劃分為2k字節的內存塊,其中k為正整數;
[0059]具體的,內存管理裝置在初始階段根據節點內存空間創建內存池,在所述內存池中將所述內存空間劃分為2k字節的內存塊,其中k為正整數。所述內存空間的劃分可按照k從小到大的順序依次劃分為2k字節的內存塊,也可隨機選擇正整數k進行劃分,即所述內存塊的內存空間可以是等同的、也可以是不等同的,可根據內存管理裝置的應用場景自行設定。
[0060]S302,當接收到任一節點程序的申請內存請求時,對所述任一節點程序分配內存塊,并在內存池鏈表中將所述內存塊標記為占用狀態;
[0061]具體的,當所述內存管理裝置接收到任一節點程序的申請內存請求時,可根據所述任一節點程序的申請內存空間分配內存塊,在所述內存管理裝置分配完所述內存塊之后,在內存池鏈表中將所述內存塊標記為占用狀態,即所述內存塊在被釋放之前不能被其余節點程序再次申請。
[0062]需要說明的是,所述內存池鏈表是記錄內存池中內存塊的內存空間、標識/[目息、歸屬信息、狀態信息的。所述標識信息是用于區分各個內存塊的信息。所述歸屬信息是指內存塊最初屬于的內存塊信息,可以理解的是,在內存塊未被拆分之前,其標識信息與歸屬信息是相同的;當內存塊被拆分之后,每一個拆分塊都有一個新的標識信息,但是歸屬信息保持不變,并且可知由同一個內存塊拆分得到的拆分塊的歸屬信息相同。所述狀態信息是用以指示所述內存塊是處于空閑狀態還是占用狀態,處于空閑狀態的內存塊可在接收到節點程序申請內存請求時,進行分配并標記處于占用狀態;處于占用狀態的內存塊在接收到釋放內存請求時,進行釋放并標記處于空閑狀態。
[0063]S303,當接收到所述任一節點程序的釋放內存請求時,根據所述釋放內存請求獲取釋放內存地址;
[0064]具體的,當所述內存管理裝置接收到所述任一節點程序的釋放內存請求時,可根據所述釋放內存請求獲取釋放內存地址;
[0065]S304,根據所述釋放內存地址,查找與所述釋放內存地址相對應的釋放內存塊的首地址;
[0066]具體的,所述內存管理裝置根據所述釋放內存地址,在所述內存池鏈表中查詢所述釋放內存地址所屬內存塊的首地址。
[0067]S305,根據所述首地址釋放所述釋放內存塊,且在所述內存池鏈表中將所述釋放內存塊標記為所述空閑狀態;
[0068]具體的,在查找到首地址之后,所述內存管理裝置將所述釋放內存塊釋放,且在所述內存池鏈表中將所述釋放內存塊標記為所述空閑狀態,用以提供其他節點程序申請并使用。
[0069]S306,當所述釋放內存塊是第一拆分塊時,且與所述第一拆分塊相對應的第二拆分塊處于所述空閑狀態,則將所述第一拆分塊與所述第二拆分塊組合為合并內存塊;
[0070]具體的,所述內存管理裝置在所述內存池鏈表中查詢所述釋放內存塊的標識信息與歸屬信息是否相同,若相同,則所述釋放內存塊不是拆分塊;若不相同,則所述釋放內存塊是拆分塊,標記為第一拆分塊,同時在所述內存池鏈表中查詢與第一拆分塊歸屬信息相同的第二拆分塊的狀態信息,若所述第二拆分塊處于空閑狀態,則可根據所述第一拆分塊與所述第二拆分塊的首地址先后順序將兩者組合為合并內存塊,并在所述內存池鏈表中更新合并內存塊的內存空間、標識信息、