郭秋麗,趙益民,邸海濤
(航空工業(yè)西安航空計算技術(shù)研究所,陜西 西安 710068)
動態(tài)更新的研究始于19世紀(jì)60年代,在開放的Internet環(huán)境下,動態(tài)性和多變性的需求越來越明顯。大多數(shù)系統(tǒng)都處于持續(xù)運行中,如果停機(jī)更新維護(hù),則會帶來巨大的損失,這就要求軟件系統(tǒng)具有動態(tài)更新的能力,能實現(xiàn)系統(tǒng)的動態(tài)更新。嵌入式軟件組件經(jīng)過組裝和集成后形成龐大的軟件系統(tǒng),但對執(zhí)行時間、可靠性、安全性、可用性及功耗等因素要求較高,使用者在經(jīng)過評估或性能改進(jìn)后,會對不符合需求的軟件組件進(jìn)行更新,于是就引入了對軟件組件更新的需求。文章提出了一種嵌入式軟件組件的更新方法,并具體實現(xiàn)了更新過程。
根據(jù)嵌入式軟件組件更新發(fā)生的時機(jī)不同,可將組件更新方式分為以下4種:
(1)設(shè)計時更新:在軟件編譯前,通過修改組件的設(shè)計或源代碼,重新編譯和部署來適應(yīng)變化。在文章中不考慮這種類型的組件更新。(2)運行前更新:又稱為靜態(tài)更新,指在軟件編譯之后、運行之前進(jìn)行的更新。(3)有限制的動態(tài)更新:一般在設(shè)計時就規(guī)定了更新的具體條件,比如將系統(tǒng)設(shè)置為“安全”模式后進(jìn)行一些規(guī)定的更新操作,不會破壞系統(tǒng)的穩(wěn)定性和一致性。黃英蘭等[1]提到了基于確定策略的機(jī)載分布式系統(tǒng)多級重構(gòu)方法就是通過預(yù)先定義系統(tǒng)的重構(gòu)策略,并將策略存儲在配置數(shù)據(jù)中來實現(xiàn)的。(4)動態(tài)更新:又稱為運行時更新,指在組件運行過程中,根據(jù)應(yīng)用需要和環(huán)境變化,動態(tài)的進(jìn)行組件運行、維護(hù)和更新。
組件更新在本質(zhì)上是指刪除舊組件和增加新組件的替換操作。在具體替換時,需要收集舊組件的狀態(tài)和數(shù)據(jù),然后傳遞給新組件,新組件通過直接使用這些狀態(tài)和數(shù)據(jù)或根據(jù)系統(tǒng)約束對其進(jìn)行轉(zhuǎn)化,最終使新系統(tǒng)能正確運行。若替換操作不成功,系統(tǒng)必須恢復(fù)到原來的狀態(tài)。因此,組件必須滿足以下特性:
(1)新、舊組件必須兼容,并且新組件必須符合功能屬性要求,以減少更新后對整個系統(tǒng)的影響。(2)新組件只影響與其相連的組件,不能影響系統(tǒng)中的其他組件。(3)保證組件滿足一致性要求,即行為一致性、狀態(tài)一致性、應(yīng)用一致性。
嵌入式軟件組件系統(tǒng)由操作系統(tǒng)、驅(qū)動、組件管理框架、組件和組件庫組成,其中操作系統(tǒng)和驅(qū)動與硬件環(huán)境緊密聯(lián)系,組件分為應(yīng)用組件和中間件組件,中間件組件運行在組件管理框架中。組件是不能直接與底層軟件進(jìn)行交互的,需要組件管理框架來完成。組件管理框架是一個支持組件運行和部署的環(huán)境,主要負(fù)責(zé)組件與外部的連接、組件生命周期的管理、組件服務(wù)的綁定調(diào)用、為組件分配系統(tǒng)資源等功能[2-3]。組件管理框架在組件更新時起到了非常重要的作用,通過組件管理框架可以實現(xiàn)組件狀態(tài)的遷移,如:組件增加、組件刪除、組件修改、組件升級和組件替換等操作。嵌入式軟件組件系統(tǒng)組成如圖1所示。
圖1 嵌入式軟件組件系統(tǒng)組成
當(dāng)嵌入式系統(tǒng)有組件更新需求時,系統(tǒng)需要判斷當(dāng)前更新操作是否可以進(jìn)行,一般是通過組件的依賴關(guān)系來判斷的。配置描述文件以一種規(guī)范化、易于理解的方式來全面、準(zhǔn)確地描述組件信息,包括:組件名稱、版本、提供商、功能、服務(wù)、依賴服務(wù)等,其中組件依賴服務(wù)屬性描述了該組件對其他組件的依賴關(guān)系及依賴強(qiáng)度。
假如系統(tǒng)中有組件A、組件B和組件C 3個組件在運行,其中,組件A依賴于組件B,且組件B是為組件A而加載運行的,組件C依賴于組件A。現(xiàn)在要求動態(tài)更新組件A,處理規(guī)則如下:
(1)如果新組件A沒有提供給組件C所需要的服務(wù),則系統(tǒng)判斷其不符合一致性規(guī)則,不允許更新。(2)如果新組件A提供了組件C所需要的服務(wù),但沒有依賴組件B,則不影響整個系統(tǒng)的運行,允許更新。在更新成功后,將舊組件A和組件B同時卸載。(3)如果新組件A提供了組件C所需要的服務(wù),也依賴于組件B,則允許更新,更新成功后,將舊組件A卸載,保留組件B。
組件更新軟件用來實現(xiàn)組件的更新。如圖2所示,組件更新軟件分為更新響應(yīng)、動態(tài)更新、狀態(tài)恢復(fù)共3個子模塊。
圖2 組件更新軟件功能模塊
(1)更新響應(yīng)模塊:當(dāng)組件框架接收到組件更新的命令后,即調(diào)用更新響應(yīng)模塊,對組件及當(dāng)前狀態(tài)進(jìn)行判斷,確定能否更新、靜態(tài)更新或動態(tài)更新等。(2)動態(tài)更新模塊:主要進(jìn)行組件的動態(tài)更新。(3)狀態(tài)恢復(fù)模塊:無論組件更新成功與否,系統(tǒng)都要進(jìn)行更新動作后的清理工作。如果更新失敗,則要將系統(tǒng)恢復(fù)到更新之前的狀態(tài);如果更新成功,則要將舊組件相關(guān)信息清除。
當(dāng)組件框架調(diào)用了更新響應(yīng)功能后,組件更新軟件就開始執(zhí)行,組件更新的過程如圖3所示。
圖 3個組件更新過程
(1)執(zhí)行組件下載功能,將新組件下載到本地組件庫中。(2)判斷所要更新的模塊名稱是否安裝在當(dāng)前的軟件組件管理框架中,如果沒有被安裝,則結(jié)束更新過程。(3)判斷新組件是否滿足一致性要求,如果不滿足則結(jié)束更新過程。(4)判斷舊組件是否被加載到內(nèi)存,如果沒有則將新組件進(jìn)行安裝,并在安裝文件中記錄安裝信息,卸載舊組件,結(jié)束更新過程。(5)如果組件被加載到內(nèi)存,且參與了系統(tǒng)功能服務(wù),則要進(jìn)行動態(tài)更新。先判斷舊組件是否被當(dāng)前運行的組件強(qiáng)制依賴,如果有,則結(jié)束更新過程。(6)如果舊組件沒有被強(qiáng)制依賴,則將舊組件的狀態(tài)設(shè)置為“Updating”,將其他組件對舊組件的依賴關(guān)系標(biāo)記為“Updating”,將舊組件對其他組件的服務(wù)依賴關(guān)系標(biāo)記為“Updating”。(7)安裝加載新組件,為新組件注冊并建立服務(wù)依賴關(guān)系,將其他組件對舊組件的依賴關(guān)系遷移到新組件上來,并將依賴關(guān)系標(biāo)記為“Normal”,將新組件的狀態(tài)設(shè)置為“Runing”。新組件安裝時,將舊組件的安裝信息更名位“_old”。(8)如果新組件安裝運行正常,將系統(tǒng)中舊組件的依賴關(guān)系刪除,將安裝文件目錄中舊組件的安裝文件刪除,結(jié)束組件更新過程。(9)如果新組件在安裝加載過程中出了問題,系統(tǒng)將會退回到舊組件狀態(tài),并且結(jié)束更新過程。退回過程:將其他組件對舊組件的依賴關(guān)系記錄標(biāo)記為“Normal”;將舊組件對其他組件的服務(wù)依賴關(guān)系標(biāo)記為“Normal”;將舊組件的狀態(tài)設(shè)置為“Runing”;從安裝文件目錄中將新組件的安裝文件刪除,將舊組件的安裝文件名稱恢復(fù)成原來的名稱。
文章提出了一種嵌入式軟件組件的更新方法,并實現(xiàn)了更新過程。在嵌入式系統(tǒng)向開放式系統(tǒng)發(fā)展的道路上,軟件的復(fù)雜度越來越高,動態(tài)性和多變性的需求就越來越明顯,提供軟件系統(tǒng)的動態(tài)更新能力,保證系統(tǒng)在不停機(jī)的狀態(tài)下進(jìn)行軟件更新,將會降低人工成本,提高嵌入式系統(tǒng)的運行效率。