一種擴展進程中內存地址控制的方法
【技術領域】
[0001]本發明涉及計算機內存分配的方法、特別是一種擴展進程中內存地址控制的方法。
【背景技術】
[0002]目前32位X86架構中CPU、內存控制器、操作系統都是按32位地址總線設計。32位地址總線可以支持的內存地址代碼是4096MB,也就是有4GB的地址代碼。這4GB的地址碼在操作系統層面對應叫做4GB的虛擬地址空間。這4GB的地址空間正好可以分配給4GB內存。因此,因此一個在32位系統下運行的進程,最多只能使用4GB以下的內存。
[0003]在32位系統地址空間不足這種限制條件下。即便是在一臺擁有更高物理內存的電腦上(如8GB內存),一個進程也僅僅能申請出不到4GB的內存,這相當的不劃算。
[0004]雖然χ64架構的系統和電腦可以解決上述問題。但是在一些老的機器(如32位硬件的電腦)或是正在運營的軟件產品上做這種升級成本相當之高。
【發明內容】
[0005]為解決上述問題,本發明的目的在于提供一種能通過軟件的方式在32位系統使用4GB以上內存的擴展進程中內存地址控制的方法。
[0006]本發明解決其問題所采用的技術方案是:
一種擴展進程中內存地址控制的方法,包括主進程和由主進程創建的一個或以上的擴展進程,所述主進程包括原程序業務組件和第一擴展內存地址空間組件,所述第一擴展內存地址空間組件包括內存-進程映射模塊和主分配器模塊,所述擴展進程包括第二擴展內存地址空間組件和所擴展的內存地址空間,所述第二擴展內存地址空間組件包括內存-區塊映射模塊和次分配器模塊,所述擴展進程通過擴展進程ID號唯一進行識別,內存地址空間內的內存通過內存ID號進行識別,每一段獨立的內存對應一個獨立的內存ID號,所述主分配器模塊根據內存-進程映射模塊維護內存ID與擴展進程ID的關系,所述次分配器模塊通過內存-區塊映射模塊維護內存ID及其對應的內存區塊的關系。
[0007]進一步,主進程中的內存-進程映射模塊中維護了一個內存ID到擴展進程ID的映射表。其輸入為內存ID,其輸出為擴展進程的ID。
[0008]進一步,擴展進程中的內存-區塊映射模塊中維護了一個內存ID到區塊的映射表。其輸入為內存ID,其輸出為區塊信息。一個區塊信息由地址、大小這樣一個二兀組組成,所述區塊為內存ID對應的內存在本進程中地址空間的位置。
[0009]進一步,主進程中的主分配器模塊以管道方式與擴展進程中的次分配器模塊通訊,主分配器模塊和次分配器模塊配合完成內存分配、內存釋放、內存讀取、內存寫入4個不同功能的操作。
[0010]具體地,內存分配的步驟為,主分配器模塊接受業務邏輯發送過來的內存分配請求,并將請求的內存大小逐一發給各個擴展進程中的次分配器模塊,若擴展進程可以分配出內存,則主分配器模塊將內存ID,擴展進程ID的對應關系記錄到內存-進程映射表中,若所有擴展進程都無法分配出內存,則主分配器模塊將啟動一個全新的擴展進程,并將分配請求傳給這個全新的擴展進程的次分配器;接到主分配器發送過來的內存分配請求后:擴展進程中的次分配器模塊如果可以分配出足量的內存,則會給這個內存塊分配一個系統中的全局ID值,同時將內存ID、地址、大小記錄到本擴展進程的內存-區塊映射模塊中,最后將內存ID傳回給主分配器模塊,若擴展進程中的次分配器模塊無法分配出足量的內存,則會返回一個分配失敗的返回值給主分配器模塊。
[0011]具體地,內存釋放的步驟為:業務邏輯將需要釋放的內存ID發給主分配器模塊,主分配器模塊在內存-進程映射表中查找得到內存ID對應的擴展進程,主分配器模塊將內存ID發送給擴展進程ID所對應的次分配器模塊,次分配器模塊在內存-區塊映射模塊中查找內存ID所對應的具體區塊,即地址、大小這個二元組,刪除地址所對應的擴展內存地址空間的內存塊,并在內存-區域映射模塊中刪除內存ID及其所對應的區塊信息。
[0012]具體地,內存讀取的步驟為:業務邏輯將需要讀取的內存、偏移值、讀取大小發給主分配器模塊,主分配器模塊在內存-進程映射表中查找得到內存ID對應的擴展進程ID,主分配器模塊將內存ID、偏移值、讀取大小發送給擴展進程ID所對應的次分配器模塊,次分配器模塊在內存-區塊映射模塊中查找內存ID所對應的具體區塊,即地址、大小這個二元組,次分配器模塊將讀取擴展進程中實際地址為地址+偏移值大小為讀取大小的內存塊返回給主分配器模塊,主分配器模塊將所讀取的內存傳回給業務邏輯,完成讀取。
[0013]具體地,內存寫入的步驟為:業務邏輯將需要寫入的內存ID、偏移值、寫入數據發給主分配器模塊,主分配器模塊在內存-進程映射表中查找得到內存ID對應的擴展進程ID,主分配器模塊將內存ID、偏移值、寫入數據發送給擴展進程ID所對應的次分配器模塊,次分配器模塊在內存-區塊映射模塊中查找內存ID所對應的具體區塊,即地址、大小這個二元組,次分配器模塊將寫入數據寫入到擴展進程中實際地址為地址+偏移值的內存,完成寫入。
[0014]本發明的有益效果是:本發明采用的一種擴展進程中內存地址控制的方法,主進程通過主分配器模塊創建多個擴展進程,并由擴展進程中的次分配器模塊分配實際的內存。所有內存不通過內存地址標識,而是通過一個全局唯一的內存ID標識。其中內存ID、擴展進程、擴展進程內的內存區塊三者之間的關系則通過內存-進程映射模塊和內存-區域映射模塊來維護。如此一來,雖然32位環境下每個進程仍然只有4GB的地址空間。但是由于可以動態的增長多個進程,且內存ID不像內存地址一樣受到4GB地址空間的約束。因此可以不受限制的最大化物理內存的使用。
[0015]本發明在無需升級機器硬件和系統的前提下,僅通過改進軟件即可充分的利用電腦的物理內存。且本方法通過擴展進程方式實現,使得單個進程所使用的物理內存總量沒有上限。即便是在64位系統中,運用此方法的系統仍然可以正常運行。即通過此方法擴展內存不會產生兼容性問題。同時此方法的系統也能擴展64位系統的內存最大使用量。
【附圖說明】
[0016]下面結合附圖和實例對本發明作進一步說明。
[0017]圖1是本發明中主進程和擴展進程的示意圖; 圖2是本發明內存-進程映射模塊的示意圖;
圖3是本發明內存-區域映射模塊的示意圖;
圖4是本發明內存分配的流程圖;
圖5是本發明內存釋放過程的流程圖;
圖6是本發明內存讀取過程的流程圖;
圖7是本發明內存寫入過程的流程圖。
【具體實施方式】
[0018]參照圖1-圖3,本發明的一種擴展進程中內存地址控制的方法,包括主進程和由主進程創建的一個或以上的擴展進程,所述主進程包括原程序業務組件和第一擴展內存地址空間組件,所述第一擴展內存地址空間組件包括內存-進程映射模塊和主分配器模塊,所述擴展進程包括第二擴展內存地址空間組件和所擴展的內存地址空間,所述第二擴展內存地址空間組件包括內存-區塊映射模塊和次分配器模塊,所述擴展進程通過擴展進程ID號唯一進行識別,內存地址空間內的內存通過內存ID號進行識別,每一段獨立的內存對應一個獨立的內存ID號,所述主分配器模塊根據內存-進程映射模塊維護內存ID與擴展進程ID的關系,所述次分配器模塊通過內存-區塊映射模塊維護內存ID及其對應的內存區塊的關系。
[0019]參照圖2所示,主進程中的內存-進程映射模塊中維護了一個內存ID到擴展進程ID的映射表。其輸入為內存ID,其輸出為擴展進程的I