專利名稱:基于對象池來實現(xiàn)線程操作的方法和設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般地涉及數(shù)據(jù)處理,更具體地,涉及基于對象池來實現(xiàn) 線程操作的方法和設(shè)備。
背景技術(shù):
很多現(xiàn)代編程語言已經(jīng)建立垃圾收集器(GC)作為對象釋放機制。 利用此類編程語言開發(fā)的應(yīng)用不能在使用之后顯式地釋放對象以恢復(fù) 內(nèi)存消耗。在多線程服務(wù)器應(yīng)用中,更快增長的死亡對象往往觸發(fā)過于 頻繁的垃圾收集4喿作,這將消耗太多的CPU時間并且令性能降級。
傳統(tǒng)對象池技術(shù)(例如WebSphere內(nèi)置的對象池)用于將使用過的 對象暫時緩存在對象池中以備下次使用,即,通過對象池來重復(fù)使用對 象而不是將其直接放置到垃圾收集器中。將對象放入到對象池中就意味 著該對象不再被程序的任何模塊使用,直到該對象被程序(線程)再次 從對象池中取出。對該對象池的兩個操作原語是get(或者getFrom), put(或者putBack),下面是二者的操作語義。
Get4乘作語義
IF對象池非空THEN
取出一個對象,將對象返回給線程
ELSE
創(chuàng)建一個新的對象,將對象返回給線程 END IF
PuU乘作語義
IF對象池非滿THEN
將對象放入到對象池中ELSE
拋棄此對象 END IF
盡管這樣的對象池技術(shù)有效地減小了垃圾收集操作,但當以多線程 方式進行運行時,對象池的使用將導(dǎo)致另一種性能問題。如圖l所示, 當多個線程要訪問單個的全局對象池時,由于該對象池需要加鎖來保護 其內(nèi)部數(shù)據(jù)結(jié)構(gòu)的一致性,所以對單個對象池上的鎖爭用將很容易變成 性能的瓶頸,破壞程序的可伸縮性。
為了避免上述的對單個的全局對象池的鎖爭用,采取多個對象池來 平衡工作負載以及分攤鎖爭用。如圖2中所示,該方案利用一個負載均 衡器(Round Robin選擇器)來分發(fā)(輪轉(zhuǎn)調(diào)度)對多個對象池的訪問, 每個對象池仍然由鎖來保護,通過降低單個對象池上鎖爭用的概率并延 緩爭用頻率來增加并發(fā)訪問能力。然而,當線程數(shù)目增大時,例如數(shù)目 大到超過對象池的個數(shù)時,其并不解決鎖爭用沖突問題,并且不能確保 線程不會比其他線程更為頻繁地嘗試使用這些對象池的一個或多個,這 也同樣造成嚴重的鎖爭用。
另外,Javal.2的線程局部類(ThreadLocal class )才支術(shù)和其他現(xiàn)有 技術(shù)中的技術(shù)方案也不能支持"生產(chǎn)者-消費者"使用模型和解決其帶 來的問題。生產(chǎn)者-消費者使用模型是指線程A總是從一個對象池中 取出對象,然后把該對象傳遞給另外一個線程B使用,線程B使用完 該對象之后,總是將該對象歸還給另一對象池。在這種使用模式下,該 使用到的兩個子對象池就會出現(xiàn)不均衡現(xiàn)象,即線程A所使用的私有對 象池會越來越空,而線程B所使用的私有對象池會越來越滿。
因此,需要一種改進的基于對象池來實現(xiàn)線程操作的方法和設(shè)備, 其能夠有效地解決對象池的鎖爭用,支持多個線程對對象的共享(即解 決"生產(chǎn)者-消費者,,使用模型問題),從而提高編程開發(fā)的生產(chǎn)效率。
發(fā)明內(nèi)容
本發(fā)明的目的是解決對對象池訪問時的鎖爭用問題,從而能夠進行對象池的并發(fā)訪問,以及實現(xiàn)多個線程對對象的共享。
為了實現(xiàn)上述的目的,本發(fā)明提供一種基于對象池來實現(xiàn)線程操作 的方法,該方法包括將多個線程通過映射表與全局對象池中的多個子對 象池進行一對一的綁定,響應(yīng)于線程對全局對象池的訪問,通過映射表 查找與該線程綁定的子對象池,以及全局對象池將線程的操作轉(zhuǎn)發(fā)到查 找到的與該線程綁定的子對象池。
另外,本發(fā)明還提供一種基于對象池來實現(xiàn)線程操作的設(shè)備,該設(shè) 備包括映射裝置,用于將多個線程通過映射表與全局對象池中的多個子 對象池進行一對一的綁定,以及轉(zhuǎn)發(fā)裝置,用于響應(yīng)于線程對全局對象 池的訪問,將所述線程的操作轉(zhuǎn)發(fā)到通過映射裝置查找到的與該線程綁 定的子對象池。
通過利用本發(fā)明提供的方法和設(shè)備,可以解決當多個線程訪問對象 池出現(xiàn)的鎖爭用問題,從而克服編程開發(fā)過程中出現(xiàn)的性能瓶頸,另外 本發(fā)明也同樣解決由于生產(chǎn)者-消費者模型所帶來的問題,更好地實現(xiàn) 了對象池的均衡和共享。
通過以下結(jié)合附圖的說明,并且隨著對本發(fā)明的更全面了解,
本發(fā)明的其他目的和效果將變得更加清楚和易于理解,其中
圖1是示出現(xiàn)有技術(shù)的多個線程對單個全局對象池進行訪問的示意
圖2是示出現(xiàn)有技術(shù)的多個線程對多個對象池進行訪問的示意圖; 圖3是示出根據(jù)本發(fā)明實施方式的將多個線程通過映射表與全局對 象池中的多個子對象池進行一對一綁定的方法的示意圖4是示出根據(jù)本發(fā)明實施方式的全局對象池的轉(zhuǎn)發(fā)操作的流程
圖5是示出根據(jù)本發(fā)明實施方式的調(diào)整線程到子對象池的映射關(guān)系 的示意圖6是示出根據(jù)本發(fā)明實施方式的Get操作的流程圖;圖7是示出根據(jù)本發(fā)明實施方式的Put操作的流程圖;以及
圖8是示出根據(jù)本發(fā)明實施方式的基于對象池來實現(xiàn)線程操作的設(shè)備。
在所有的上述附圖中,相同的標號表示具有相同、相似或相應(yīng) 的特征或功能。
具體實施例方式
以下,將結(jié)合附圖來描述本發(fā)明的實施方式。
象池中的多個子對象池進行一對一綁定的示意圖。在該圖中,全局對象 池包含多個子對象池(如子對象池A、 B和C等),該全局對象池的功 能包括維護一個單一的"全局對象池,,的接口語義,其并不負責具體的 對象緩存操作,而是將線程(如線程A、 B和C等)對對象的操作,諸 如Get/Put等操作轉(zhuǎn)發(fā)到與其綁定的子對象池上,由子對象池來負責真 正的Get/Put操作。這里需要指出本發(fā)明不僅適用于公知的Get/Put操作, 也適用于其他(例如清空對象池)的操作和未來開發(fā)應(yīng)用的各種操作。 為了能夠解決對象池的鎖爭用問題,本發(fā)明將多個線程通過映射表與全 局對象池中的多個子對象池進行一對一的綁定。如圖中所示,將線程A 與子對象池A綁定、將線程B與子對象池B綁定,而將線程C與子對 象池C綁定,依此類推。進行該一對一綁定的映射表可以是實現(xiàn)一對一 映射的任意數(shù)據(jù)結(jié)構(gòu),例如哈希表、線性表(連續(xù)表,鏈表)、堆、樹 狀表(n叉樹,AVL數(shù),B樹,B+樹,Radix樹,紅黑樹)等。綁定的 雙方優(yōu)選地可以是線程標識符(id)和子對象池引用之間的綁定。在將 線程與子對象池進行一對一 的綁定后,多個線程之間不再共享同 一個子 對象池,即不會共同訪問同一個子對象池。此后,當線程(如線程A、 B和C等)訪問全局對象池時,響應(yīng)于線程對全局對象池的訪問,通過 映射表查找與該線程綁定的子對象池(如子對象池A、 B和C等),接 著由全局對象池將線程的操作轉(zhuǎn)發(fā)到查找到的與該線程綁定的子對象 池。圖4是示出根據(jù)本發(fā)明實施方式的全局對象池的轉(zhuǎn)發(fā)操作的流程
圖。在步驟402處,該Put/Get操作開始。在步驟404處,將線程id作 為關(guān)鍵字來查詢上述的映射表,如果找到與其綁定的子對象池引用,則 前進到步驟412,由全局對象池將Get/Put操作轉(zhuǎn)發(fā)到與該線程綁定的 子對象池上。如果在映射表中沒有找到該子對象池引用,也即表明該線 程是首次訪問全局對象池,則在步驟408處,響應(yīng)于未查到與該線程綁 定的子對象池,全局對象池創(chuàng)建新的子對象池,并且在步驟410處,將 與該線程綁定的新的子對象池的引用記錄在映射表中,這就將創(chuàng)建的新 的子對象池與線程進行了綁定,從而下次該線程訪問全局對象池時,通 過該映射表找到與其綁定的子對象池。接著在步驟412處,由全局對象 池將Get/Put操作轉(zhuǎn)發(fā)到該新建立的子對象池。需要指出的是本發(fā)明的 在全局對象池中創(chuàng)建子對象池并且將其與首次訪問全局對象池的線程 進行動態(tài)綁定的方案是優(yōu)選的,本領(lǐng)域技術(shù)人員在本發(fā)明的教導(dǎo)下也可 以采用靜態(tài)綁定的方案,即將訪問全局對象池的多個線程分別與全局對 象池中已有的多個子對象池進行一對一的綁定。在本發(fā)明的該實施方式 中,還將記錄子對象池的使用信息,并且才艮據(jù)子對象池的^f吏用信息來調(diào) 整"線程-子對象池"的映射表,即,調(diào)整線程到子對象池的映射關(guān)系 以便解決生產(chǎn)者-消費者使用模型所帶來的問題,下文將對其進行詳細 地描述。
圖5是示出根據(jù)本發(fā)明實施方式的調(diào)整線程到子對象池的映射關(guān)系 的示意圖。在該圖的上部框圖中,線程A和線程B分別與全局對象池 中的子對象池A和子對象池B進行一對一的綁定。當線程A執(zhí)行Get 操作時,其從綁定的子對象池A取出對象,然后將其傳遞給線程B使 用。線程B在使用完該對象后,將該對象歸還到與其綁定的子對象池B, 這就是前面所提到的生產(chǎn)者-消費者模型。在這種情況下,綁定在兩個 線程上的子對象池就會出現(xiàn)不均衡現(xiàn)象,如圖中所示,子對象池A中的 對象將越來越少,而子對象池B中的對象將越來越多,即成為總是空的 (子對象池A)和總是滿的(子對象池B)兩個子對象池。為了克服這 樣的缺陷,本實施方式提出將這總是空的和總是滿的兩個對象池進行交換。如圖5下部的框圖中所示,將空的子對象池A和滿的子對象池B
進行交換,從而線程A對滿的子對象池B執(zhí)行Get操作,將取出的對 象傳遞給線程B,由線程B在使用后執(zhí)行Put操作而放回到空的子對象 池A,這就解決了子對象池之間的均衡問題,并且實現(xiàn)了線程對對象的 共享,下面將結(jié)合附圖6和7中的操作來具體描述該實現(xiàn)。
圖6是示出根據(jù)本發(fā)明實施方式的Get操作的流程圖。在步驟602 處,線程訪問全局對象池,并且由全局對象池將其要執(zhí)行的Get操作轉(zhuǎn) 發(fā)到與該線程綁定的子對象池。在步驟604處,判斷與該線程綁定的子 對象池是否為空。在步驟606處,響應(yīng)于判斷出與該線程綁定的子對象 池不為空,從該子對象池中取出對象,并且在步驟620處將取出的對象 返回給線程。在步驟608處,響應(yīng)于判斷出與該線程綁定的子對象池為 空,在該空的子對象池中創(chuàng)建新的對象。在步驟610中,確定該子對象 池空的時間是否大于某個閾值,如果不大于該閾值,則前進到步驟620, 將該新創(chuàng)建的對象返回給線程。如果空的時間大于該閾值,則在步驟612 中,在"總為滿"子對象池列表中查找子對象池,該"總為滿,,子對象 池列表記錄了其中對象已經(jīng)滿的子對象池。如果該列表中存在滿的子對 象池,則在步驟616中,響應(yīng)于確定與線程綁定的子對象池為空的時間 超出某個閾值并且全局對象池中存在滿的子對象池,將這兩個子對象池 與各自綁定的線程的映射關(guān)系進行交換,例如將前述的線程A綁定到子 對象池B,而將線程B綁定到子對象池A,而并非把將子對象池中的對 象進行拷貝。如果在該"總為滿"子對象池列表中不存在為滿的子對象 池,則將該空的子對象池記錄在"總為空"子對象池列表中并且在步驟 620處將新創(chuàng)建的對象返回給線程。與"總為滿"子對象池列表相對地, 該"總為空"子對象池列表記錄了其中對象為空的子對象池。
圖7是示出根據(jù)本發(fā)明實施方式的Put操作的流程圖。在步驟702 處,線程訪問全局對象池,并且由全局對象池將Put操作轉(zhuǎn)發(fā)到與該線 程一對一綁定的子對象池。在步驟704處,判斷該子對象池是否為滿。 響應(yīng)于判斷出與線程綁定的子對象池不為滿,在步驟706處,將該對象 放入到該子對象池中,并在步驟720處返回。響應(yīng)于判斷出與線程綁定的子對象池為滿,在步驟708處,拋棄該對象。在步驟710處,判斷該 子對象池為滿的時間是否大于某個閾值。如果大于某個閾值,則在前述 的"總為空"子對象池列表中查找子對象池。如果找到這樣的空子對象 池,則在步驟716處,響應(yīng)于確定與線程綁定的子對象池為滿的時間超 出某個閱值并且全局對象池中存在空的子對象池,將這兩個子對象池與 各自綁定的線程的映射關(guān)系進行交換并在步驟720處返回。否則,將該 滿的子對稱池記錄在"總為滿"子對象池列表中并且在步驟720處返回。
圖8是示出根據(jù)本發(fā)明實施方式的基于對象池來實現(xiàn)線程操作的設(shè) 備。在該圖中,所述設(shè)備包括映射裝置和轉(zhuǎn)發(fā)裝置,其中映射裝置中存 儲有映射表,該映射表通過映射關(guān)系將多個線程(例如,線程A、 B和 C等)與全局對象池中的多個子對象池(例如,子對象池A、 B和C等) 進行一對一的綁定。映射表優(yōu)選的采用哈希表、線性表、堆或樹狀表中 的任意一個,而綁定的二者優(yōu)選的是線程的標識符(id)與所述子對象 池引用。轉(zhuǎn)發(fā)裝置用于將線程的諸如Get/Put的操作(或清空子對象池 等其他的操作)轉(zhuǎn)發(fā)到與之綁定的子對象池。在操作中,當線程訪問全 局對象池時,映射裝置以該線程id為關(guān)鍵字來查找與之綁定的子對象 池引用。當映射裝置找到該子對象池引用時,由轉(zhuǎn)發(fā)裝置將線程的 Get/Put操作轉(zhuǎn)發(fā)到與該線程綁定的子對象池。下面描述本發(fā)明的設(shè)備 的操作過程(圖中未示出)。
當映射裝置未查找到與該線程綁定的子對象池時,轉(zhuǎn)發(fā)裝置創(chuàng)建新 的子對象池,并且映射裝置將該線程與新的子對象池進行綁定,繼而轉(zhuǎn) 發(fā)裝置將該線程的Get/Put操作轉(zhuǎn)發(fā)到與其綁定的新的子對象池。
當所述線程的操作為Get操作時,所述轉(zhuǎn)發(fā)裝置判斷查找到的與線 程綁定的子對象池是否為空,并且響應(yīng)于判斷出與線程綁定的子對象池 不為空,從該子對象池取出對象返回給所述線程;以及響應(yīng)于判斷出與 線程綁定的子對象池為空,在該子對象池中創(chuàng)建新的對象并返回給所述 線程。另外,響應(yīng)于確定與線程綁定的子對象池為空的時間超出某個閾 值并且所述全局對象池中存在滿的子對象池,所述映射裝置將這兩個子 對象池與各自綁定的線程的映射關(guān)系進行交換。當所述線程的操作為Put操作時,所述轉(zhuǎn)發(fā)裝置判斷查找到的與線 程綁定的子對象池是否為滿,并且響應(yīng)于判斷出與線程綁定的子對象池 不為滿,將對象放入到該子對象池中,以及響應(yīng)于判斷出與線程綁定的 子對象池為滿,拋棄所述對象。另外,響應(yīng)于確定與線程綁定的子對象 池為滿的時間超出某個閾值并且所述全局對象池中存在空的子對象池, 所述映射裝置將這兩個子對象池與各自綁定的線程的映射關(guān)系進行交 換。
本發(fā)明的設(shè)備可以實現(xiàn)為基于對象池技術(shù)的各種數(shù)據(jù)處理設(shè)備、計 算設(shè)備以及通信設(shè)備,例如利用對象池技術(shù)的各種應(yīng)用服務(wù)器(例如基
于Websphere的應(yīng)用服務(wù)器)、具有多核(multicore )處理能力的計算 機、具有大型SMP (對稱式多處理器)的計算設(shè)備和實現(xiàn)例如SIP通信 的各種通信協(xié)議的通信設(shè)備。
應(yīng)當注意,為了使本發(fā)明更容易理解,上面的描述省略了對于 本領(lǐng)域的技術(shù)人員來說是公知的、并且對于本發(fā)明的實現(xiàn)可能是必 需的更具體的一些技術(shù)細節(jié)。
提供本發(fā)明的說明書的目的是為了說明和描述,而不是用來窮舉 或?qū)⒈景l(fā)明限制為所公開的形式。對本領(lǐng)域的普通技術(shù)人員而言, 許多修改和變更都是顯而易見的。
因此,選擇并描述實施方式是為了更好地解釋本發(fā)明的原理及其 實際應(yīng)用,并使本領(lǐng)域普通技術(shù)人員明白,在不脫離本發(fā)明實質(zhì)的 前提下,所有修改和變更均落入由權(quán)利要求所限定的本發(fā)明的保護 范圍之內(nèi)。
權(quán)利要求
1.一種基于對象池來實現(xiàn)線程操作的方法,包括將多個線程通過映射表與全局對象池中的多個子對象池進行一對一的綁定;響應(yīng)于線程對全局對象池的訪問,通過映射表查找與該線程綁定的子對象池;以及全局對象池將線程的操作轉(zhuǎn)發(fā)到查找到的與該線程綁定的子對象池。
2. 根據(jù)權(quán)利要求1所述的方法,進一步包括響應(yīng)于未查找到與該線程綁定的子對象池,全局對象池創(chuàng)建新的子 對象池;以及將創(chuàng)建的新的子對象池與該線程進行綁定。 -
3. 根據(jù)權(quán)利要求1所述的方法,其中所述映射表是哈希表、線性表、 堆或樹狀表中的任意一個。
4. 根據(jù)權(quán)利要求1所述的方法,其中通過所述映射表將所述線程的 標識符與所述子對象池引用進行綁定。
5. 根據(jù)權(quán)利要求1所述的方法,其中所述操作是Get/Put操作。
6. 根據(jù)權(quán)利要求5所述的方法,其中當所述線程的操作為Get操作 時,所述方法進一步包括判斷查找到的與線程綁定的子對象池是否為空;響應(yīng)于判斷出與線程綁定的子對象池不為空,從該與線程綁定的子 對象池取出對象返回給線程;以及響應(yīng)于判斷出與線程綁定的子對象池為空,在該與線程綁定的子對 象池中創(chuàng)建新的對象并返回給線程。
7. 根據(jù)權(quán)利要求6所述的方法,其中當判斷出與線程綁定的子對象 池為空時,所述方法進一步包括響應(yīng)于確定與線程綁定的子對象池為空的時間超出某個閾值并且所述全局對象池中存在滿的子對象池,將這兩個子對象池與各自綁定的 線程的映射關(guān)系進行交換。
8. 根據(jù)權(quán)利要求5所述的方法,其中當所述線程的操作為Put操作 時,所述方法進一步包括判斷查找到的與線程綁定的子對象池是否為滿; 響應(yīng)于判斷出與線程綁定的子對象池不為滿,將對象放入到與線程 綁定的子對象池中;以及響應(yīng)于判斷出與線程綁定的子對象池為滿,拋棄所述對象。
9. 根據(jù)權(quán)利要求8所述的方法,其中當判斷出與線程綁定的子對象 池為滿時,所述方法進一步包括響應(yīng)于確定與線程綁定的子對象池為滿的時間超出某個閾值并且 所述全局對象池中存在空的子對象池,將這兩個子對象池與各自綁定的 線程的映射關(guān)系進行交換。
10. —種基于對象池來實現(xiàn)線程操作的設(shè)備,該設(shè)備包括 映射裝置,用于將多個線程通過映射表與全局對象池中的多個子對象池進行一對一的綁定;轉(zhuǎn)發(fā)裝置,用于響應(yīng)于所述線程對所述全局對象池的訪問,將所述 線程的操作轉(zhuǎn)發(fā)到通過映射裝置查找到的與該線程綁定的子對象池。
11. 根據(jù)權(quán)利要求IO所述的設(shè)備,當映射裝置未查找到與該線程綁 定的子對象池時,所述轉(zhuǎn)發(fā)裝置創(chuàng)建新的子對象池,并且所述映射裝置 將該線程與所述新的子對象池進行綁定。
12. 根據(jù)權(quán)利要求IO所述的設(shè)備,其中所述映射表是哈希表、線性 表、堆或樹狀表中的任意一個。
13. 根據(jù)權(quán)利要求IO所述的設(shè)備,其中通過所述映射表將所述線程 的標識符與所述子對象池? 1用進行綁定。
14. 根據(jù)權(quán)利要求IO所述的設(shè)備,其中所述操作是Get/Put操作。
15. 根據(jù)權(quán)利要求14所述的設(shè)備,其中當所述線程的操作為Get 操作時,所述轉(zhuǎn)發(fā)裝置執(zhí)行以下操作判斷查找到的與線程綁定的子對象池是否為空;響應(yīng)于判斷出與線程綁定的子對象池不為空,從該與線程綁定的子對象池耳又出對象返回給所述線程;以及響應(yīng)于判斷出與線程綁定的子對象池為空,在該與線程綁定的子對 象池中創(chuàng)建新的對象并返回給所述線程。
16. 根據(jù)權(quán)利要求15所述的設(shè)備,其中響應(yīng)于確定與線程綁定的子 對象池為空的時間超出某個閾值并且所述全局對象池中存在滿的子對 象池,所述映射裝置將這兩個子對象池與各自綁定的線程的映射關(guān)系進 行交換。
17. 根據(jù)權(quán)利要求14所述的設(shè)備,其中當所述線程的操作為Put 操作時,所述轉(zhuǎn)發(fā)裝置執(zhí)行以下操作判斷查找到的與線程綁定的子對象池是否為滿; 響應(yīng)于判斷出與線程綁定的子對象池不為滿,將對象放入到該與線 程綁定的子對象池中;以及響應(yīng)于判斷出與線程綁定的子對象池為滿,拋棄所述對象。
18. 根據(jù)權(quán)利要求17所述的設(shè)備,其中響應(yīng)于確定與線程綁定的子 對象池為滿的時間超出某個閾值并且所述全局對象池中存在空的子對 象池,所述映射裝置將這兩個子對象池與各自綁定的線程的映射關(guān)系進 行交換。
全文摘要
一種基于對象池來實現(xiàn)線程操作的方法,該方法包括將多個線程通過映射表與全局對象池中的多個子對象池進行一對一的綁定,響應(yīng)于線程對全局對象池的訪問,通過該映射表查找與該線程綁定的子對象池,以及全局對象池將線程的操作轉(zhuǎn)發(fā)到查找到的與該線程綁定的子對象池。利用本方法可以解決當多個線程訪問對象池出現(xiàn)的鎖爭用問題,從而克服鎖爭用造成的性能瓶頸,實現(xiàn)對象池的并發(fā)訪問和對象的共享。
文檔編號G06F9/50GK101593131SQ20081009847
公開日2009年12月2日 申請日期2008年5月28日 優(yōu)先權(quán)日2008年5月28日
發(fā)明者王海川, 奕 趙, 凱 鄭, 高志國 申請人:國際商業(yè)機器公司