專利名稱:軟件在線升級(jí)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,具體涉及一種軟件在線升級(jí)的方法。
背景技術(shù):
為了配合計(jì)算機(jī)技術(shù)的發(fā)展,軟件提供商也在不斷地更新升級(jí)其各種軟件,以提高計(jì)算機(jī)的功能?,F(xiàn)有的軟件升級(jí)絕大多數(shù)屬于替換原來程序部分文件的方式,一般在升級(jí)完成之前或者之后需要進(jìn)行系統(tǒng)重啟或者應(yīng)用程序重啟,升級(jí)過程導(dǎo)致業(yè)務(wù)中斷,不能達(dá)到在線升級(jí)的目標(biāo)。
隨著信息技術(shù)越來越廣泛的應(yīng)用在社會(huì)生活的各個(gè)方面,各行各業(yè)對(duì)于軟件的無故障運(yùn)行的要求也越來越強(qiáng)烈,對(duì)于系統(tǒng)不中斷情況下連續(xù)運(yùn)行的要求也越來越高(如商業(yè)網(wǎng)站后臺(tái)交易程序,電廠控制),而隨著業(yè)務(wù)的發(fā)展,軟件在連續(xù)運(yùn)行情況下的業(yè)務(wù)升級(jí)和修改也成為一種趨勢(shì)和必然。
目前,有些軟件提供商為了方便用戶的需求,使用戶能及時(shí)方便地更新軟件的版本,也提供了軟件在線升級(jí)的功能。一般情況下,軟件的在線升級(jí)方案采用函數(shù)過程地址替換的方法,如圖1所示,在替換函數(shù)過程的內(nèi)部進(jìn)行流程的重組和新流程的建立,以及新的數(shù)據(jù)結(jié)構(gòu)變量的建立。這種方案使得對(duì)在線升級(jí)的軟件要求比較苛刻,比如要求被打補(bǔ)丁的軟件不能屬于多線程的,不能訪問公共變量的,升級(jí)過程不能修改系統(tǒng)內(nèi)部數(shù)據(jù)結(jié)構(gòu)等等。因此,該方案的應(yīng)用還存在以下缺點(diǎn)(1)無法提供對(duì)于全局變量數(shù)據(jù)結(jié)構(gòu)更改的支持,特別是在多線程存取公共變量的情況下。比如,多線程需要同時(shí)存取一個(gè)變量,這樣就可能會(huì)使系統(tǒng)內(nèi)部變量的存取產(chǎn)生沖突,則該變量將不能被打補(bǔ)丁,不能實(shí)現(xiàn)在線升級(jí)的目的。
(2)如果被打補(bǔ)丁的函數(shù)內(nèi)部保存有局部靜態(tài)變量,則該變量也不能被打補(bǔ)丁,無法讀取其內(nèi)容并進(jìn)行更新。
(3)存在業(yè)務(wù)流程混亂和程序異常的風(fēng)險(xiǎn),因?yàn)槿绻壳熬€程位于A函數(shù)的代碼中,A函數(shù)可能調(diào)用了被打補(bǔ)丁的B函數(shù),B函數(shù)的調(diào)用方式發(fā)生了改變,是需要A以新的方式實(shí)現(xiàn)調(diào)用,這樣可能導(dǎo)致業(yè)務(wù)流混亂或者程序異常。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種軟件在線升級(jí)的方法,以克服上述現(xiàn)有技術(shù)中軟件在線升級(jí)無法提供對(duì)于全局變量數(shù)據(jù)結(jié)構(gòu)更改的支持的問題。
本發(fā)明的目的是通過以下技術(shù)方案實(shí)現(xiàn)的一種軟件在線升級(jí)的方法,包括A、將軟件中需要一起實(shí)現(xiàn)升級(jí)的資源進(jìn)行編組,形成不同的編組資源;B、在所述軟件運(yùn)行過程中將所述軟件中涉及到訪問編組資源的處理流程打補(bǔ)??;C、軟件運(yùn)行過程中分別自動(dòng)對(duì)所述編組資源進(jìn)行升級(jí);D、恢復(fù)所述軟件中涉及到訪問編組資源的處理流程的補(bǔ)??;E、升級(jí)所述軟件中編組外需要升級(jí)的資源。
所述步驟B包括B1、建立線程遷移控制表,所述線程遷移控制表包括所述編組資源涉及的線程標(biāo)識(shí)、線程狀態(tài)。
B2、根據(jù)所述線程遷移控制表對(duì)所述軟件中涉及到訪問編組資源的處理流程打補(bǔ)丁。
所述步驟B2包括B21、在對(duì)所述處理流程打補(bǔ)丁前將所述編組資源涉及的線程設(shè)置為鎖定狀態(tài);
B22、系統(tǒng)在運(yùn)行補(bǔ)丁后將所述編組資源涉及的線程設(shè)置為非鎖定狀態(tài)。
所述步驟C具體包括C1、按預(yù)定方式判斷所述編組是否滿足編組升級(jí)條件;C2、將滿足所述編組升級(jí)條件的編組進(jìn)行升級(jí)。
所述預(yù)定方式包括在每次所述編組資源涉及的線程設(shè)置為非鎖定狀態(tài)后,判斷所述編組是否滿足編組升級(jí)條件;或者定時(shí)遍歷所有編組,判斷所述編組是否滿足升級(jí)條件。
所述步驟C2還包括將所述編組升級(jí)的過程設(shè)置為臨界區(qū)狀態(tài)。
所述滿足編組升級(jí)的條件具體為所述編組資源升級(jí)過程涉及的所有線程均為非鎖定狀態(tài)。
所述步驟E包括E1、建立軟件升級(jí)線程列表,所述軟件升級(jí)線程列表包括在所述軟件中需要打補(bǔ)丁的程序所涉及到的所有線程。
E2、根據(jù)所述軟件升級(jí)線程列表,升級(jí)所述軟件中編組中需要升級(jí)的資源。
所述需要一起實(shí)現(xiàn)升級(jí)的資源包括公共變量、函數(shù)、過程。
所述補(bǔ)丁程序的調(diào)用和返回方式與所述替換的編組資源的調(diào)用和返回方式相同。
所述步驟B還包括將所述軟件中各線程最常用的一個(gè)處理流程打補(bǔ)??;當(dāng)所述最常用的一個(gè)處理流程補(bǔ)丁被調(diào)用后將其對(duì)應(yīng)的相關(guān)線程狀態(tài)設(shè)備為非鎖定狀態(tài)。
由以上本發(fā)明提供的技術(shù)方案可以看出,本發(fā)明通過對(duì)相互有影響的升級(jí)資源進(jìn)行編組,將具有相互影響和關(guān)聯(lián)的函數(shù)過程和變量數(shù)據(jù)結(jié)構(gòu)的升級(jí)放置在一個(gè)過程中完成,使軟件的升級(jí)支持?jǐn)?shù)據(jù)結(jié)構(gòu)類型的升級(jí),支持不同數(shù)據(jù)分批進(jìn)行升級(jí);并且,提供對(duì)公共變量數(shù)據(jù)結(jié)構(gòu)升級(jí)過程中多線程的并發(fā)訪問控制,使升級(jí)過程在多線程處于安全的非沖突狀態(tài)下完成;通過雙補(bǔ)丁過程(補(bǔ)丁程序完成控制升級(jí)過程以及升級(jí)過程完成后的生效過程)完成特殊要求的函數(shù)過程,將軟件升級(jí)的無序化過程轉(zhuǎn)換為有序化的可控過程。利用本發(fā)明,可以滿足應(yīng)用場(chǎng)合中要求業(yè)務(wù)不能中斷條件下的升級(jí)要求,加強(qiáng)了軟件升級(jí)的平滑過渡,保障了軟件升級(jí)過程的可靠性和一致性。
圖1是現(xiàn)有技術(shù)中軟件在線升級(jí)方案示意圖;圖2是本發(fā)明軟件在線升級(jí)實(shí)現(xiàn)結(jié)構(gòu)圖;圖3是本發(fā)明軟件在線升級(jí)的流程圖;圖4是本發(fā)明方法中編組升級(jí)示意圖;圖5是本發(fā)明方法中軟件升級(jí)所需的補(bǔ)丁程序?qū)崿F(xiàn)結(jié)構(gòu)示意圖;圖6是需要升級(jí)的軟件加載補(bǔ)丁程序后對(duì)資源映射表的初始化流程。
具體實(shí)施例方式
首先,將本發(fā)明中使用的縮略語作如下說明PAS(Patched Application System)被打補(bǔ)丁應(yīng)用系統(tǒng),指將要進(jìn)行軟件升級(jí)的原有應(yīng)用系統(tǒng);PAP(Patch Application)補(bǔ)丁程序,指將要替換原有應(yīng)用系統(tǒng)的新附加的程序,是一個(gè)獨(dú)立的應(yīng)用程序;PCS(Patch Control Stub)補(bǔ)丁控制樁模塊,駐留于PAS中完成補(bǔ)丁過程的控制;PCC(Patch Control Center)
補(bǔ)丁協(xié)調(diào)控制中心,位于PAP中,升級(jí)時(shí)需要駐留于PCS中,協(xié)調(diào)完成補(bǔ)丁在PAS中生效實(shí)現(xiàn)的模塊;PCF(Patch Control Function)補(bǔ)丁控制函數(shù),指在PCC中完成補(bǔ)丁應(yīng)用控制的控制函數(shù)組;PF(Patch Function)補(bǔ)丁函數(shù),位于PAP中將要在PAS中生效的新功能函數(shù)和代碼,或者是替換掉舊處理流程的功能函數(shù)和代碼。
本技術(shù)領(lǐng)域人員知道,軟件升級(jí)可以大致分為以下幾種類型(1)升級(jí)過程不涉及數(shù)據(jù)結(jié)構(gòu)變更情況,也不涉及多線程情況,只有業(yè)務(wù)處理流程的變更;(2)升級(jí)過程包括數(shù)據(jù)結(jié)構(gòu)的變化,但數(shù)據(jù)結(jié)構(gòu)的變化影響范圍在一個(gè)線程之內(nèi),不涉及到其他線程;(3)升級(jí)過程涉及到變量的數(shù)據(jù)結(jié)構(gòu)變化,同時(shí)該變量的變化涉及到多線程中處理流程的并發(fā)訪問。
因此,針對(duì)上述不同的軟件升級(jí)類型,在軟件在線升級(jí)過程中需要考慮以下問題在升級(jí)過程中需要保證前后流程的更改協(xié)調(diào)一致;數(shù)據(jù)結(jié)構(gòu)的變更需要考慮在多線程并發(fā)執(zhí)行時(shí)的流程沖突處理,包括不同線程執(zhí)行相同或者不同程序代碼段的情況;對(duì)數(shù)據(jù)結(jié)構(gòu)變量的變化,升級(jí)過程應(yīng)該提供升級(jí)處理流程,即新的數(shù)據(jù)結(jié)構(gòu)變量從舊的數(shù)據(jù)結(jié)構(gòu)變量拷貝轉(zhuǎn)換哪些數(shù)據(jù)。由于單線程軟件升級(jí)可以看成多線程相同情況的一個(gè)特例,而無數(shù)據(jù)結(jié)構(gòu)升級(jí)的升級(jí)可以看做數(shù)據(jù)升級(jí)為空的情況,因此,不同類型的軟件升級(jí)都可以看作是多線程條件下公共變量存在數(shù)據(jù)結(jié)構(gòu)變更的升級(jí)過程。
考慮到多線程條件下公共變量存在數(shù)據(jù)結(jié)構(gòu)變更的升級(jí),本發(fā)明的核心思想在于以下幾點(diǎn)(1)將具有相互影響和依賴的需要升級(jí)的數(shù)據(jù)和控制函數(shù)過程等進(jìn)行編組,使它們之間升級(jí)過程中不相互影響,同時(shí)升級(jí)前后也不相互影響。通過資源映射的方式實(shí)現(xiàn)補(bǔ)丁程序PAP對(duì)被打補(bǔ)丁應(yīng)用系統(tǒng)PAS內(nèi)系統(tǒng)資源的訪問和更改,包括靜態(tài)變量。所述資源映射的方式是指在PAS生成過程中編譯器會(huì)生成一些MAP文件,如VC編譯選項(xiàng)設(shè)置生成MAP文件后進(jìn)行Build,生成可執(zhí)行文件和MAP文件,MAP文件中包括該程序工程中的公共函數(shù)和公共變量在以后運(yùn)行空間的相對(duì)地址,即重定位后的地址。PAP被加載到PAS后,根據(jù)這些地址信息,在函數(shù)地址處加一個(gè)跳轉(zhuǎn)指令,可以在PAS調(diào)用該函數(shù)的時(shí)候轉(zhuǎn)向新指定的地址上,PAP中定義了一些結(jié)構(gòu)和PAS中相同的變量指針,將指針的值設(shè)置為MAP中指定的公共變量地址值,則PAP中定義的這個(gè)變量即為PAS中的變量,這個(gè)過程即為資源映射。
(2)在被打補(bǔ)丁應(yīng)用系統(tǒng)PAS中設(shè)立補(bǔ)丁控制樁PCS模塊,提供對(duì)應(yīng)用程序的線程監(jiān)控功能,以及建立補(bǔ)丁程序段的加載控制支持等功能。
(3)在補(bǔ)丁程序PAP中設(shè)立補(bǔ)丁協(xié)調(diào)控制中心PCC模塊,對(duì)實(shí)現(xiàn)補(bǔ)丁過程進(jìn)行全程控制,實(shí)現(xiàn)補(bǔ)丁的數(shù)據(jù)轉(zhuǎn)換控制、補(bǔ)丁控制功能的實(shí)現(xiàn)、補(bǔ)丁程序段初始化等功能,同時(shí)向PCS提供一個(gè)預(yù)定義過程,實(shí)現(xiàn)PCS啟動(dòng)PCC過程的控制。
(4)在補(bǔ)丁控制函數(shù)PCF的內(nèi)部,實(shí)現(xiàn)對(duì)多線程情況下編組升級(jí)過程的支持,保證編組升級(jí)過程的完整性和數(shù)據(jù)的一致性。
(5)在PAS將PAP鏈接進(jìn)PAS程序空間后,首先將執(zhí)行PAP的初始化過程,包括升級(jí)后的數(shù)據(jù)空間的生成,完成所有PCF的函數(shù)替換功能(在臨界區(qū)中完成),完成PAP向PAS資源的映射等等。
(6)在數(shù)據(jù)結(jié)構(gòu)變化(即升級(jí))的過程中,需要考慮到多線程的影響,因?yàn)楦鱾€(gè)線程處于不同的代碼區(qū),對(duì)公共數(shù)據(jù)的訪問一方面需要實(shí)現(xiàn)互斥,另一方面在數(shù)據(jù)升級(jí)過程中執(zhí)行的代碼需要協(xié)調(diào)統(tǒng)一,不能出現(xiàn)一個(gè)線程按照新的補(bǔ)丁函數(shù)執(zhí)行,而另一個(gè)仍按舊代碼執(zhí)行的情況,這樣將產(chǎn)生異?;蛘邤?shù)據(jù)的不一致,數(shù)據(jù)升級(jí)過程必須要在所涉及到的線程處于安全或者非沖突狀態(tài)下才可進(jìn)行。
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面結(jié)合附圖和實(shí)施方式對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說明。
參照?qǐng)D2,圖2是本發(fā)明軟件在線升級(jí)實(shí)現(xiàn)結(jié)構(gòu)圖需要在線升級(jí)的應(yīng)用程序包括線程ID1、線程ID2和線程ID3。在該應(yīng)用程序運(yùn)行過程中,補(bǔ)丁控制樁模塊PCS負(fù)責(zé)將外部的補(bǔ)丁程序PAP讀入該應(yīng)用程序中,并調(diào)用其預(yù)定義的啟動(dòng)函數(shù)。該過程的控制方法可以根據(jù)需要自由設(shè)定,比如通過UI(用戶操作界面)、自定義網(wǎng)絡(luò)協(xié)議,即自行定義用戶和PCS間的交互接口,通過網(wǎng)絡(luò)來實(shí)現(xiàn)。
如果PCS支持應(yīng)用程序重新啟動(dòng)后自動(dòng)打補(bǔ)丁功能,則需要在PCS中加入重啟動(dòng)后執(zhí)行補(bǔ)丁程序接口的功能。
該軟件在線升級(jí)實(shí)現(xiàn)的流程如圖3所示,包括以下步驟步驟301將軟件中需要一起實(shí)現(xiàn)升級(jí)的資源進(jìn)行編組,形成不同的編組資源。
需要一起實(shí)現(xiàn)升級(jí)的資源包括公共變量、函數(shù)、過程等,以及需要在其中進(jìn)行變更的其他項(xiàng)目,如文件結(jié)構(gòu),數(shù)據(jù)庫等。這些資源之間存在相互影響和依賴,而且會(huì)涉及多個(gè)線程對(duì)該資源的操作,對(duì)每個(gè)編組內(nèi)資源的升級(jí)需要同時(shí)進(jìn)行,而各編組之間升級(jí)過程相互不影響,而且升級(jí)前后也不相互影響。這樣,避免了軟件運(yùn)行過程中由于升級(jí)使這些資源之間產(chǎn)生的相互影響。
對(duì)于其他如私有變量等可以通過程序中預(yù)定義映射的方式實(shí)現(xiàn)升級(jí)。
步驟302建立線程遷移控制表,所述線程遷移控制表包括所述編組資源涉及的線程、線程狀態(tài)。也就是說該線程遷移控制表表示了被打補(bǔ)丁應(yīng)用程序PAS內(nèi)所有涉及到數(shù)據(jù)結(jié)構(gòu)升級(jí)的線程列表以及各線程的當(dāng)前狀態(tài),可以采用如下所示的數(shù)據(jù)單元結(jié)構(gòu)STRUCT{ThreadID,Status}其中,Status代表線程在升級(jí)過程中的當(dāng)前狀態(tài)是否是安全的(非鎖定狀態(tài)),初始化時(shí)線程遷移控制表中各個(gè)線程單元的狀態(tài)(Status的值)為鎖定狀態(tài)。
步驟303在所述軟件運(yùn)行過程中根據(jù)線程遷移控制表對(duì)軟件中涉及到訪問編組資源的處理流程打補(bǔ)丁。
需要注意的是,為了保證軟件升級(jí)的安全,在對(duì)所述處理流程打補(bǔ)丁前需要將所述編組資源涉及的線程設(shè)置為鎖定狀態(tài);每個(gè)涉及到編組資源的處理流程(線程)需要的補(bǔ)丁全部打上后,才可將該線程設(shè)置為非鎖定狀態(tài)。
這樣,編組資源涉及的線程全部被打補(bǔ)丁后,就可以分別對(duì)各編組資源進(jìn)行升級(jí)。于是,進(jìn)到下一步。
步驟304按預(yù)定方式判斷所述編組是否滿足編組升級(jí)條件,編組升級(jí)的條件是指涉及到訪問該編組資源的處理流程是否已全部打補(bǔ)丁且滿足升級(jí)要求,也就是前面提到的編組資源升級(jí)過程涉及的所有線程是否均為非鎖定狀態(tài)。因?yàn)橹挥性诰幗M資源升級(jí)過程涉及的所有線程均為非鎖定狀態(tài)時(shí),才表明與該編組相關(guān)的線程已經(jīng)打過補(bǔ)丁,該線程內(nèi)的函數(shù)不會(huì)對(duì)該編組的升級(jí)產(chǎn)生影響。
按照本發(fā)明方法,對(duì)于某個(gè)應(yīng)用程序,可能同時(shí)會(huì)有多個(gè)編組,對(duì)各編組升級(jí)條件的檢測(cè)以及升級(jí)過程可以有多種方式,比如
在每次編組資源涉及的線程設(shè)置為非鎖定狀態(tài)后,判斷該編組是否滿足編組升級(jí)條件,對(duì)于滿足升級(jí)條件的編組調(diào)用其升級(jí)過程實(shí)現(xiàn)升級(jí),這樣,在軟件運(yùn)行過程中,可以對(duì)編組資源實(shí)現(xiàn)逐次升級(jí),每次升級(jí)只調(diào)用單個(gè)編組的升級(jí)過程即可;如果不逐次升級(jí),也可以定時(shí)進(jìn)行每個(gè)編組的遍歷,判斷所述編組是否滿足升級(jí)條件,滿足條件的調(diào)用其升級(jí)過程完成編組資源的升級(jí)。
也可以將滿足升級(jí)條件的編組放入一個(gè)編組升級(jí)隊(duì)列,然后再對(duì)該隊(duì)列中的編組逐次進(jìn)行升級(jí)。
總之,對(duì)不同編組資源進(jìn)行升級(jí)可以采取多種不同的方式,在不影響程序運(yùn)行的情況下可靈活選用。
步驟305將滿足編組升級(jí)條件的編組進(jìn)行升級(jí),對(duì)編組升級(jí)的過程也就是通過補(bǔ)丁程序替換編組資源的過程。
編組資源包括了公共變量、函數(shù)、過程等,在每個(gè)編組升級(jí)過程中,對(duì)這些相互有影響的資源的升級(jí)需要一次完成,以避免升級(jí)編組內(nèi)單個(gè)資源時(shí)對(duì)其他資源產(chǎn)生影響。
為了避免在升級(jí)過程中由于系統(tǒng)切換線程引發(fā)其他不可預(yù)料的問題,比如,發(fā)生線程中斷的情況,可以將編組升級(jí)的過程設(shè)置為臨界區(qū)狀態(tài)。所謂臨界區(qū)是一種簡單的同步對(duì)象,它只可以在同一進(jìn)程內(nèi)部使用,以保證只有一個(gè)線程可以申請(qǐng)到該對(duì)象。典型的與臨界區(qū)相關(guān)的API(應(yīng)用程序接口)函數(shù)為·VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection)產(chǎn)生臨界區(qū);·VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection)刪除臨界區(qū);·VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)進(jìn)入臨界區(qū),相當(dāng)于申請(qǐng)加鎖,如果該臨界區(qū)正被其他線程使用則該函數(shù)會(huì)等待到其他線程釋放;·BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)進(jìn)入臨界區(qū),相當(dāng)于申請(qǐng)加鎖,和EnterCriticalSection不同如果該臨界區(qū)正被其他線程使用則該函數(shù)會(huì)立即返回FALSE,而不會(huì)等待;·VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)退出臨界區(qū),相當(dāng)于申請(qǐng)解鎖。
步驟306恢復(fù)軟件中涉及到訪問編組資源的處理流程的補(bǔ)丁。因?yàn)檫@些補(bǔ)是為升級(jí)各編組資源而設(shè)置的,并不是真正軟件升級(jí)所需要的程序,當(dāng)編組資源升級(jí)完成后,對(duì)該軟件中除編組外的其他資源的升級(jí)即轉(zhuǎn)化為單線程、無數(shù)據(jù)結(jié)構(gòu)變更的升級(jí)過程。這時(shí)將編組資源涉及的各線程內(nèi)的補(bǔ)充恢復(fù),然后,進(jìn)到步驟307升級(jí)軟件中編組外的其他資源。
對(duì)編組外其他資源的升級(jí),比如,可以通過建立軟件升級(jí)線程列表,所述軟件升級(jí)線程列表包括軟件中需要打補(bǔ)丁的程序所涉及到的所有線程,根據(jù)軟件升級(jí)線程列表升級(jí)軟件中編組外的其他資源。
對(duì)編組資源的升級(jí)可通過圖4來表示軟件程序包括2個(gè)線程線程1包括3個(gè)函數(shù)FUNC1、FUNC2、FUNC3,線程2包括3個(gè)函數(shù)FUNC4、FUNC5、FUNC6。其中,線程1中的函數(shù)FUNC1、FUNC2和線程2中的函數(shù)FUNC5和編組有關(guān),首先通過補(bǔ)丁程序PAP將這些函數(shù)替換,在替換函數(shù)的入口將本線程狀態(tài)設(shè)置為Lock(鎖定狀態(tài)),依然調(diào)用原有的處理函數(shù)。因?yàn)樵诋?dāng)前情況下還沒有完成升級(jí)過程,仍然需要通過執(zhí)行原有的功能流程保證系統(tǒng)正常運(yùn)行。離開時(shí),即原有的函數(shù)FUNC執(zhí)行完后,將本線程狀態(tài)設(shè)置為UnLock(非鎖定狀態(tài))。然后,通過補(bǔ)丁控制函數(shù)PCF判斷編組是否可升級(jí)(即線程1、線程2都處于UnLock狀態(tài)),如果可以則進(jìn)行升級(jí),升級(jí)完成后替換掉需要修改的函數(shù)FUNC1、FUNC2和FUNC5以及其他需要替換的函數(shù),如果函數(shù)FUNC1、FUNC2和FUNC5可以保留,則恢復(fù)這些函數(shù)。
上述編組升級(jí)過程是在軟件運(yùn)行中完成的,而且對(duì)補(bǔ)丁程序的調(diào)用和返回方式與對(duì)替換的編組資源的調(diào)用和返回方式相同。
為了在軟件運(yùn)行過程中加大升級(jí)機(jī)會(huì),同時(shí)防止升級(jí)線程陷入空轉(zhuǎn)出現(xiàn)不能實(shí)現(xiàn)升級(jí)的情況,還可以建立一個(gè)補(bǔ)丁協(xié)調(diào)控制中心PCC,編寫PCC初始化代碼,在代碼中將各個(gè)線程最常調(diào)用的一個(gè)函數(shù)打補(bǔ)丁,在該處理流程中,通知PCC該線程進(jìn)入U(xiǎn)nlock狀態(tài),同時(shí)執(zhí)行原來的處理流程,即上文的替換前的FUNC函數(shù)。由于升級(jí)過程開始后,是假設(shè)所有的線程狀態(tài)都是不安全的,只有這些線程調(diào)用了補(bǔ)丁控制函數(shù)后才認(rèn)為這些線程是安全的,因?yàn)榭赡茉摼€程在一個(gè)需要升級(jí)的函數(shù)中執(zhí)行,同時(shí)由于補(bǔ)丁控制函數(shù)被訪問的次數(shù)和概率是不能夠被測(cè)算的,如果補(bǔ)丁控制函數(shù)PCF打的位置不好,不能被線程調(diào)用,則這些線程狀態(tài)仍是不安全的,將導(dǎo)致升級(jí)過程難以進(jìn)行下去,因此可以針對(duì)一些被常調(diào)用的函數(shù)進(jìn)行打補(bǔ)丁,可以加大升級(jí)機(jī)會(huì)。
前面提到,本發(fā)明中軟件在線升級(jí)的過程是通過補(bǔ)丁控制樁PCS將外部的補(bǔ)丁程序PAP讀入需要升級(jí)的軟件中實(shí)現(xiàn)的,如圖5所示,在該補(bǔ)丁程序PAP中包括以下部分1.補(bǔ)丁函數(shù)PF在補(bǔ)丁程序PAP中將要在被打補(bǔ)丁應(yīng)用程序PAS中生效的新功能函數(shù)和代碼,或者是替換掉舊處理流程的功能函數(shù)和代碼。
2.補(bǔ)丁協(xié)調(diào)控制中心PCC升級(jí)時(shí)需要駐留于PCS中,協(xié)調(diào)完成補(bǔ)丁在PAS中生效實(shí)現(xiàn)的模塊,該模塊提供如下功能(1)同補(bǔ)丁控制樁PCS的接口PIF,PCS通過該接口調(diào)用打補(bǔ)丁操作的啟動(dòng)。
(2)資源映射表RMT實(shí)現(xiàn)補(bǔ)丁程序PAP中的資源變量向被打補(bǔ)丁應(yīng)用程序PAS內(nèi)資源的映射鏡像,實(shí)現(xiàn)過程可以從PAS的映射文件讀取實(shí)現(xiàn),也可以通過在PAS內(nèi)部建立資源映射表實(shí)現(xiàn)。為了在補(bǔ)丁啟動(dòng)早期實(shí)現(xiàn)資源的映射操作,具體調(diào)用由接口PIF過程實(shí)現(xiàn)。
另外,補(bǔ)丁函數(shù)PF利用RMT來實(shí)現(xiàn)對(duì)應(yīng)用程序PAS內(nèi)資源的訪問。
RMT結(jié)構(gòu)表示如下Strcut{ValueAddr,ValueName,ValueType}其中,ValueAddr是PAP中的變量指針地址,ValueName是要映射的資源名稱,可以為函數(shù)或者變量名,ValueType是資源類型。
(3)線程遷移控制表TTCT表示了應(yīng)用程序PAS內(nèi)所有涉及到數(shù)據(jù)結(jié)構(gòu)升級(jí)的線程列表以及它們的當(dāng)前狀態(tài),具體的數(shù)據(jù)單元結(jié)構(gòu)如下STRUCT{ThreadID,Status}其中,Status代表線程在升級(jí)過程中的當(dāng)前狀態(tài)是否是安全(Unlock)的,初始化時(shí)TTCT內(nèi)各個(gè)單元的Status的值為Lock。
(4)編組升級(jí)控制表GTCT支持在多線程情況下公共變量數(shù)據(jù)結(jié)構(gòu)更改控制,它的數(shù)據(jù)單元的具體結(jié)構(gòu)如下STRUCT{GroupID,ThreadID_List,Transfer_Proc,bTrasferIsOk}其中,GroupID是指要進(jìn)行轉(zhuǎn)換的數(shù)據(jù)結(jié)構(gòu)的變量(編組)ID值,在補(bǔ)丁程序PAP中進(jìn)行統(tǒng)一分配,各個(gè)GroupID之間在業(yè)務(wù)上是沒有相互沖突的,可以將需要數(shù)據(jù)結(jié)構(gòu)升級(jí)的有相互影響的幾個(gè)數(shù)據(jù)變量和有關(guān)的函數(shù)過程等分配到一個(gè)GroupID。
ThreadID_List是線程轉(zhuǎn)換列表,指GroupID代表的變量數(shù)據(jù)結(jié)構(gòu)升級(jí)過程中所涉及到的線程ID列表,為保證在數(shù)據(jù)升級(jí)過程對(duì)各個(gè)線程的正常流程是無影響的,保障數(shù)據(jù)和業(yè)務(wù)的一致性,需要將該變量數(shù)據(jù)結(jié)構(gòu)變更所涉及到的所有線程ID列出。
Transfer_Proc指向在補(bǔ)丁程序PAP中實(shí)現(xiàn)數(shù)據(jù)升級(jí)的函數(shù)過程地址,通過該函數(shù)過程實(shí)現(xiàn)數(shù)據(jù)的正確升級(jí)。
bTrasferIsOk表示該GroupID已經(jīng)完成數(shù)據(jù)升級(jí),初始為false。
(5)編組升級(jí)控制過程GTC實(shí)現(xiàn)對(duì)多線程情況下編組內(nèi)資源的更改過程,它連同補(bǔ)丁控制過程(PCF)實(shí)現(xiàn)編組升級(jí),保證各個(gè)線程業(yè)務(wù)和數(shù)據(jù)的一致性和完整性。同時(shí)提供了Notify_Thread_GroupID(判斷編組是否滿足升級(jí)條件的函數(shù))的實(shí)現(xiàn),該函數(shù)具體流程如下set ThreadID_Status=InputParam_Lock_seq(將該線程的Status設(shè)置為輸入?yún)?shù)的鎖定字段,即Notify_Thread_GroupID的第三個(gè)參數(shù))if Get_GroupID_Of_AllNeededThreadIDs_Status_are_Unlock then(查找一個(gè)涉及到的所有線程的狀態(tài)都是Unlock的編組)call Transfer_Proc_By_GroupID(調(diào)用該GroupID的數(shù)據(jù)升級(jí)過程,實(shí)現(xiàn)編組內(nèi)所有資源的升級(jí))set bTrasferIsOk_From_GroupID=true如果考慮盡快完成切換,則重復(fù)以上三條操作直到所有可以升級(jí)的編組完成升級(jí)。
3.補(bǔ)丁控制函數(shù)PCF指在補(bǔ)丁協(xié)調(diào)控制中心PCC中完成補(bǔ)丁應(yīng)用控制的控制函數(shù)組。該函數(shù)實(shí)現(xiàn)編組訪問控制流程,它在訪問編組資源時(shí)的代碼結(jié)構(gòu)如下If Lock_GroupID_successful(鎖定DTCT具體編組ID對(duì)應(yīng)的線程狀態(tài))ThenBeginUnlock_GroupID(解鎖線程狀態(tài))
Execute_Old_Process(執(zhí)行升級(jí)前的舊流程)ElseExecute_New_Process(執(zhí)行升級(jí)后的流程)End其中,Lock_GroupID_successful的流程如下If bTrasferIsOk_Is_True_of_GroupID Then Return ErrorElseNotify_Thread_GroupID(Current_ThreadID,GroupID,Lock)Lock_Data_of_Group(GroupID)(鎖定該編組中的具體數(shù)據(jù),可以調(diào)用原來并發(fā)訪問資源的老代碼)Return OKEndif其中,Unlock_GroupID的流程如下Notify_Thread_GroupID(Current_ThreadID,GroupID,UnLock)將補(bǔ)丁程序動(dòng)態(tài)加載后需要進(jìn)行初始化,包括以下三個(gè)過程1.資源映射表RMT初始化過程首先,在步驟601進(jìn)入RMT初始化過程;然后,進(jìn)到步驟602讀取補(bǔ)丁程序PAP中的MAP(映射)信息;步驟603讀取MAP中的一條記錄;步驟604判斷該記錄中的名稱和類型和資源映射表RMT中的記錄是否相同;如果相同,則進(jìn)到步驟605將該RMT記錄的資源地址的值賦值為MAP中定義的相對(duì)地址;如果不同,則返回步驟603讀取MAP中的下一條記錄。
2.編組升級(jí)控制表GTCT和線程遷移控制表TTCT的初始化
將GTCT表中所有記錄的bTrasferIsOk設(shè)置為FALSE;將TTCT表中所有記錄的Status設(shè)置為Lock。
3.運(yùn)行編組升級(jí)控制過程GTC將補(bǔ)丁控制函數(shù)PCF群組中的各個(gè)PCF替換目標(biāo)程序PAS中的指定函數(shù),該替換過程需要在臨界區(qū)內(nèi)完成。
PCF替換掉PAS中的函數(shù)后,當(dāng)PAS訪問被PCF替換的函數(shù)時(shí)重定向到PCF,然后由PCF實(shí)現(xiàn)對(duì)多線程情況下編組升級(jí)過程的控制。
在數(shù)據(jù)結(jié)構(gòu)變化(即升級(jí))的過程中,需要考慮到多線程的影響,因?yàn)楦鱾€(gè)線程處于不同的代碼區(qū),對(duì)公共數(shù)據(jù)的訪問一方面需要實(shí)現(xiàn)互斥,另一方面在數(shù)據(jù)升級(jí)過程中執(zhí)行的代碼需要協(xié)調(diào)統(tǒng)一,不能出現(xiàn)一個(gè)線程按照新的補(bǔ)丁函數(shù)執(zhí)行,而另一個(gè)仍按舊代碼執(zhí)行的情況,這樣將產(chǎn)生異常或者數(shù)據(jù)的不一致,數(shù)據(jù)升級(jí)過程必須要在所涉及到的線程處于安全或者非沖突狀態(tài)下才可進(jìn)行。因此,在訪問編組資源前通過Notify_Thread_GroupID函數(shù)將本線程設(shè)置為Lock,訪問后設(shè)置為Unlock。
在每次設(shè)置線程Unlock后的Notify_Thread_GroupID中判斷編組是否滿足升級(jí)條件,也就是說,判斷該編組涉及到的所有線程的狀態(tài)是否都是安全的,滿足條件的將調(diào)用其升級(jí)過程實(shí)現(xiàn)升級(jí)。如果需要編組按照一定的順序進(jìn)行升級(jí),則只調(diào)用單個(gè)編組的升級(jí)過程即可,否則進(jìn)行每個(gè)編組的遍歷,滿足條件的調(diào)用其升級(jí)過程。為了防止發(fā)生線程中斷的情況,需要將升級(jí)過程設(shè)置為臨界區(qū)。
所有的編組完成升級(jí)后,再完成編組外其他資源的升級(jí)過程,即完成補(bǔ)丁函數(shù)PF的替換。完成PF替換后,需要恢復(fù)該軟件原來的一些函數(shù),即執(zhí)行補(bǔ)丁恢復(fù)操作,將一些不實(shí)際實(shí)現(xiàn)補(bǔ)丁流程的函數(shù)恢復(fù)。
至此,完成了涉及多線程條件下公共變量存在數(shù)據(jù)結(jié)構(gòu)變更的應(yīng)用程序的在線升級(jí)過程。
雖然通過實(shí)施例描繪了本發(fā)明,本領(lǐng)域普通技術(shù)人員知道,本發(fā)明有許多變形和變化而不脫離本發(fā)明的精神,希望所附的權(quán)利要求包括這些變形和變化而不脫離本發(fā)明的精神。
權(quán)利要求
1.一種軟件在線升級(jí)的方法,其特征在于,包括以下步驟A、將軟件中需要一起實(shí)現(xiàn)升級(jí)的資源進(jìn)行編組,形成不同的編組資源;B、在所述軟件運(yùn)行過程中將所述軟件中涉及到訪問編組資源的處理流程打補(bǔ)??;C、軟件運(yùn)行過程中分別自動(dòng)對(duì)所述編組資源進(jìn)行升級(jí);D、恢復(fù)所述軟件中涉及到訪問編組資源的處理流程的補(bǔ)?。籈、升級(jí)所述軟件中編組外需要升級(jí)的資源。
2.根據(jù)權(quán)利要求1所述的軟件在線升級(jí)的方法,其特征在于,所述步驟B包括B1、建立線程遷移控制表,所述線程遷移控制表包括所述編組資源涉及的線程標(biāo)識(shí)、線程狀態(tài)。B2、根據(jù)所述線程遷移控制表對(duì)所述軟件中涉及到訪問編組資源的處理流程打補(bǔ)丁。
3.根據(jù)權(quán)利要求2所述的軟件在線升級(jí)的方法,其特征在于,所述步驟B2包括B21、在對(duì)所述處理流程打補(bǔ)丁前將所述編組資源涉及的線程設(shè)置為鎖定狀態(tài);B22、系統(tǒng)在運(yùn)行補(bǔ)丁后將所述編組資源涉及的線程設(shè)置為非鎖定狀態(tài)。
4.根據(jù)權(quán)利要求3所述的軟件在線升級(jí)的方法,其特征在于,所述步驟C具體包括C1、按預(yù)定方式判斷所述編組是否滿足編組升級(jí)條件;C2、將滿足所述編組升級(jí)條件的編組進(jìn)行升級(jí)。
5.根據(jù)權(quán)利要求3所述的軟件在線升級(jí)的方法,其特征在于,所述預(yù)定方式包括在每次所述編組資源涉及的線程設(shè)置為非鎖定狀態(tài)后,判斷所述編組是否滿足編組升級(jí)條件;或者定時(shí)遍歷所有編組,判斷所述編組是否滿足升級(jí)條件。
6.根據(jù)權(quán)利要求4所述的軟件在線升級(jí)的方法,其特征在于,所述步驟C2還包括將所述編組升級(jí)的過程設(shè)置為臨界區(qū)狀態(tài)。
7.根據(jù)權(quán)利要求4所述的軟件在線升級(jí)的方法,其特征在于,所述滿足編組升級(jí)的條件具體為所述編組資源升級(jí)過程涉及的所有線程均為非鎖定狀態(tài)。
8.根據(jù)權(quán)利要求1或2所述的軟件在線升級(jí)的方法,其特征在于,所述步驟E包括E1、建立軟件升級(jí)線程列表,所述軟件升級(jí)線程列表包括在所述軟件中需要打補(bǔ)丁的程序所涉及到的所有線程。E2、根據(jù)所述軟件升級(jí)線程列表,升級(jí)所述軟件中編組中需要升級(jí)的資源。
9.根據(jù)權(quán)利要求1所述的軟件在線升級(jí)的方法,其特征在于,所述需要一起實(shí)現(xiàn)升級(jí)的資源包括公共變量、函數(shù)、過程。
10.根據(jù)權(quán)利要求3所述的軟件在線升級(jí)的方法,其特征在于,所述補(bǔ)丁程序的調(diào)用和返回方式與所述替換的編組資源的調(diào)用和返回方式相同。
11.根據(jù)權(quán)利要求1所述的軟件在線升級(jí)的方法,其特征在于,所述步驟B還包括將所述軟件中各線程最常用的一個(gè)處理流程打補(bǔ)丁;當(dāng)所述最常用的一個(gè)處理流程補(bǔ)丁被調(diào)用后將其對(duì)應(yīng)的相關(guān)線程狀態(tài)設(shè)備為非鎖定狀態(tài)。
全文摘要
本發(fā)明公開了一種軟件在線升級(jí)的方法,包括將軟件中需要一起實(shí)現(xiàn)升級(jí)的資源進(jìn)行編組,形成不同的編組資源;在軟件運(yùn)行過程中將所述軟件中涉及到訪問編組資源的處理流程打補(bǔ)?。环謩e對(duì)編組資源進(jìn)行升級(jí);恢復(fù)所述軟件中涉及到訪問編組資源的處理流程的補(bǔ)??;升級(jí)所述軟件中編組外的其他資源。本發(fā)明支持涉及多線程、數(shù)據(jù)結(jié)構(gòu)類型變更的升級(jí),滿足應(yīng)用場(chǎng)合無業(yè)務(wù)中斷條件下的升級(jí)要求,充分保障了軟件升級(jí)過程的可靠性和一致性。
文檔編號(hào)G06F11/36GK1770108SQ20041008857
公開日2006年5月10日 申請(qǐng)日期2004年11月5日 優(yōu)先權(quán)日2004年11月5日
發(fā)明者盧慶明 申請(qǐng)人:華為技術(shù)有限公司