一種內存管理方法和裝置的製作方法
2023-05-12 03:09:11 1
專利名稱:一種內存管理方法和裝置的製作方法
技術領域:
本發明涉及計算機領域,更具體地,涉及一種內存管理方法和裝置。
背景技術:
Linux作業系統採用物理內存和虛擬內存,物理內存是系統硬體提供的內存大小,是真正的內存,虛擬內存是為了滿足物理內存的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯內存,用作虛擬內存的磁碟空間被稱為交換空間(Swap Space)。內核會將暫時不用的頁面寫到交換空間,這樣使物理內存得到釋放,這塊內存就可以用於其它目的。
交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此可能會出現虛擬內存中沒有足夠空間來存儲這些交換頁面的問題,最終會導致Iinux出現假死機、服務異常等問題。
特別是在Linux中編寫伺服器程序時,經常會向系統大量申請或釋放內存,上述問題會導致申請內存失敗,而且,伺服器程序需要大量內存操作時會用鍊表的形式,內存地址中會記錄下一個數據的地址,根據指針的方式去尋找下一個數據,這樣數據會分配到內存的各個地方,也不便於管理和調試。發明內容
有鑑於此,本發明實施例的目的是提出一種內存管理方法和裝置,能夠有效解決Linux系統內存管理方面存在的缺陷。
為了達到上述目的,本發明實施例提出一種內存管理方法,包括以下步驟:
當程序啟動時,為程序向系統申請預設容量的內存塊;
根據程序中請求的內存大小從所述內存塊中查找可用內存;
輸出查找到的可用內存的地址。
本發明實施例中一次性向系統申請一塊足夠大的內存,在申請的足夠大的內存中管理程序中的申請和釋放內存,既解決了系統內存管理方面存在的缺陷,又能很好掌控程序在內存使用中的具體情況,便於調試程序。
作為上述技術方案的優選,根據程序中請求的內存大小從所述內存塊中查找可用內存的步驟包括:根據程序中請求的內存大小,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。本方案便於重複使用已分配好的內存。
作為上述技術方案的優選,根據程序中請求的內存大小從所述內存塊中查找可用內存的步驟包括:
判斷程序中請求的內存大小的值是否等於預設值;
當程序中請求的內存大小的值不等於預設值時,將程序中請求的內存大小的值增大至等於預設值;
根據增大後的內存大小的值,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
在本實施例中,將請求的內存大小向上與預設值對齊,便於下次再申請小於預設值大小的內存時能夠快速命中此次申請並釋放後的內存。
作為上述技術方案的優選,判斷程序中請求的內存大小的值是否等於預設值的步驟包括:
判斷程序中請求的小於預設閾值的內存大小的值是否等於2的指數倍;以及
判斷程序中請求的大於預設閾值的內存大小的值是否等於4K的整數倍;
將程序中請求的內存大小的值增大至等於預設值的步驟包括:
將程序中請求的小於預設閾值的內存大小的值增大至等於2的指數倍;以及
將程序中請求的大於預設閾值的內存大小的值增大至等於4K的整數倍。
本方案在請求的內存大小在預設閾值以下時採用指數對齊、在預設閾值以上時以4K為單位線性對齊,既實現了對齊,又不會造成太多的資源浪費。
作為上述技術方案的優選,所述方法還包括步驟:
將程序中釋放的內存回收至所述內存塊中。
採用本方案可以重複使用內存。
作為上述技術方案的優選,所述方法還包括步驟:
定期整理所述內存塊中的內存碎片。
本方案使零碎的內存碎片連接成大塊的內存,以便下次申請大塊內存時能夠成功分配。
本發明實施例還提出一種內存管理裝置,包括:
申請模塊,用於當程序啟動時,為程序向系統申請預設容量的內存塊;
查找模塊,用於根據程序中請求的內存大小從所述內存塊中查找可用內存;
輸出模塊,用於輸出查找到的可用內存的地址。
作為上述技術方案的優選,所述查找模塊用於:根據程序中請求的內存大小,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
作為上述技術方案的優選,所述查找模塊包括:
判斷單元,用於判斷程序中請求的內存大小的值是否等於預設值;
處理單元,用於當程序中請求的內存大小的值不等於預設值時,將程序中請求的內存大小的值增大至等於預設值;
查找單元,用於根據增大後的內存大小的值,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
作為上述技術方案的優選,所述判斷單元用於:
判斷程序中請求的小於預設閾值的內存大小的值是否等於2的指數倍;以及
判斷程序中請求的大於預設閾值的內存大小的值是否等於4K的指數倍;
所述處理單元用於:
將程序中請求的小於預設閾值的內存大小的值增大至等於2的指數倍;以及
將程序中請求的大於預設閾值的內存大小的值增大至4K的整數倍。
作為上述技術方案的優選,所述裝置還包括:
回收模塊,用於將程序中釋放的內存回收至所述內存塊中。
作為上述技術方案的優選,所述裝置還包括:
內存碎片整理模塊,用於定期整理所述內存塊中的內存碎片。
本發明實施例的其它特徵和優點將在隨後的說明書中闡述,並且,部分地從說明書中變得顯而易見,或者通過實施本發明實施例而了解。本發明實施例的目的和其他優點可通過在所寫的說明書、權利要求書、以及附圖中所特別指出的結構來實現和獲得。
下面通過附圖和實施例,對本發明實施例的技術方案做進一步的詳細描述。
附圖用來提供對本發明實施例的進一步理解,並且構成說明書的一部分,並不構成對本發明實施例的限制。在附圖中:
圖1是本發明實施例中的內存管理的主要方法流程圖2是本發明實施例中的內存管理的詳細方法流程圖3是本發明實施例中的內存管理裝置的結構示意圖。
具體實施方式
以下結合附圖對優選實施例進行說明,應當理解,此處所描述的優選實施例僅用於說明和解釋本發明實施例,並不用於限定本發明實施例。
如圖1所示為本發明實施例中內存管理的主要方法流程,包括以下步驟:
步驟SlOl:當程序啟動時,為程序向系統申請預設容量的內存塊。
該預設容量應為足夠該程序使用內存塊大小,例如使用Malloc函數向系統申請足夠大的內存塊以供程序使用。
步驟S102:根據程序中請求的內存大小從所述內存塊中查找可用內存。
步驟S103:輸出查找到的可用內存的地址。
本發明實施例中,一次性向系統申請一塊足夠大的內存,然後程序申請和釋放內存都由自己來管理,可以使程序快速的申請和釋放內存。既解決了系統內存管理方面存在的缺陷,又能很好掌控程序在內存使用中的具體情況,便於調試程序。
下面通過兩個典型實施例來詳細介紹實現過程。
如圖2所示為本發明實施例中內存管理的詳細方法流程,包括以下步驟:
步驟S201:當程序啟動時,向系統申請足夠程序使用的內存塊。
步驟S202:將申請的內存塊初始化。
按預設的結構體初始化,該結構體包括內存池指針、長度和表示某段內存是否可用的標記等信息。
步驟S203:獲取程序運行過程中請求的內存大小的值。
步驟S204:判斷程序中請求的內存大小的值是否等於預設值,若是,執行步驟206,若否,執行步驟S205 ;
步驟S205:將請求的內存大小的值向上與預設值對齊。
優選地,將程序中請求的小於預設閾值的內存大小的值增大至等於2的指數倍,即將請求的小於預設閾值的內存大小的值按2的指數向上對齊。預設閾值優選為4K。例如,請求的內存大小為3K時,將其對齊為4K ;請求的內存大小為IK時,將其對齊為2K。
將程序中請求的大於預設閾值的內存大小的值增大至4K的整數倍,將程序中請求的大於預設閾值的內存大小按向上4K對齊,預設閾值優選為4K。例如,請求的內存大小為5Κ、6Κ或7Κ時,將其對齊為8Κ,請求的內存大小為9Κ,將其對齊為12Κ。
步驟S206:在申請的內存塊中查找可用內存。
在本步驟中,優先從內存塊中的已分配並釋放的內存中查找可用內存,若沒有查找到,再從內存塊中未分配的內存中分配可用內存,便於重複使用已分配好的內存。例如,程序剛申請了 5Κ大的內存釋放後(實際分配給程序8Κ內存),再申請6Κ大的內存時,根據對齊後的申請內存的大小的值(對齊後為8Κ),直接查找到剛釋放的8Κ內存,返回相同的內存地址。
從內存塊的結構體中查找表示某段內存是否可用的標記,來判斷內存塊中哪一段是可用的。
步驟S207:將查找到的可用內存的地址返回給程序。
在本實施例中,優先從內存塊中的已分配並釋放的內存中查找可用內存,並且將請求的內存大小向上對齊,便於下次再申請小於預設值大小的內存時能夠快速命中此次申請並釋放後的內存,而無需重新分配。而且,在請求的內存大小在預設閾值以下時採用指數對齊、在預設閾值以上時以4Κ為單位線性對齊,既實現了對齊,又不會造成太多的資源浪費。
在本發明的其他實施例中,程序釋放內存時將釋放的內存回收到申請的內存塊中,將釋放的內存中的結構體中的標記改為可用狀態,下次再申請同樣大的內存時就會被再次使用。
在本發明的其他實施例中,程序運行當中可以定期整理申請的內存塊中因多次申請釋放而產生的內存碎片,使零碎的內存碎片連接成大塊的內存,以便下次申請大塊內存時能夠成功分配。
相應地,本發明實施例還提出一種內存管理裝置,如圖3所示,包括:
申請模塊301,用於當程序啟動時,為程序向系統申請預設容量的內存塊;
查找模塊302,用於根據程序中請求的內存大小從所述內存塊中查找可用內存;
輸出模塊303,用於輸出查找到的可用內存的地址。
優選地,查找模塊302用於:根據程序中請求的內存大小,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
優選地,查找模塊302包括:
判斷單元,用於判斷程序中請求的內存大小的值是否等於預設值;
處理單元,用於當程序中請求的內存大小的值不等於預設值時,將程序中請求的內存大小的值增大至等於預設值;
查找單元,用於根據增大後的內存大小的值,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
優選地,判斷單元用於:
判斷程序中請求的小於預設閾值的內存大小的值是否等於2的指數倍;以及
判斷程序中請求的大於預設閾值的內存大小的值是否等於4Κ的指數倍;
所述處理單元用於:
將程序中請求的小於預設閾值的內存大小的值增大至等於2的指數倍;以及
將程序中請求的大於預設閾值的內存大小的值增大至等於4K的整數倍。
作為上述技術方案的優選,所述裝置還包括:
回收模塊,用於將程序中釋放的內存回收至所述內存塊中。
作為上述技術方案的優選,所述裝置還包括:
內存碎片整理模塊,用於定期整理所述內存塊中的內存碎片。
本領域內的技術人員應明白,本發明實施例可提供為方法、系統、或電腦程式產品。因此,本發明實施例可採用完全硬體實現、完全軟體實現、或結合軟體和硬體方面的實現的形式。而且,本發明實施例可採用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限於磁碟存儲器和光學存儲器等)上實施的電腦程式產品的形式。
本發明實施例是參照方法、設備(系統)、和電腦程式產品的流程圖和/或方框圖來描述的。應理解可由電腦程式指令實現流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結合。可提供這些電腦程式指令到通用計算機、專用計算機、嵌入式處理機或其它可編程數據處理設備的處理器以產生一個機器,使得通過計算機或其它可編程數據處理設備的處理器執行的指令產生用於實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些電腦程式指令也可存儲在能引導計算機或其它可編程數據處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產生包括指令裝置的製造品,該指令裝置實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些電腦程式指令也可裝載到計算機或其它可編程數據處理設備上,使得在計算機或其它可編程設備上執行一系列操作步驟以產生計算機實現的處理,從而在計算機或其它可編程設備上執行的指令提供用於實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
顯然,本領域的技術人員可以對本發明實施例進行各種改動和變型而不脫離本發明實施例的精神和範圍。這樣,倘若本發明實施例的這些修改和變型屬於權利要求及其等同技術的範圍之內,則本發明實施例也意圖包含這些改動和變型在內。
權利要求
1.一種內存管理方法,其特徵在於,包括以下步驟: 當程序啟動時,為程序向系統申請預設容量的內存塊; 根據程序中請求的內存大小從所述內存塊中查找可用內存; 輸出查找到的可用內存的地址。
2.根據權利要求1所述的方法,其特徵在於,根據程序中請求的內存大小從所述內存塊中查找可用內存的步驟包括: 根據程序中請求的內存大小,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
3.根據權利要求2所述的方法,其特徵在於,根據程序中請求的內存大小從所述內存塊中查找可用內存的步驟包括: 判斷程序中請求的內存大小的值是否等於預設值; 當程序中請求的內存大小的值不等於預設值時,將程序中請求的內存大小的值增大至等於預設值; 根據增大後的內存大小的值,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
4.根據權利要求3所述的方法,其特徵在於,判斷程序中請求的內存大小的值是否等於預設值的步驟包括: 判斷程序中請求的小於預設閾值的內存大小的值是否等於2的指數倍;以及, 判斷程序中請求的大於預設閾值的內存大小的值是否等於4K的整數倍; 將程序中請求的內存大小的值增大至等於預設值的步驟包括: 將程序中請求的小於預設閾值的內存大小的值增大至等於2的指數倍;以及, 將程序中請求的大於預設閾值的內存大小的值增大至等於4K的整數倍。
5.根據權利要求1所述的方法,其特徵在於,所述方法還包括步驟: 將程序中釋放的內存回收至所述內存塊中。
6.根據權利要求1所述的方法,其特徵在於,所述方法還包括步驟: 定期整理所述內存塊中的內存碎片。
7.—種內存管理裝置,其特徵在於,包括: 申請模塊,用於當程序啟動時,為程序向系統申請預設容量的內存塊; 查找模塊,用於根據程序中請求的內存大小從所述內存塊中查找可用內存; 輸出模塊, 用於輸出查找到的可用內存的地址。
8.根據權利要求7所述的裝置,其特徵在於,所述查找模塊用於:根據程序中請求的內存大小,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
9.根據權利要求7所述的裝置,其特徵在於,所述查找模塊包括: 判斷單元,用於判斷程序中請求的內存大小的值是否等於預設值; 處理單元,用於當程序中請求的內存大小的值不等於預設值時,將程序中請求的內存大小的值增大至等於預設值; 查找單元,用於根據增大後的內存大小的值,優先從所述內存塊中的已分配並釋放的內存中查找可用內存。
10.根據權利要求9所述的裝置,其特徵在於,所述判斷單元用於:判斷程序中請求的小於預設閾值的內存大小的值是否等於2的指數倍;以及, 判斷程序中請求的大於預設閾值的內存大小的值是否等於4的指數倍; 所述處理單元用於: 將程序中請求的小於預設閾值的內存大小的值增大至等於2的指數倍;以及, 將程序中請求的大於預設閾值的內存大小的值增大至等於4K的整數倍。
11.根據權利要求7所述的裝置,其特徵在於,所述裝置還包括:回收模塊,用於將程序中釋放的內存回收至所述內存塊中。
12.根據權利要求7所述的裝置,其特徵在於,所述裝置還包括:內存碎片整理模塊,用於定期整理所述內 存塊中的內存碎片。
全文摘要
本發明公開了一種內存管理方法和裝置,其中,方法包括以下步驟當程序啟動時,為程序向系統申請預設容量的內存塊;根據程序中請求的內存大小從所述內存塊中查找可用內存;輸出查找到的可用內存的地址。本發明實施例中一次性向系統申請一塊足夠大的內存,在申請的足夠大的內存中管理程序中的申請和釋放內存,既解決了系統內存管理方面存在的缺陷,又能很好掌控程序在內存使用中的具體情況,便於調試程序。
文檔編號G06F12/02GK103150257SQ20131006452
公開日2013年6月12日 申請日期2013年2月28日 優先權日2013年2月28日
發明者羅應龍, 張新亮 申請人:天脈聚源(北京)傳媒科技有限公司