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