公務(wù)員期刊網(wǎng) 論文中心 正文

談軟件系統(tǒng)模塊間循環(huán)依賴識別

前言:想要寫出一篇引人入勝的文章?我們特意為您整理了談軟件系統(tǒng)模塊間循環(huán)依賴識別范文,希望能給你帶來靈感和參考,敬請閱讀。

談軟件系統(tǒng)模塊間循環(huán)依賴識別

摘要:軟件系統(tǒng)中各平臺多模塊開發(fā)過程中,若開發(fā)人員對自己模塊扇入、扇出盲目增刪,導(dǎo)致模塊間依賴變更,容易產(chǎn)生系統(tǒng)級循環(huán)依賴。如果模塊間產(chǎn)生循環(huán)依賴環(huán),代碼在編譯時若不清除中間生成文件,編譯生成的產(chǎn)品有極大的風(fēng)險或者采用2次編譯的方法解決。通過進(jìn)行循環(huán)依賴分析找出所有依賴環(huán)的解決辦法。

關(guān)鍵詞:循環(huán)依賴;非法依賴;多模塊;軟件工程;識別

引言

隨著當(dāng)前軟件系統(tǒng)越來越復(fù)雜,平臺越來越多,平臺包含的模塊也越來越多,開發(fā)人員在開發(fā)代碼的時候如果對模塊的依賴未按照設(shè)計要求隨意增加,容易導(dǎo)致平臺級或系統(tǒng)級別產(chǎn)生循環(huán)依賴。賈利敏等提出通過程序執(zhí)行軌跡,確定數(shù)據(jù)依賴結(jié)點(diǎn)、控制依賴結(jié)點(diǎn)和結(jié)點(diǎn)可到達(dá)語句來計算變量切片[1];不過此檢測方式粒度太細(xì),不利于軟件模塊級識別。劉杰等提出基于歸納變量的循環(huán)依賴分析方法[2],識別變量級別的循環(huán)依賴;劉鵬遠(yuǎn)等提出采用提取公共部分方法消除包級別循環(huán)依賴[3],若模塊粒度更細(xì)、數(shù)量更大的話,不易實(shí)現(xiàn);丁麗麗等基于GCC5.1針對分支嵌套循環(huán)的依賴提出計算依賴距離方法能夠快速地分析出該類循環(huán)潛在的并行性[4],但此計算類似C語言某幾條語句循環(huán)依賴,不適用于系統(tǒng)內(nèi)模塊查找循環(huán)依賴。

1依賴概述

在架構(gòu)設(shè)計合理,各平臺的依賴關(guān)系應(yīng)該是上層平臺依賴下層平臺,各模塊的扇入、扇出設(shè)計合理的前提下,整個系統(tǒng)所有模塊的依賴關(guān)系不應(yīng)該存在循環(huán)依賴。正常情況下平臺或模塊間的依賴關(guān)系應(yīng)該是上層平臺依賴下層平臺:①上層依賴下層。②上層對下層一對一或一對多。③最下層不對本平臺依賴,但可能會對下層級平臺有依賴。④最上層不會被本平臺依賴,但會被上層平臺依賴。⑤存在上層跨層依賴下層。⑥所有模塊都會被依賴。⑦所有模塊對外不重復(fù)。

2循環(huán)依賴分析與解決方案

2.1分析根因

由于平臺級的循環(huán)依賴根因也是由于各平臺對應(yīng)的模塊產(chǎn)生的模塊級循環(huán)依賴導(dǎo)致,所以可以把平臺級循環(huán)依賴和模塊級循環(huán)依賴看作相同的問題。循環(huán)依賴的根因是縱向依賴鏈上出現(xiàn)了環(huán):如A依賴B、B依賴C、C依賴A或D依賴E、E依賴F、F依賴G、G依賴D,這樣就出現(xiàn)依賴環(huán),當(dāng)然這個是比較簡單的環(huán)示例,在實(shí)際情況中,有的環(huán)路節(jié)點(diǎn)有很多個可以達(dá)到10多個模塊,如果靠人工計算,一是計算工作量比較大,另一個是容易遺漏。

2.1.1數(shù)學(xué)模型假設(shè)數(shù)學(xué)模型如下。1)假定我們當(dāng)前有一個平臺(多個平臺檢測方法類似)。2)假定這一個平臺一共有n個模塊{M1,M2,M3,…,Mn}。3)第k個模塊扇入ik個。4)第k個模塊扇出ok個。

2.1.2計算方法1)把這n個模塊所有扇出o1,o2,o3,…,on合并起來,記為AllOutputList[]。2)把這n個模塊遍歷,扇入不在AllOutputList中的刪除,因?yàn)檫@些刪除的依賴是從其他平臺引入的依賴,此步處理完后,所有模塊的扇入只來源此平臺的扇出,這樣在后續(xù)計算時,減少冗余的計算。3)選擇任意模塊作為當(dāng)前計算模塊,并檢查此模塊是否有扇入,如果有扇入則把所有扇入的父節(jié)點(diǎn)進(jìn)行統(tǒng)計并去重,并把此模塊記錄到ParentsList數(shù)組,如某模塊一共有20個扇入,其中5個扇入來源于A模塊、10個扇入來源于B模塊、另外5個扇入來源于C模塊,則此模塊的Parents數(shù)據(jù)包含A、B、C三個模塊,此時Parents里存放A、B、C;如果沒有扇入,則不計算。4)遍歷Parents數(shù)組所有成員,如A,則先把A與Par-entsList中所有元素進(jìn)行比較,檢查是否有重復(fù),若有重復(fù),則發(fā)現(xiàn)環(huán),并打印環(huán),然后出棧;若無重復(fù),則把A模塊視為當(dāng)前計算模塊,把A模塊進(jìn)行壓棧,并返回到步驟3;等數(shù)組的第一個成員完成遍歷后,繼續(xù)搜索Parents第二個成員B,并返回到步驟3,把B模塊視作模塊1進(jìn)行遞歸;如果沒有重復(fù),則把A壓棧到ParentsList;并返回到步驟3,把A模塊視作模塊1進(jìn)行遞歸,依此類推。5)在檢查的過程中如果發(fā)現(xiàn)當(dāng)前計算模塊沒有扇入,則不計算,直接返回。通過不斷查詢數(shù)組中成員數(shù)據(jù)是否包含新模塊名,再對數(shù)組進(jìn)行壓棧、出棧,再對比,這樣最終可遍歷到整個系統(tǒng)所有循環(huán)依賴環(huán)。經(jīng)過3、4、5這3步能把所有模塊所有依賴環(huán)找出來。但還有另一個問題:多個依賴環(huán)有重復(fù)的情形,假設(shè)4個模塊依賴環(huán)為:A依賴B,B依賴C,C依賴D,D依賴A,則搜索出來的結(jié)果可能出現(xiàn)環(huán)的4種情況分別為:A,B,C,D;B,C,D,A;C,D,A,B;D,A,B,C。碰到這種情形需要對這幾種環(huán)進(jìn)行去重操作,詳細(xì)處理辦法是把生成環(huán)的所有結(jié)點(diǎn)分別存放到二維數(shù)組以模塊名為單位排序后進(jìn)行比較,如果相同,則表示環(huán)相同,反之則不相同。像首尾相同的模塊:[A—B—C—D—A],這樣的環(huán)?。跘—B—C—D],此去重方法較簡單,不再贅述。

2.2測試數(shù)據(jù)來源

來源于XX產(chǎn)品XX平臺,測試模塊220個,扇入、扇出共計2000多個。

3實(shí)驗(yàn)結(jié)果與分析

通過對數(shù)據(jù)進(jìn)行計算后展示的結(jié)果如下(只展示部分?jǐn)?shù)據(jù),實(shí)際發(fā)現(xiàn)環(huán)個數(shù)72個)。從上述結(jié)果可以看出:①單模塊可能會存在于多個環(huán)。②可發(fā)現(xiàn)被其他多次循環(huán)依賴模塊。

4結(jié)語

本文通過把軟件系統(tǒng)中模塊名視為樹節(jié)點(diǎn),通過深度遍歷優(yōu)先算法進(jìn)行查找模塊間依賴環(huán),不斷對縱向依賴鏈進(jìn)行先判斷再壓棧,若對下層無依賴則出棧,遞歸查詢所有依賴環(huán),并且給出多種依賴環(huán)去重的方法,最終發(fā)現(xiàn)所有模塊所有依賴環(huán)。不過還有一個問題,當(dāng)前方法查找出來的依賴環(huán)不具備給架構(gòu)師詳細(xì)依賴接口的能力,需要在代碼實(shí)現(xiàn)的時候壓棧、出棧時把父子節(jié)點(diǎn)之間的接口關(guān)系也添加上,這個難度也不大,不再贅述。

參考文獻(xiàn):

[1]賈利敏,張忠林.一種簡化依賴關(guān)系的動態(tài)程序切片算法[J].鄭州大學(xué)學(xué)報,2009,30(2):84-87.

[2]劉杰,曹琰,魏強(qiáng),等.符號執(zhí)行中的循環(huán)依賴分析方法[J].計算機(jī)工程,2012,38(22):24-33.

[3]劉鵬遠(yuǎn),鄧沌華,李祥.不同粒度循環(huán)依賴的消去方法[J].信息通信,2013(6):9-10.

[4]丁麗麗,李雁冰,張素平,等.分支嵌套循環(huán)的自動并行化研究[J].計算機(jī)科學(xué),2017,44(5):14-52.

作者:任啟紅 黃輝 周鋒 王永亮 單位:三江學(xué)院計算機(jī)科學(xué)與工程學(xué)院