專利名稱:以類為單位的遠程構件生命周期的管理方法
技術領域:
本發(fā)明涉及一種以類為單位的遠程構件生命周期的管理方法,尤其是一種在計算機系統(tǒng)中,客戶進程與服務進程之間進行構件遠程調用時,創(chuàng)建遠程構件并以類為單位對遠程構件的生存期進行有效管理的方法。
背景技術:
構件技術,是一種具有標準接口的對象模型技術,這種模型使各軟件構件可以用統(tǒng)一的方式進行交互。在構件技術的實現(xiàn)和使用過程中,牽涉到對構件以及構件所占有資源的生存期的管理,即生命周期的管理,其著重于解決遠程構件在遠程調用過程中所必須的資源的創(chuàng)建,計數(shù),以及銷毀。
構件本身的生命周期可以通過其引用計數(shù)來控制,其必須實現(xiàn)的標準構件接口方法AddRef,Release可以用來控制引用計數(shù)(AddRef,Release方法詳情出自微軟的COM相關技術文件),而遠程構件之間的調用則是通過動態(tài)生成的存根對象,代理對象間接完成的,所以遠程構件生命周期管理亦牽涉到對存根對象,代理對象的存活期的管理。構件服務進程做為構件服務的載體,其活動時間亦和構件對象的生命周期緊密相連。
遠程構件技術允許遠程服務以及服務使用者可以處于不同的地址空間。遠程服務所在空間稱之為服務器端,服務使用者所在空間稱之為客戶端。遠程服務的傳遞過程通過動態(tài)生成的存根對象,代理對象完成。服務器端的建立包括構件對象的建立,與構件對象對應的存根對象的建立,以及向操作系統(tǒng)內核注冊相關服務的信息,通過這些注冊信息足以找到相關服務的啟動信息,亦能夠通過其獲得大部分建立構件對象對應的代理對象所需要的信息。客戶端的建立則以對象代理的建立為標志。
微軟公司(microsoft)的COM是一種典型的構件技術,針對跨域的遠程構件調用,采用動態(tài)生成存根代理的方式間接完成,其遠程構件生命周期管理亦涉及到對存根對象,代理對象的存活期的管理,但是,在COM的生命周期管理中,是以接口為單位,而組件本身的實現(xiàn)則以類為單位,即一個組件類可以實現(xiàn)多個接口。如圖1所示,一個構件對象的實例可以允許實現(xiàn)多個接口,圖中所示一個構件對象的實例3具有接口A、接口B和接口C。遠程服務的傳遞過程中,在客戶端動態(tài)生成存根對象1以及三個與構件對象的實例相對應的接口代理A、接口代理B和接口代理C;同樣,在服務器端也建立了對象存根2和與構件對象的實例3相對應的接口存根A、接口存根B和接口存根C。在遠程構件調用中,對構件接口的引用計數(shù)的操作會轉發(fā)到相應的構件實現(xiàn)類上,相應地,由于動態(tài)生成的類存根和類代理都具有和構件類相匹配的接口存根和接口代理,因此,對于接口存根和接口代理的引用計數(shù)的操作會轉發(fā)到相應的類存根和類代理上。
目前,以接口為單位的遠程構件生命周期管理過程通常具有比較復雜的過程,以一個客戶端的一個進程以及其所屬的兩個線程進行遠程構件調用為例,其包括如下過程,服務端的進程首先創(chuàng)建一個遠程構件服務,如圖1中的構件對象的實例,具有三個接口存根;運行于客戶端的進程的一個線程獲得該遠程構件服務的一個接口,客戶端的另一個線程獲得該遠程構件服務的另一個接口;當客戶端的兩個線程分別使用完成該遠程構件服務后,先后釋放掉與其對應的接口;服務端的進程選擇合適的時機注銷該遠程構件服務。在這一過程中,兩個線程對遠程構件服務的調用需要經(jīng)過四次遠程調用,當客戶端的進程具有更多的線程時,或者有多個客戶端的進程需要進行遠程構件服務時以及出現(xiàn)跨進程調用時,遠程調用的耗時將會過長,從而浪費了大量的系統(tǒng)資源。
發(fā)明內容
本發(fā)明的目的在于針對上述以接口為單位的遠程構件生命周期管理過程所存在的遠程調用耗時過長,浪費了大量的系統(tǒng)資源的現(xiàn)狀,而提供一種以類為單位的遠程構件生命周期的管理方法,該方法以類為單位進行遠程構件調用,能夠減少遠程調用次數(shù),降低調用耗時,提高遠程構件服務效率。
為實現(xiàn)上述目的,本發(fā)明采用的一種以類為單位的遠程構件生命周期的管理方法,包括以下步驟步驟1、在服務端創(chuàng)建一個與構件對象一一對應的存根對象,通過調用AddRef方法,設置該存根對象引用計數(shù)器的初始值,同時通過調用構件對象的AddRef方法一次,在構件對象引用計數(shù)器原有數(shù)值上加1;步驟2、判斷客戶端是否異常退出,如果是,則執(zhí)行步驟9;如果不是,則執(zhí)行步驟3;步驟3、判斷服務端是否異常退出,如果是,則執(zhí)行步驟11;如果不是,則執(zhí)行步驟4;步驟4、在客戶端創(chuàng)建一個代理對象,通過調用AddRef方法,設置該代理對象引用計數(shù)器的初始值,并遠程對所述存根對象引用計數(shù)器的AddRef方法一次,使其加1;步驟5、獲得所述代理對象,通過調用AddRef方法一次,將所述代理對象引用計數(shù)器的初始值加1;步驟6、通過調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器的數(shù)值減1;用戶可以通過代理對象調用構件對象的相應方法,完成用戶所需要完成的任務。
步驟7、調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器置為0;遠程調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉所述代理對象以及與所述代理對象相關的資源;步驟8、調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉構件對象指針,使所述構件對象計數(shù)器返回所述原有數(shù)值;釋放掉所述存根對象以及與所述存根對象相關的資源,然后執(zhí)行步驟12;步驟9、在客戶端創(chuàng)建一個代理對象,通過調用AddRef方法,設置該代理對象引用計數(shù)器的初始值;在所述客戶端的進程對象中記錄所述存根對象的相關信息,并遠程對所述存根對象引用計數(shù)器的AddRef方法一次,使其加1;步驟10、調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器置為0;在所述客戶端的進程對象中刪除所述存根對象的相關信息,遠程調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉所述代理對象以及與所述代理對象相關的資源;步驟11、所述服務端釋放所創(chuàng)建的存根對象以及與所述存根對象相關的資源,并刪除由服務端進程向系統(tǒng)內核注冊的信息,然后執(zhí)行步驟12;步驟12、結束。
通過上述技術方案可以看出,本發(fā)明具有以下幾個特點,能夠通過引用計數(shù)來動態(tài)控制構件對象以及存根對象,代理對象的存活期;服務器進程控制它自己的生命周期,可以在任何它意愿的時候終止自己,服務器進程的設計者可以選擇將其生命周期和構件對象的生命周期掛鉤;遠程客戶端進程在使用完構件前必須增加構件服務的相關引用計數(shù),以防止在使用過程中服務退出,使用完服務后要釋放相關引用計數(shù);服務器進程異常退出,則所有的構件服務的遠程客戶端獲得的指針將失效,其相關資源依然可以正常釋放;遠程客戶端異常退出,其所擁有的遠程構件指針以及資源將全部釋放。這些特點也正是本發(fā)明對遠程構件生命周期進行管理的方法所遵循的原則;以類為單位做引用計數(shù)管理同以接口為單位做引用技術管理大大減少了接口(如構件對象的查詢接口QuerryInterface)之間的遠程消耗,更符合構件對象模型;代理,存根的引用計數(shù)優(yōu)化使Addref,Release等用戶顯式的構件生命周期管理操作最大限度的控制在本地進行處理。
本發(fā)明通過對以類為單位的構件對象、存根對象和代理對象的創(chuàng)建以及采用以類為單位的引用計數(shù)進行生命周期管理,使處于操作系統(tǒng)不同空間的構件服務和構件服務調用者能夠進行遠程通訊和數(shù)據(jù)交換,并且大大縮短了調用的耗時,節(jié)省了系統(tǒng)資源。
以下,通過具體實施方式
并結合附圖對本發(fā)明做進一步的詳細說明。
圖1為以接口為單位進行遠程構件的生命周期管理的構件對象實例與存根對象、代理對象之間的關系示意圖;圖2為構件對象、存根對象,代理對象之間的關系示意圖;圖3為本發(fā)明的一個具體實施例的流程圖;圖4為圖3所示實施例中存根對象的創(chuàng)建流程圖;圖5為圖3所示實施例中代理對象的創(chuàng)建流程圖。
具體實施例方式
CAR即Component Assembly Runtime,是一種構件技術,該技術支持遠程接口調用,即允許構件服務和構件服務調用者處于操作系統(tǒng)的不同空間,這兩個不同空間之間不允許彼此直接訪問或者具有不同的訪問權限,構件服務和構件服務調用通過第三方進行通訊和數(shù)據(jù)交換。遠程構件生命周期的管理用于對構件的生存期管理以及對于構件在遠程化過程中所需要的資源的生存期管理,其著重于解決遠程構件在遠程調用過程所必須的資源的創(chuàng)建,計數(shù),以及銷毀。
本發(fā)明對遠程構件生命周期的管理是以類為單位實現(xiàn)的,其主要包括三大內容創(chuàng)建與遠程構件對象相關的存根對象、代理對象;遠程調用并引用計數(shù)方法;在條件具備的情況下釋放系統(tǒng)資源、注銷相關注冊信息。
通過CAR構件技術可以動態(tài)生成存根對象、代理對象。存根對象和構件服務處于服務器端,代理對象則處于客戶端。一個遠程構件服務由存根對象以及構件服務實例組成,存根對象和構件服務實例之間存在一一對應的關系,存根對象的生成標志著一個遠程構件服務的建立,而客戶端的建立則以代理對象的生成為標志,該代理對象一定對應于某個遠程存根對象。圖2所示為遠程構件服務中,構件對象6、存根對象4,代理對象5之間的關系。遠程構件服務進程具有一個存根對象4。任何一個客戶端的用戶進程只能同時擁有或創(chuàng)建一個對應于該存根對象4的代理對象5,而一個遠程構件服務進程的存根對象4則可以擁有多個客戶端的代理對象5,換句話說可以允許存在多個代理對象和一個存根對象相對應。對于遠程構件的調用,由客戶端程序轉發(fā)給代理對象5,代理對象5再通過遠程轉發(fā)給服務端的存根對象4,存根對象4則再把調用轉發(fā)給構件對象6。
在通過引用計數(shù)進行管理時,實際上是通過代理對象,再轉發(fā)到存根對象,由存根對象再轉發(fā)到構件對象本身,當然,并不是客戶端的每一個本地的AddRef和Release都會翻譯成遠程的AddRef以及Release。出于效率的考慮,本發(fā)明對于引用計數(shù)的管理進行了一系列如下基于算法的合理優(yōu)化1、存根對象作為遠程服務的標志,當存根對象被創(chuàng)建的時候,本進程內AddRef 1次相對應的組件對象的引用計數(shù);遠程服務取消,存根對象銷毀的時候釋放1次(調用Release)該引用計數(shù)。
2、除存根對象被創(chuàng)建以及引用計數(shù)被減到0時存根對象被銷毀兩種情況,所有針對存根對象的引用計數(shù)的操作都只作用于存根對象本身上,而與構件對象無關。
3、代理對象作為客戶端獲得遠程服務的標志,當代理對象被創(chuàng)建的時候,遠程AddRef一次相應的存根對象的計數(shù);客戶端使用完該遠程服務,釋放掉服務,銷毀代理對象的時候遠程釋放1次(遠程調用Release)存根對象的引用計數(shù)。
4、除代理對象被創(chuàng)建,以及引用技術被減到0代理對象被銷毀兩種情況,所有針對代理對象的引用計數(shù)的操作都只作用于代理對象本身上,且完全是在客戶端進行,不與服務器端進行交互。
5、按照標準的COM引用計數(shù)規(guī)則使用引用計數(shù),當遠程的對象指針被釋放的時候,其代理對象的計數(shù)到0,代理對象即會被銷毀。
6、一個進程空間同時段多次獲得某個遠程服務,將現(xiàn)存的代理對象引用計數(shù)加1,在任意時間點,相對于獲取的某個遠程服務,一個進程只有一個相應的代理存在。
圖3所示為本發(fā)明一個具體實施例的流程,其步驟如下步驟301、在服務端創(chuàng)建一個與構件對象一一對應的存根對象,通過調用AddRef方法,設置該存根對象引用計數(shù)器的初始值,同時通過AddRef方法一次,在構件對象引用計數(shù)器原有數(shù)值m上加1,成為m+1。存根對象引用計數(shù)器的初始值設置為1。
步驟302、判斷客戶端是否異常退出,如果是,則執(zhí)行步驟309;如果不是,則執(zhí)行步驟303。
步驟303、判斷服務端是否異常退出,如果是,則執(zhí)行步驟311;如果不是,則執(zhí)行步驟304;步驟304、在客戶端創(chuàng)建一個代理對象,通過調用AddRef方法,設置該代理對象引用計數(shù)器的初始值,該初始值可以設置為1;遠程對存根對象引用計數(shù)器的AddRef方法一次,使其加1;步驟305、獲得所述代理對象,通過調用AddRef方法一次,將所述代理對象引用計數(shù)器加1,使其變?yōu)?。
步驟306、通過調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器的數(shù)值減1。
步驟307、調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器置為0;遠程調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉所述代理對象以及與所述代理對象相關的資源。
步驟308、調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉構件對象指針,使所述構件對象計數(shù)器返回所述原有數(shù)值,即由m+1變?yōu)閙;釋放掉所述存根對象以及與所述存根對象相關的資源,然后執(zhí)行步驟312。
步驟309、由于客戶端異常退出可能帶來包括客戶端所擁有的服務器端的接口指針沒有釋放,導致服務器端引用計數(shù)不對以及無法正常退出等問題,客戶端出現(xiàn)異常退出的情況如下,在客戶端創(chuàng)建一個代理對象,通過調用AddRef方法,將該代理對象引用計數(shù)器的初始值設置為1;在所述客戶端的進程對象中記錄所述存根對象的相關信息,并遠程對所述存根對象引用計數(shù)器的AddRef方法一次,使其加1。
步驟310、在正常情況下,調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器置為0;在所述客戶端的進程對象中刪除所述存根對象的相關信息,遠程調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉所述代理對象以及與所述代理對象相關的資源。在客戶端異常退出的情況下,客戶端進程退出的時候則檢查該進程對象中是否存在步驟309記錄的信息,如果存在,則根據(jù)這些記錄一一釋放掉該遠程構件對象服務(通過遠程調用存根對象的Release方法),再刪除這些信息,然后執(zhí)行步驟312。
步驟311、在服務器異常退出的情況下,在服務進程對象停止活動的過程中,服務端釋放所創(chuàng)建的存根對象以及與所述存根對象相關的資源,并刪除由服務端進程向系統(tǒng)內核注冊的信息。完成這部分工作后,如果此時客戶端的遠程調用轉到服務器端的內核,則內核通過查找,發(fā)現(xiàn)相關遠程構件服務已經(jīng)退出,則返回錯誤,客戶端的代理對象檢測到這個錯誤,則釋放掉其本身以及相關資源,并返回錯誤給用戶。由于服務器端的異常退出可能導致服務器端以及內核相關數(shù)據(jù)沒有被釋放,造成用戶內存泄漏以及內核內存泄漏,并且可能造成客戶端相關調用發(fā)生錯誤且無法正常釋放相關資源,因此,需要執(zhí)行上述操作,使整個資源的釋放過程完成。
步驟312、結束。
在上述步驟301中,服務端創(chuàng)建一個存根對象的具體過程如圖4所示,其過程為步驟401、通過CAR構件環(huán)境創(chuàng)建一個構件對象。
步驟402、創(chuàng)建一個與所述構件對象一一對應的所述存根對象,通過該存根對象可以調用所述構件對象。
步驟403、向內核注冊相關存根對象以及構件對象的信息。
在上述步驟304中,客戶端創(chuàng)建一個代理對象的具體過程如圖5所示,其過程為步驟501、所述客戶端查詢本進程內的信息,如果不存在相應的代理對象,則過列集\散集過程或通過命名服務從內核獲得相關構件服務的信息。
步驟502、通過所述相關構件服務信息建立所述代理對象。
最后所應說明的是以上實施例僅用以說明而非限制本發(fā)明的技術方案,盡管參照上述實施例對本發(fā)明進行了詳細說明,本領域的普通技術人員應當理解依然可以對本發(fā)明進行修改或者等同替換,而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應涵蓋在本發(fā)明的權利要求范圍當中。
權利要求
1.一種以類為單位的遠程構件生命周期的管理方法,其包括以下步驟步驟1、在服務端創(chuàng)建一個與構件對象一一對應的存根對象,通過調用AddRef方法,設置該存根對象引用計數(shù)器的初始值為1,同時通過AddRef方法一次,將構件對象的引用計數(shù)器在原有數(shù)值上加1;步驟2、判斷客戶端是否異常退出,如果是,則執(zhí)行步驟9;如果不是,則執(zhí)行步驟3;步驟3、判斷服務端是否異常退出,如果是,則執(zhí)行步驟11;如果不是,則執(zhí)行步驟4;步驟4、在客戶端創(chuàng)建一個代理對象,通過調用AddRef方法,設置該代理對象引用計數(shù)器的初始值為1,并遠程調用所述存根對象的AddRef方法一次,使其引用計數(shù)器加1;步驟5、獲得所述代理對象,通過調用AddRef方法一次,將所述代理對象引用計數(shù)器的初始值加1;步驟6、通過調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器的數(shù)值減1;步驟7、調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器置為0;遠程調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉所述代理對象以及與所述代理對象相關的資源;步驟8、調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉構件對象指針,使所述構件對象計數(shù)器返回所述原有數(shù)值;釋放掉所述存根對象以及與所述存根對象相關的資源,然后執(zhí)行步驟12;步驟9、在客戶端創(chuàng)建一個代理對象,通過調用AddRef方法,設置該代理對象引用計數(shù)器的初始值;在所述客戶端的進程對象中記錄所述存根對象的相關信息,并遠程對所述存根對象引用計數(shù)器的AddRef方法一次,使其加1;步驟10、調用所述代理對象的Release方法,將所述代理對象引用計數(shù)器置為0;在所述客戶端的進程對象中刪除所述存根對象的相關信息,遠程調用所述存根對象的Release方法,將所述存根對象引用計數(shù)變?yōu)?;釋放掉所述代理對象以及與所述代理對象相關的資源;然后執(zhí)行步驟12;步驟11、所述服務端釋放所創(chuàng)建的存根對象以及與所述存根對象相關的資源,并刪除由服務端進程向系統(tǒng)內核注冊的信息;步驟12、結束。
2.根據(jù)權利要求1所述的以類為單位的遠程構件生命周期的管理方法,其特征在于所述步驟1中創(chuàng)建一個存根對象的具體過程為步驟1a、通過CAR構件環(huán)境創(chuàng)建一個構件對象;步驟1b、創(chuàng)建一個與所述構件對象一一對應的的所述存根對象,通過該存根對象可以調用所述構件對象;步驟1c、向內核注冊相關存根對象以及構件對象的信息。
3.根據(jù)權利要求1所述的以類為單位的遠程構件生命周期的管理方法,其特征在于所述步驟1中將所述存根對象引用計數(shù)器的初始值設置為1。
4.根據(jù)權利要求1所述的以類為單位的遠程構件生命周期的管理方法,其特征在于所述步驟4中創(chuàng)建一個代理對象的具體過程為步驟41、所述客戶端查詢本進程內的信息,如果不存在相應的代理對象,則過列集\散集過程或通過命名服務從內核獲得相關組件服務信息;步驟42、通過所述相關組件服務信息建立所述代理對象。
5.根據(jù)權利要求1、2或3所述的以類為單位的遠程構件生命周期的管理方法,其特征在于所述步驟4中將所述代理對象引用計數(shù)器的初始值設置為1,且通過AddRef方法一次,使所述存根對象引用計數(shù)器為2。
6.根據(jù)權利要求5所述的以類為單位的遠程構件生命周期的管理方法,其特征在于所述步驟5中通過調用AddRef方法一次,將所述代理對象引用計數(shù)器設置為2。
7.根據(jù)權利要求6所述的以類為單位的遠程構件生命周期的管理方法,其特征在于所述步驟9中通過調用AddRef方法,將該代理對象引用計數(shù)器的初始值設置為1。
全文摘要
本發(fā)明涉及一種以類為單位的遠程構件生命周期的管理方法,該方法包括創(chuàng)建與遠程構件對象相對應的存根對象、代理對象;通過調用AddRef和Release方法對存根對象、代理對象的引用計數(shù)器的值進行增減;在條件具備的情況下釋放系統(tǒng)資源、注銷相關注冊信息。本發(fā)明通過引用計數(shù)來動態(tài)控制構件對象以及存根對象,代理對象的存活期,大大減少了接口之間的遠程消耗,更符合構件對象模型;同時代理,存根的引用計數(shù)的優(yōu)化使用戶對構件生命周期管理操作最大限度的控制在本地進行處理,方便了用戶使用,也節(jié)省了系統(tǒng)資源。
文檔編號G06F9/44GK1889038SQ200610029729
公開日2007年1月3日 申請日期2006年8月3日 優(yōu)先權日2006年8月3日
發(fā)明者蘇翼鵬, 劉亞東, 梁宇洲, 陳榕, 王晨輝 申請人:上海科泰世紀科技有限公司