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