專(zhuān)利名稱(chēng):高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種內(nèi)存資源管理調(diào)度方法,具體來(lái)說(shuō)涉及一種高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法。
背景技術(shù):
由于大多數(shù)大型的實(shí)時(shí)/歷史數(shù)據(jù)庫(kù)系統(tǒng)都開(kāi)發(fā)于20世紀(jì)80年代,當(dāng)時(shí)多線(xiàn)程技術(shù)剛剛處于探討研發(fā)階段、多核并行技術(shù)和大容量物理內(nèi)存技術(shù)也尚未萌芽。從而導(dǎo)致目前主流的實(shí)時(shí)/歷史數(shù)據(jù)庫(kù)系統(tǒng)并未能充分適應(yīng)現(xiàn)代硬件多核和高內(nèi)存容量工業(yè)級(jí)服務(wù)器,也就是通常不能期望通過(guò)新增硬件資源來(lái)或者線(xiàn)性的可擴(kuò)展性。然而到如今,從計(jì)算機(jī)硬軟件到編程技術(shù)領(lǐng)域都在飛速發(fā)展,計(jì)算機(jī)領(lǐng)域的多核技術(shù)、多節(jié)點(diǎn)高速物理內(nèi)存技術(shù)都已經(jīng)成為成熟穩(wěn)定的并行技術(shù)支撐。受傳統(tǒng)單處理器和低容量物理內(nèi)存開(kāi)發(fā)模型的影響,目前主流的實(shí)時(shí)/歷史數(shù)據(jù)庫(kù)軟件并未最大限度地發(fā)揮現(xiàn)代工業(yè)級(jí)服務(wù)器的設(shè)備優(yōu)勢(shì)。主要體現(xiàn)在a、大部分軟件系統(tǒng)還采用多個(gè)物理處理器串行共享一個(gè)全局物理內(nèi)存資源的分配回收模型;b、大部分軟件系統(tǒng)雖然采用了內(nèi)存池等技術(shù),但是還存在著“假共享” 而導(dǎo)致性能不高,而“假共享”的分析和定位往往具有非常高的復(fù)雜度;C、大部分軟件系統(tǒng)并未對(duì)線(xiàn)程的調(diào)度策略做可預(yù)見(jiàn)性?xún)?yōu)化,因此導(dǎo)致現(xiàn)成上下文切換過(guò)于頻繁而影響了處理器層級(jí)的代碼執(zhí)行優(yōu)化策略;一個(gè)典型的傳統(tǒng)實(shí)時(shí)/歷史數(shù)據(jù)庫(kù)系統(tǒng)的內(nèi)存資源管理調(diào)度模型如附圖1所示,從圖中可以看出傳統(tǒng)的模型中多線(xiàn)程可以很好地運(yùn)行起來(lái),但是當(dāng)運(yùn)行在多核處理器上面多個(gè)線(xiàn)程同時(shí)提出并發(fā)的內(nèi)存資源請(qǐng)求時(shí),他們又必須被串行化,加鎖互斥以達(dá)到多線(xiàn)程安全性。無(wú)論物理的內(nèi)存和處理器資源升級(jí)或者發(fā)展到什么程度,這都將成為高性能并發(fā)實(shí)時(shí)應(yīng)用系統(tǒng)的缺陷和障礙?,F(xiàn)有技術(shù)的缺點(diǎn)主要體現(xiàn)在A.內(nèi)存分配是串行的,無(wú)法充分發(fā)揮現(xiàn)代多核處理器服務(wù)器的并行優(yōu)勢(shì);B.現(xiàn)有技術(shù)容易造成“假共享”,也就是說(shuō)表面上看數(shù)據(jù)是共享于多個(gè)物理處理器之間,但是實(shí)際上引入了非常嚴(yán)重的數(shù)據(jù)同步開(kāi)銷(xiāo),得不償失;如附圖2所示,現(xiàn)在主流的內(nèi)存管理模型中,一般都存在著這樣的問(wèn)題當(dāng)三個(gè)獨(dú)立的線(xiàn)程來(lái)申請(qǐng)內(nèi)存,由于真正執(zhí)行的動(dòng)作是串行化的,因此“地址一”、“地址二”和“地址三”將分別被分派給三個(gè)不同的線(xiàn)程。但是由于這三個(gè)地址和數(shù)據(jù)內(nèi)容都位于CPU(處理器)的同一個(gè)Cache Line范圍內(nèi), 后續(xù)當(dāng)任何一個(gè)線(xiàn)程對(duì)其所得到的地址空間內(nèi)進(jìn)行數(shù)據(jù)操作時(shí),操作系統(tǒng)和CPU的緩存協(xié)議都會(huì)強(qiáng)制性地發(fā)起一次數(shù)據(jù)同步操作,即這個(gè)Cache Line地址范圍內(nèi)的所有數(shù)據(jù)同步到其它CPU的緩存地址空間。即使當(dāng)前線(xiàn)程只修改或者操作了自己地址空間內(nèi)的數(shù)據(jù)內(nèi)容, 操作系統(tǒng)和CPU的緩存協(xié)議都會(huì)做數(shù)據(jù)同步的操作,因此帶來(lái)了額外的負(fù)擔(dān),而這種數(shù)據(jù)同步將極大地占用CPU內(nèi)部的數(shù)據(jù)總線(xiàn)。從這個(gè)微觀的角度講,在現(xiàn)行的內(nèi)存管理調(diào)度模型下,如果應(yīng)用系統(tǒng)中存在著頻繁的細(xì)粒度內(nèi)存申請(qǐng)和釋放,系統(tǒng)的CPU擴(kuò)展得越多,反而會(huì)導(dǎo)致內(nèi)存的使用性能降低;C.容易造成“內(nèi)存碎片”;
D.互斥的粒度很大,造成分配的效率低下。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,該方法解決了在現(xiàn)代多核高端商務(wù)服務(wù)器上并發(fā)內(nèi)存資源調(diào)度瓶頸的問(wèn)題,使得傳統(tǒng)應(yīng)用系統(tǒng)在無(wú)需任何代碼改變的前提下,充分發(fā)掘現(xiàn)代計(jì)算機(jī)的硬件資源潛力,大幅提升軟件系統(tǒng)的實(shí)時(shí)運(yùn)行效率。本發(fā)明的目的可通過(guò)以下的技術(shù)措施來(lái)實(shí)現(xiàn)一種高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,包括初始化步驟,內(nèi)存管理模塊分配指定數(shù)量的內(nèi)存作為管理堆,并將這些內(nèi)存劃分成多個(gè)內(nèi)存塊,再以雙向鏈表的方式將這些內(nèi)存塊組織起來(lái),作為空閑內(nèi)存塊鏈表;同時(shí), 配置一個(gè)空的雙向鏈表,作為已分配內(nèi)存塊鏈表;內(nèi)存管理模塊建立一個(gè)映射模塊用于管理局部堆與線(xiàn)程之間的對(duì)應(yīng)關(guān)系;內(nèi)存管理步驟,當(dāng)一個(gè)有動(dòng)態(tài)內(nèi)存管理需求的線(xiàn)程加入到內(nèi)存管理模塊后,映射模塊負(fù)責(zé)為當(dāng)前線(xiàn)程創(chuàng)建一個(gè)局部堆并維護(hù)這個(gè)局部堆和當(dāng)前線(xiàn)程的對(duì)應(yīng)關(guān)系;這個(gè)局部堆創(chuàng)建成功以后,從管理堆的空閑內(nèi)存塊鏈表中申請(qǐng)一定數(shù)量的內(nèi)存塊作為局部堆的內(nèi)存,將這些內(nèi)存塊從空閑內(nèi)存塊鏈表中移出的同時(shí)加入到已分配內(nèi)存塊鏈表中;所述局部堆用于在線(xiàn)程的生命周期內(nèi)負(fù)責(zé)處理當(dāng)前線(xiàn)程的所有動(dòng)態(tài)內(nèi)存請(qǐng)求;動(dòng)態(tài)內(nèi)存分配步驟,如果局部堆中的內(nèi)存足以滿(mǎn)足當(dāng)前線(xiàn)程申請(qǐng)的需求內(nèi)存時(shí), 直接在該局部堆內(nèi)處理該線(xiàn)程的業(yè)務(wù)邏輯;否則,局部堆將從管理堆的空閑內(nèi)存塊鏈表中申請(qǐng)一定數(shù)量的內(nèi)存塊并追加到當(dāng)前局部堆中,在將這些內(nèi)存塊從空閑內(nèi)存塊鏈表中移出的同時(shí)加入到已分配內(nèi)存塊鏈表中,再繼續(xù)處理該線(xiàn)程的業(yè)務(wù)邏輯;歸還動(dòng)態(tài)內(nèi)存步驟,處理完當(dāng)前線(xiàn)程的業(yè)務(wù)邏輯后,歸還當(dāng)前線(xiàn)程的內(nèi)存并結(jié)束當(dāng)前線(xiàn)程。所述作為管理堆的內(nèi)存的具體數(shù)量由內(nèi)存管理模塊根據(jù)應(yīng)用程序的總內(nèi)存需求進(jìn)行相應(yīng)配置。所述的每個(gè)內(nèi)存塊的大小為默認(rèn)的系統(tǒng)頁(yè)面大小。所述默認(rèn)的系統(tǒng)頁(yè)面大小為4096字節(jié)或者以每一個(gè)不同的操作系統(tǒng)的API接口
查詢(xún)獲得。所述映射模塊為哈希表形式的映射表,并采用以樹(shù)為內(nèi)部數(shù)據(jù)結(jié)構(gòu)的圖(map)來(lái)管理維護(hù)該映射關(guān)系。所述動(dòng)態(tài)內(nèi)存請(qǐng)求包括分配、釋放和動(dòng)態(tài)擴(kuò)充。所述動(dòng)態(tài)內(nèi)存請(qǐng)求還包括需求量超過(guò)一個(gè)線(xiàn)程棧的當(dāng)前容量的內(nèi)存請(qǐng)求。所述歸還當(dāng)前線(xiàn)程的內(nèi)存的過(guò)程是判斷當(dāng)前線(xiàn)程是否有歸還動(dòng)態(tài)內(nèi)存的需求, 如果無(wú),則不進(jìn)行任何操作;否則,根據(jù)配置再判斷是否需要回收局部堆,如果是,則首先歸還內(nèi)存到局部堆,最后再將該局部堆對(duì)應(yīng)的內(nèi)存塊回收到管理堆的空閑內(nèi)存塊鏈表中,以備其它局部堆申請(qǐng)內(nèi)存塊時(shí)重復(fù)利用這些內(nèi)存塊;否則,首先歸還當(dāng)前局部堆的全部?jī)?nèi)存到管理堆的空閑內(nèi)存塊鏈表中,然后銷(xiāo)毀該局部堆。本發(fā)明對(duì)比現(xiàn)有技術(shù),有如下優(yōu)點(diǎn)
1、本發(fā)明將不僅徹底解決上述傳統(tǒng)應(yīng)用模型的局限性,而且還將新模型和調(diào)度策略有機(jī)地結(jié)合起來(lái),達(dá)到硬件平臺(tái)資源利用調(diào)度最優(yōu)化。相比傳統(tǒng)的應(yīng)用模型,在同樣的硬件環(huán)境中軟件的處理能力將提供3-5倍以上。徹底解決了現(xiàn)代高端商務(wù)服務(wù)器應(yīng)用中內(nèi)存資源管理中分配釋放速度、擴(kuò)展性、并行效率和利用率等四個(gè)方面的問(wèn)題。從而提高現(xiàn)代高端商務(wù)服務(wù)器應(yīng)用中內(nèi)存資源管理中分配釋放速度、擴(kuò)展性、并行效率和利用率等四個(gè)方面性能。2、本發(fā)明首先將串行化的分配行為轉(zhuǎn)化為并行化處理模型,這樣極大地提升了多個(gè)處理器同時(shí)申請(qǐng)內(nèi)存資源時(shí)的性能。其實(shí)是巧妙地引入了“管理堆”和“局部堆”以及物理層的三層架構(gòu)設(shè)計(jì),在設(shè)計(jì)上將“假共享”的概率降到了最低甚至徹底避免了 “假共享”。 再者本發(fā)明在“局部堆”中創(chuàng)新性地加入了各個(gè)粒度級(jí)別的“環(huán)形緩沖隊(duì)列”,使得分配的針對(duì)性得到了進(jìn)一步的加強(qiáng),因此客觀上很好地避免了 “內(nèi)存碎片”問(wèn)題。最后,由于后續(xù)的分配操作大多數(shù)情況下都在“局部堆”完成,將現(xiàn)有技術(shù)中全局互斥的重粒度鎖轉(zhuǎn)換為無(wú)鎖操作,大大地提升了分配效率。3、本發(fā)明不僅僅從架構(gòu)設(shè)計(jì)上最大限度地現(xiàn)在多核高端商務(wù)服務(wù)器應(yīng)用中的內(nèi)存分配調(diào)度瓶頸,讓多個(gè)并發(fā)運(yùn)行的線(xiàn)程對(duì)內(nèi)存的申請(qǐng)和釋放最大限度的并行化。更重要的是,在全局堆的設(shè)計(jì)中,我們將對(duì)局部堆中所管理的內(nèi)存作進(jìn)一步的優(yōu)化和調(diào)度管理,最大限度都杜絕了 “假共享”所帶來(lái)的性能問(wèn)題。正是因?yàn)楸景l(fā)明很好地將一個(gè)串行的粗粒度鎖模型巧妙地轉(zhuǎn)化為接近于無(wú)鎖的實(shí)時(shí)并行模型,在性能上將得到非常大的提升。應(yīng)用系統(tǒng)在進(jìn)行硬件資源擴(kuò)展時(shí),基本可以得到和資源成正比的性能提升,因此系統(tǒng)的可擴(kuò)展性變得十分強(qiáng)大,具體的各個(gè)細(xì)節(jié)設(shè)計(jì)的有點(diǎn)將在下面各個(gè)環(huán)節(jié)的闡述中仔細(xì)說(shuō)明。4、本發(fā)明方法可應(yīng)用于任何有動(dòng)態(tài)內(nèi)存管理需求同時(shí)硬件環(huán)境為多核的軟件系統(tǒng)中,應(yīng)用范圍廣泛。
圖1是本發(fā)明的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法的系統(tǒng)調(diào)度示意圖;圖2是圖1所示高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法中局部堆的結(jié)構(gòu)示意圖;圖3是圖1所示高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法的流程圖。
具體實(shí)施例方式圖1示出了本發(fā)明的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法的總體邏輯架構(gòu)為三層架構(gòu)物理內(nèi)存、管理堆和局部堆。直接構(gòu)設(shè)于物理內(nèi)存上面的是管理堆(全局堆),它負(fù)責(zé)直接和操作系統(tǒng)的物理存儲(chǔ)之間交互分配、釋放和調(diào)整。如圖1所示,本發(fā)明的實(shí)時(shí)內(nèi)存資源管理調(diào)度模型技術(shù)主要由三部分組成線(xiàn)程模塊(100)、內(nèi)存管理模塊000),其中包含管理堆(210)和映射模塊020),映射模塊 (220)主要是維護(hù)線(xiàn)程編號(hào)到每一個(gè)線(xiàn)程的局部堆的對(duì)應(yīng)關(guān)系,所以其中包含一個(gè)或者多個(gè)局部堆(221),具體包含多少個(gè)局部堆取決于實(shí)際運(yùn)行的線(xiàn)程數(shù)目,最后一個(gè)是物理內(nèi)存模塊(300)??蛻?hù)端線(xiàn)程(100)也可以有一個(gè)或者多個(gè),具體的數(shù)目也是取決于實(shí)際的應(yīng)用情況。本方法的處理過(guò)程如下
步驟一初始化步驟初始化步驟,內(nèi)存管理模塊(200)根據(jù)配置的參數(shù)從操作系統(tǒng)中申請(qǐng)獲得所需的物理內(nèi)存作為管理堆,指定管理堆的基本的配置參數(shù),例如管理堆管理內(nèi)存的總量、最大的線(xiàn)程數(shù)目、每一個(gè)局部堆可以管理的最大內(nèi)存數(shù)目、每一個(gè)局部堆歸還內(nèi)存的閥值等一系列的參數(shù)。并將管理堆的這些內(nèi)存劃分成多個(gè)內(nèi)存塊,再以雙向鏈表的方式將這些內(nèi)存塊組織起來(lái),作為空閑內(nèi)存塊鏈表;同時(shí),配置一個(gè)空的雙向鏈表作為已分配內(nèi)存塊鏈表;內(nèi)存管理模塊建立一個(gè)映射模塊用于管理線(xiàn)程與后面處理過(guò)程中生成的局部堆之間的對(duì)應(yīng)關(guān)系;所述的每個(gè)內(nèi)存塊的大小為默認(rèn)的系統(tǒng)頁(yè)面大小4096字節(jié)或者以每一個(gè)不同的操作系統(tǒng)的API接口查詢(xún)獲得。管理堆的內(nèi)存的具體數(shù)量由內(nèi)存管理模塊根據(jù)應(yīng)用程序的總內(nèi)存需求進(jìn)行相應(yīng)配置。映射模塊為哈希表形式的映射表,并采用以樹(shù)為內(nèi)部數(shù)據(jù)結(jié)構(gòu)的圖(map)來(lái)管理維護(hù)該映射關(guān)系。初始化步驟中將所有的內(nèi)存塊組織起來(lái)的雙向鏈表為空閑內(nèi)存塊鏈表,同時(shí)管理堆還將建立一個(gè)已分配內(nèi)存塊鏈表,用于管理已經(jīng)能夠分配給局部堆的內(nèi)存塊,初始化的時(shí)候這個(gè)已分配內(nèi)存塊鏈表為空。在管理堆初始化完成后,內(nèi)存管理模塊(200)將建立一個(gè)映射模塊(220)用于管理局部堆與線(xiàn)程之間的對(duì)應(yīng)關(guān)系,映射模塊(220)還隨著線(xiàn)程的不斷加入而產(chǎn)生變化;這里的雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始,都可以很方便地訪(fǎng)問(wèn)它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn),上述的內(nèi)存塊就是這個(gè)雙向鏈表中的節(jié)點(diǎn)。步驟二 內(nèi)存管理步驟應(yīng)用程序啟動(dòng),創(chuàng)建一個(gè)或者多個(gè)工作線(xiàn)程(100)。因此,接下來(lái)如圖3所示,對(duì)一個(gè)線(xiàn)程進(jìn)行內(nèi)存實(shí)時(shí)調(diào)度的過(guò)程首先,判斷當(dāng)前線(xiàn)程是否有動(dòng)態(tài)內(nèi)存管理的需求,如果沒(méi)有則不在本發(fā)明考慮范圍,直接結(jié)束動(dòng)態(tài)調(diào)度過(guò)程。當(dāng)一個(gè)有動(dòng)態(tài)內(nèi)存管理需求的線(xiàn)程加入到內(nèi)存管理模塊后,映射模塊負(fù)責(zé)為當(dāng)前線(xiàn)程創(chuàng)建一個(gè)局部堆并維護(hù)這個(gè)局部堆和當(dāng)前線(xiàn)程的對(duì)應(yīng)關(guān)系;這個(gè)局部堆創(chuàng)建成功以后,從管理堆的空閑內(nèi)存塊鏈表中申請(qǐng)一定數(shù)量的內(nèi)存塊作為局部堆的內(nèi)存,將這些內(nèi)存塊從空閑內(nèi)存塊鏈表中移出的同時(shí)加入到已分配內(nèi)存塊鏈表中;局部堆用于在線(xiàn)程的生命周期內(nèi)負(fù)責(zé)處理當(dāng)前線(xiàn)程的所有動(dòng)態(tài)內(nèi)存請(qǐng)求;動(dòng)態(tài)內(nèi)存請(qǐng)求包括分配、釋放、動(dòng)態(tài)擴(kuò)充, 以及,需求量超過(guò)一個(gè)線(xiàn)程棧的當(dāng)前容量的內(nèi)存請(qǐng)求。對(duì)于有動(dòng)態(tài)內(nèi)存管理需求的每一個(gè)線(xiàn)程在運(yùn)行起來(lái)以后,第一次向內(nèi)存資源管理調(diào)度模型的實(shí)例申請(qǐng)內(nèi)存的時(shí)候,內(nèi)存管理模塊(200)模塊會(huì)為當(dāng)前線(xiàn)程(100)創(chuàng)建一個(gè)局部堆,并建立當(dāng)前線(xiàn)程編號(hào)到該線(xiàn)程對(duì)應(yīng)的局部堆的映射關(guān)系。通常這個(gè)映射關(guān)系是一個(gè)哈希表,實(shí)際實(shí)施的過(guò)程中,也可以選擇以樹(shù)為內(nèi)部數(shù)據(jù)結(jié)構(gòu)的map來(lái)管理維護(hù)這個(gè)映射關(guān)系。步驟三動(dòng)態(tài)內(nèi)存分配步驟動(dòng)態(tài)內(nèi)存分配步驟,如果局部堆中的內(nèi)存足以滿(mǎn)足當(dāng)前線(xiàn)程申請(qǐng)的需求內(nèi)存時(shí), 直接在該局部堆內(nèi)處理該線(xiàn)程的業(yè)務(wù)邏輯;否則,局部堆將從管理堆的空閑內(nèi)存塊鏈表中申請(qǐng)一定數(shù)量的內(nèi)存塊并追加到當(dāng)前局部堆中,在將這些內(nèi)存塊從空閑內(nèi)存塊鏈表中移出
6的同時(shí)加入到已分配內(nèi)存塊鏈表中,再繼續(xù)處理該線(xiàn)程的業(yè)務(wù)邏輯;當(dāng)局部堆內(nèi)可用的內(nèi)存不足以滿(mǎn)足當(dāng)前線(xiàn)程申請(qǐng)的需求內(nèi)存的時(shí)候,則線(xiàn)程再?gòu)墓芾矶焉暾?qǐng)一個(gè)管理塊添加到當(dāng)前局部堆中,再繼續(xù)處理該線(xiàn)程的業(yè)務(wù)邏輯;否則直接在該局部堆內(nèi)處理該線(xiàn)程的業(yè)務(wù)邏輯;該局部堆(221)為當(dāng)前線(xiàn)程(100)提供內(nèi)存服務(wù),所謂的提供內(nèi)存服務(wù)包含三個(gè)細(xì)分的步驟a、判斷局部堆021)內(nèi)是否有足夠的內(nèi)存可以滿(mǎn)足內(nèi)存申請(qǐng)的需求,如果有足夠的空閑內(nèi)存空間,則直接返回給申請(qǐng)端;b、如果局部堆(221) 空閑的內(nèi)存不足以滿(mǎn)足請(qǐng)求,局部堆(221)會(huì)從管理堆(210)去申請(qǐng)額外的內(nèi)存塊來(lái)滿(mǎn)足申請(qǐng)的需求;C、最后以滿(mǎn)足申請(qǐng)需求的結(jié)果結(jié)束此次內(nèi)存服務(wù)動(dòng)作。接著,處理該線(xiàn)程(100)的業(yè)務(wù)邏輯,不同的線(xiàn)程的業(yè)務(wù)邏輯是不同的,在實(shí)時(shí)/ 歷史數(shù)據(jù)庫(kù)系統(tǒng)中,主要包含網(wǎng)絡(luò)處理線(xiàn)程、實(shí)時(shí)數(shù)據(jù)處理線(xiàn)程、歷史數(shù)據(jù)處理線(xiàn)程、壓縮線(xiàn)程等幾個(gè)種類(lèi)。步驟四歸還動(dòng)態(tài)內(nèi)存步驟歸還動(dòng)態(tài)內(nèi)存步驟,處理完當(dāng)前線(xiàn)程的業(yè)務(wù)邏輯后,歸還當(dāng)前線(xiàn)程的內(nèi)存并結(jié)束當(dāng)前線(xiàn)程。歸還當(dāng)前線(xiàn)程的內(nèi)存的過(guò)程是判斷當(dāng)前線(xiàn)程是否有歸還動(dòng)態(tài)內(nèi)存的需求,如果無(wú),則不進(jìn)行任何操作;否則,根據(jù)配置再判斷是否需要回收局部堆,如果是,則首先歸還內(nèi)存到局部堆,最后再將該局部堆對(duì)應(yīng)的內(nèi)存塊回收到管理堆的空閑內(nèi)存塊鏈表中,以備其它局部堆申請(qǐng)內(nèi)存塊時(shí)重復(fù)利用這些內(nèi)存塊;否則,首先歸還當(dāng)前局部堆的全部?jī)?nèi)存到管理堆的空閑內(nèi)存塊鏈表中,然后銷(xiāo)毀該局部堆。因?yàn)檫@里所述的內(nèi)存是從局部堆申請(qǐng)得到的,這里的歸還是和申請(qǐng)對(duì)應(yīng)的,從局部堆申請(qǐng)得到的內(nèi)存在使用完成后,需要先歸還給局部堆,再將局部堆歸還給管理堆。處理完當(dāng)前線(xiàn)程的業(yè)務(wù)邏輯后,歸還當(dāng)前線(xiàn)程的內(nèi)存并結(jié)束當(dāng)前線(xiàn)程,具體操作過(guò)程是 在處理完業(yè)務(wù)邏輯之后,判斷當(dāng)前線(xiàn)程是否有歸還動(dòng)態(tài)內(nèi)存的需求,如果無(wú),則直接結(jié)束本線(xiàn)程。 如果有內(nèi)存歸還的需求而且管理堆O01)配置回收局部堆021),那么就會(huì)首先歸還內(nèi)存到局部堆021),最后再回收局部堆到全局堆的管理中。 如果有內(nèi)存歸還的需求而管理堆(210)不回收局部堆021),那么管理堆(201) 會(huì)首先歸還該局部堆021)的全部?jī)?nèi)存到管理堆010),然后刪除該局部堆的實(shí)例。 當(dāng)前工作線(xiàn)程(100)結(jié)束。如圖2所示,在管理堆(210)中設(shè)計(jì)了基于Cache Line大小對(duì)齊的“管理塊內(nèi)存”, 每一個(gè)局部堆(221)對(duì)應(yīng)其中一個(gè)或者多個(gè)“管理塊內(nèi)存”,杜絕了“假共享”導(dǎo)致的性能影響,即充分發(fā)掘了 CPU的緩存優(yōu)勢(shì)又帶來(lái)了靈活的可擴(kuò)展性,很好地避免了不必要的數(shù)據(jù)同步帶來(lái)的數(shù)據(jù)總線(xiàn)浪費(fèi)和指令周期?,F(xiàn)在主流的內(nèi)存管理模型中,一般都存在著這樣的問(wèn)題當(dāng)三個(gè)獨(dú)立的線(xiàn)程來(lái)申請(qǐng)內(nèi)存,由于真正執(zhí)行的動(dòng)作是串行化的,因此分派給三個(gè)不同的線(xiàn)程的內(nèi)存地址一般是連續(xù)的,并且位于CPU(處理器)的同一個(gè)Cache Line范圍內(nèi)。 因而后續(xù)當(dāng)任何一個(gè)線(xiàn)程對(duì)其所得到的地址空間內(nèi)進(jìn)行數(shù)據(jù)操作時(shí),操作系統(tǒng)和CPU的緩存協(xié)議都會(huì)強(qiáng)制性地發(fā)起一次數(shù)據(jù)同步操作,即這個(gè)Cache Line地址范圍內(nèi)的所有數(shù)據(jù)同步到其它CPU的緩存地址空間。即使當(dāng)前線(xiàn)程只修改或者操作了自己地址空間內(nèi)的數(shù)據(jù)內(nèi)容,操作系統(tǒng)和CPU的緩存協(xié)議都會(huì)做數(shù)據(jù)同步的操作,因此帶來(lái)了額外的負(fù)擔(dān),而這種數(shù)據(jù)同步將極大地占用CPU內(nèi)部的數(shù)據(jù)總線(xiàn)。從這個(gè)微觀的角度講,在現(xiàn)行的內(nèi)存管理調(diào)度模型下,如果應(yīng)用系統(tǒng)中存在著頻繁的細(xì)粒度內(nèi)存申請(qǐng)和釋放,系統(tǒng)的CPU擴(kuò)展得越多,反而會(huì)導(dǎo)致內(nèi)存的使用性能降低。本發(fā)明中局部堆(221)所管理維護(hù)的所有內(nèi)存地址,其對(duì)應(yīng)的Cache Line都不會(huì)被其它線(xiàn)程共享,管理堆在創(chuàng)建局部堆Q21)并為每ー個(gè)局部堆 (221)分派空閑內(nèi)存塊的時(shí)候,就是已CPU默認(rèn)Cache Line大小為內(nèi)存塊的分配粒度的,因此可以很好地保證ー個(gè)Cache Line地址對(duì)應(yīng)的內(nèi)存塊不會(huì)被其它線(xiàn)程所共享而進(jìn)一歩引起“假共享”,當(dāng)然ー個(gè)局部堆021)是可以對(duì)應(yīng)多個(gè)Cache Line的內(nèi)存空間的。如圖3所示,在采用本發(fā)明的高并行實(shí)時(shí)內(nèi)存資源管理調(diào)度之后,對(duì)于有動(dòng)態(tài)內(nèi)存服務(wù)需求的線(xiàn)程,在進(jìn)入線(xiàn)程時(shí)會(huì)首先向管理堆(210)注冊(cè)以獲得ー個(gè)局部堆021)對(duì)象,局部堆021)對(duì)象會(huì)在線(xiàn)程的生命周期內(nèi)負(fù)責(zé)處理該線(xiàn)程的所有動(dòng)態(tài)內(nèi)存請(qǐng)求。當(dāng)然這里指的“有動(dòng)態(tài)內(nèi)存服務(wù)需求”是指廣義的,和傳統(tǒng)的從操作系統(tǒng)去申請(qǐng)內(nèi)存是兩個(gè)不同的概念,只要任何有內(nèi)存需求而需求量又超過(guò)ー個(gè)線(xiàn)程棧的當(dāng)前容量吋,我們都可以認(rèn)為 “有動(dòng)態(tài)內(nèi)存服務(wù)需求”。在獲得局部堆021)對(duì)象后,線(xiàn)程內(nèi)便可以靈活地獲得或者釋放內(nèi)存,在申請(qǐng)內(nèi)存的事情,只有當(dāng)局部堆021)內(nèi)可用的內(nèi)存不足以滿(mǎn)足申請(qǐng)的需求的時(shí)候,局部堆(221)才會(huì)向管理堆OlO)申請(qǐng)ー個(gè)管理塊。因此在絕大多數(shù)的情況下,局部堆 (221)進(jìn)行的都是無(wú)鎖的內(nèi)存申請(qǐng)和釋放,效率非常高。不僅如此,在同一個(gè)局部堆(221) 內(nèi),由于所使用的內(nèi)存都是從管理堆(210)分配的管理塊,每ー個(gè)局部堆021)的內(nèi)存塊不會(huì)和其它線(xiàn)程共享ー個(gè)Cache Line內(nèi)的內(nèi)存地址空間,因此在進(jìn)行數(shù)據(jù)讀寫(xiě)操作吋,將進(jìn)一歩避免了數(shù)據(jù)同步的負(fù)擔(dān)。綜合上述兩方面的優(yōu)勢(shì),本發(fā)明的內(nèi)存分配調(diào)度策略將獲得非常高效的速度和穩(wěn)定性?xún)?yōu)勢(shì)。単一的管理堆和操作系統(tǒng)物理內(nèi)存之間的申請(qǐng)和釋放是串行的,效率比較低下。 本發(fā)明在此基礎(chǔ)上再引入了管理堆,因此保證在應(yīng)用程序運(yùn)行時(shí)內(nèi)存的申請(qǐng)和釋放都是高效的并行操作,因?yàn)閼?yīng)用程序的各個(gè)線(xiàn)程都是直接和各自對(duì)應(yīng)的局部堆交互,進(jìn)行申請(qǐng)和釋放。另外ー種情況是應(yīng)用程序?qū)崟r(shí)運(yùn)行的過(guò)程中發(fā)現(xiàn)管理堆預(yù)分配的空閑內(nèi)存塊已經(jīng)不足以滿(mǎn)足局部堆請(qǐng)求的時(shí)候,需要進(jìn)行串行化的內(nèi)存操作,但是這種情況一般可通過(guò)合理的優(yōu)化配置進(jìn)行避免或者將發(fā)生概率降低到最低與此同吋,在每ー個(gè)局部堆里面,維護(hù)可定制的初始化頁(yè)面數(shù)量、已分配的頁(yè)面數(shù)量和可用的頁(yè)面數(shù)量等信息,每ー個(gè)線(xiàn)程在運(yùn)行態(tài)的請(qǐng)求和釋放一般都是無(wú)鎖的高效請(qǐng)求。只有當(dāng)線(xiàn)程對(duì)應(yīng)的局部堆可用內(nèi)存不足或者空閑頁(yè)面過(guò)多時(shí),才會(huì)向管理堆發(fā)起申請(qǐng)請(qǐng)求或者釋放的請(qǐng)求。根據(jù)實(shí)際場(chǎng)景和統(tǒng)計(jì)經(jīng)驗(yàn),大多數(shù)情況下可以將各個(gè)局部堆的參數(shù)設(shè)置得較為優(yōu)化,從而保證運(yùn)行期間向管理堆提出串行請(qǐng)求的幾率大大降低甚至徹底屏蔽。本發(fā)明的實(shí)施方式不限于此,在本發(fā)明上述基本技術(shù)思想前提下,按照本領(lǐng)域的普通技術(shù)知識(shí)和慣用手段對(duì)本發(fā)明內(nèi)容所做出其它多種形式的修改、替換或變更,均落在本發(fā)明權(quán)利保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于包括以下步驟初始化步驟,內(nèi)存管理模塊分配指定數(shù)量的內(nèi)存作為管理堆,并將這些內(nèi)存劃分成多個(gè)內(nèi)存塊,再以雙向鏈表的方式將這些內(nèi)存塊組織起來(lái),作為空閑內(nèi)存塊鏈表;同時(shí),配置一個(gè)空的雙向鏈表,作為已分配內(nèi)存塊鏈表;內(nèi)存管理模塊建立一個(gè)映射模塊用于管理局部堆與線(xiàn)程之間的對(duì)應(yīng)關(guān)系;內(nèi)存管理步驟,當(dāng)一個(gè)有動(dòng)態(tài)內(nèi)存管理需求的線(xiàn)程加入到內(nèi)存管理模塊后,映射模塊負(fù)責(zé)為當(dāng)前線(xiàn)程創(chuàng)建一個(gè)局部堆并維護(hù)這個(gè)局部堆和當(dāng)前線(xiàn)程的對(duì)應(yīng)關(guān)系;這個(gè)局部堆創(chuàng)建成功以后,從管理堆的空閑內(nèi)存塊鏈表中申請(qǐng)一定數(shù)量的內(nèi)存塊作為局部堆的內(nèi)存,將這些內(nèi)存塊從空閑內(nèi)存塊鏈表中移出的同時(shí)加入到已分配內(nèi)存塊鏈表中;所述局部堆用于在線(xiàn)程的生命周期內(nèi)負(fù)責(zé)處理當(dāng)前線(xiàn)程的所有動(dòng)態(tài)內(nèi)存請(qǐng)求;動(dòng)態(tài)內(nèi)存分配步驟,如果局部堆中的內(nèi)存足以滿(mǎn)足當(dāng)前線(xiàn)程申請(qǐng)的需求內(nèi)存時(shí),直接在該局部堆內(nèi)處理該線(xiàn)程的業(yè)務(wù)邏輯;否則,局部堆將從管理堆的空閑內(nèi)存塊鏈表中申請(qǐng)一定數(shù)量的內(nèi)存塊并追加到當(dāng)前局部堆中,在將這些內(nèi)存塊從空閑內(nèi)存塊鏈表中移出的同時(shí)加入到已分配內(nèi)存塊鏈表中,再繼續(xù)處理該線(xiàn)程的業(yè)務(wù)邏輯;歸還動(dòng)態(tài)內(nèi)存步驟,處理完當(dāng)前線(xiàn)程的業(yè)務(wù)邏輯后,歸還當(dāng)前線(xiàn)程的內(nèi)存并結(jié)束當(dāng)前線(xiàn)程。
2.根據(jù)權(quán)利要求1所述的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于所述作為管理堆的內(nèi)存的具體數(shù)量由內(nèi)存管理模塊根據(jù)應(yīng)用程序的總內(nèi)存需求進(jìn)行 相應(yīng)配置。
3.根據(jù)權(quán)利要求1所述的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于所述的每個(gè)內(nèi)存塊的大小為默認(rèn)的系統(tǒng)頁(yè)面大小。
4.根據(jù)權(quán)利要求3所述的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于所述默認(rèn)的系統(tǒng)頁(yè)面大小為4096字節(jié)或者以每一個(gè)不同的操作系統(tǒng)的API接口查詢(xún)獲得。
5.根據(jù)權(quán)利要求1所述的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于所述映射模塊為哈希表形式的映射表,并采用以樹(shù)為內(nèi)部數(shù)據(jù)結(jié)構(gòu)的圖(map)來(lái)管理維護(hù)該映射關(guān)系。
6.根據(jù)權(quán)利要求1所述的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于所述動(dòng)態(tài)內(nèi)存請(qǐng)求包括分配、釋放和動(dòng)態(tài)擴(kuò)充。
7.根據(jù)權(quán)利要求6所述的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于所述動(dòng)態(tài)內(nèi)存請(qǐng)求還包括需求量超過(guò)一個(gè)線(xiàn)程棧的當(dāng)前容量的內(nèi)存請(qǐng)求。
8.根據(jù)權(quán)利要求1至7任意一項(xiàng)所述的高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,其特征在于所述歸還當(dāng)前線(xiàn)程的內(nèi)存的過(guò)程是判斷當(dāng)前線(xiàn)程是否有歸還動(dòng)態(tài)內(nèi)存的需求,如果無(wú),則不進(jìn)行任何操作;否則,根據(jù)配置再判斷是否需要回收局部堆,如果是,則首先歸還內(nèi)存到局部堆,最后再將該局部堆對(duì)應(yīng)的內(nèi)存塊回收到管理堆的空閑內(nèi)存塊鏈表中,以備其它局部堆申請(qǐng)內(nèi)存塊時(shí)重復(fù)利用這些內(nèi)存塊;否則,首先歸還當(dāng)前局部堆的全部?jī)?nèi)存到管理堆的空閑內(nèi)存塊鏈表中,然后銷(xiāo)毀該局部堆。
全文摘要
本發(fā)明公開(kāi)了一種高并行的實(shí)時(shí)內(nèi)存資源管理調(diào)度方法,包括初始化步驟,內(nèi)存管理模塊分配指定數(shù)量的內(nèi)存作為管理堆,并將這些內(nèi)存劃分成多個(gè)內(nèi)存塊;內(nèi)存管理模塊建立一個(gè)映射模塊;內(nèi)存管理步驟,當(dāng)一個(gè)有動(dòng)態(tài)內(nèi)存管理需求的線(xiàn)程加入到內(nèi)存管理模塊后,映射模塊負(fù)責(zé)為當(dāng)前線(xiàn)程創(chuàng)建一個(gè)局部堆并維護(hù)這個(gè)局部堆和當(dāng)前線(xiàn)程的對(duì)應(yīng)關(guān)系;動(dòng)態(tài)內(nèi)存分配步驟;處理完當(dāng)前線(xiàn)程的業(yè)務(wù)邏輯后,歸還當(dāng)前線(xiàn)程的內(nèi)存并結(jié)束當(dāng)前線(xiàn)程。該方法解決了在現(xiàn)代多核高端商務(wù)服務(wù)器上并發(fā)內(nèi)存資源調(diào)度瓶頸的問(wèn)題,使得傳統(tǒng)應(yīng)用系統(tǒng)在無(wú)需任何代碼改變的前提下,充分發(fā)掘現(xiàn)代計(jì)算機(jī)的硬件資源潛力,大幅提升軟件系統(tǒng)的實(shí)時(shí)運(yùn)行效率。
文檔編號(hào)G06F9/48GK102567107SQ201110337808
公開(kāi)日2012年7月11日 申請(qǐng)日期2011年10月31日 優(yōu)先權(quán)日2011年10月31日
發(fā)明者周伊琳, 孫建偉, 簡(jiǎn)懷兵, 陳揚(yáng), 陳炯聰, 黃縉華 申請(qǐng)人:廣東電網(wǎng)公司電力科學(xué)研究院, 廣州執(zhí)舟軟件有限公司