專利名稱:控制動(dòng)態(tài)鏈接庫(kù)dll加載狀態(tài)的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及流應(yīng)用程序和動(dòng)態(tài)鏈接庫(kù)(DLL, Dynamic LinkedLibrary),更具體地,涉及在流應(yīng)用程序中控制動(dòng)態(tài)鏈接庫(kù)的加載和卸載的裝置和方法。
背景技術(shù):
動(dòng)態(tài)鏈接庫(kù)(DLL)是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫(kù)。在現(xiàn)有的操作系統(tǒng)中,大量功能是由動(dòng)態(tài)鏈接庫(kù)(DLL)提供的。例如,在Windows操作系統(tǒng)中,Comdlg32DLL執(zhí)行與對(duì)話框有關(guān)的常見函數(shù)。因此,每個(gè)程序都可以使用該DLL中包含的功能來(lái)實(shí)現(xiàn)"打開"對(duì)話框。此外,在操作系統(tǒng)上運(yùn)行的應(yīng)用程序的很多功能也可以是由DLL提供的。例如,某些應(yīng)用程序可能包含很多不同的模塊,而該程序的每個(gè)模塊都包含在DLL中并從中分發(fā)。 使用DLL有助于促進(jìn)代碼的模塊化、代碼重用、內(nèi)存的有效使用和減少所占用的磁盤空間。因此,操作系統(tǒng)和程序能夠更快地加載和運(yùn)行,并且在計(jì)算機(jī)中占用較少的磁盤空間。 在目前的運(yùn)行模式下,操作系統(tǒng)在一個(gè)DLL第一次被調(diào)用時(shí)將其加載,在調(diào)用該DLL的程序結(jié)束時(shí)將其卸載,或者直到其后需要內(nèi)存時(shí)才卸載不再需要的DLL。然而,在多數(shù)流式應(yīng)用程序或流應(yīng)用程序(streaming即plication)中,主程序通常是常年運(yùn)行的。在主程序運(yùn)行期間,通常會(huì)調(diào)用大量的DLL。在這些大量的DLL中,大部分都是周期性調(diào)用和激活(active)的。然而,對(duì)于流程序語(yǔ)言來(lái)說,由于其不支持分支結(jié)構(gòu),通常不能對(duì)DLL加載卸載的條件進(jìn)行定義,因此無(wú)法對(duì)DLL的加載卸載狀態(tài)進(jìn)行適當(dāng)?shù)目刂?。?duì)于操作系統(tǒng)來(lái)說,系統(tǒng)只能判斷一個(gè)程序是否結(jié)束,而無(wú)法自己判斷一個(gè)運(yùn)行之中的程序所調(diào)用的DLL是否需要卸載。因此,盡管有些DLL在程序運(yùn)行中已經(jīng)不再需要,但是系統(tǒng)仍然不能將其識(shí)別出來(lái),因而不能在適當(dāng)時(shí)候?qū)ζ溥M(jìn)行加載或卸載。 不必要的運(yùn)行DLL對(duì)于系統(tǒng)來(lái)說會(huì)帶來(lái)一些問題。首先是內(nèi)存空間的浪費(fèi)。通過對(duì)系統(tǒng)運(yùn)行線程的監(jiān)視,運(yùn)行DLL時(shí)一個(gè)線程常常會(huì)占用上百兆的內(nèi)存空間。其次,對(duì)于已經(jīng)加載的DLL,系統(tǒng)必須定時(shí)地核查、監(jiān)控該DLL的運(yùn)行狀態(tài)以確認(rèn)其正常運(yùn)行。因此如果不能適時(shí)卸載不需要的DLL,系統(tǒng)核查這些不再需要的DLL時(shí)所需的資源和時(shí)間也是一種浪費(fèi)。 因此,希望提供一種方案,能夠?qū)LL的加載卸載狀態(tài)進(jìn)行控制,從而提高系統(tǒng)的資源利用率。
發(fā)明內(nèi)容
考慮到上述問題,本發(fā)明提供一種在流程序中控制DLL加載狀態(tài)的方法、編譯器和系統(tǒng)。 根據(jù)本發(fā)明第一方面,提供一種流程序編譯器,用于對(duì)包括至少一個(gè)操作模塊的流程序進(jìn)行編譯,所述至少一個(gè)操作模塊在所述流程序執(zhí)行期間需要調(diào)用至少一個(gè)DLL,所
4述編譯器包括關(guān)聯(lián)表生成單元,被配置為根據(jù)用戶定義的至少一條規(guī)則生成關(guān)聯(lián)表,該關(guān) 聯(lián)表包括至少一個(gè)條目,每一個(gè)條目指示流程序的一種流分支和該流分支對(duì)應(yīng)的至少一個(gè) 操作模塊;以及觸發(fā)器生成單元,被配置為根據(jù)所述用戶定義的至少一條規(guī)則生成觸發(fā)器, 所述觸發(fā)器用于判斷所述流程序適用的條件,將該條件映射至流分支,并發(fā)出指示該流分 支的觸發(fā)信號(hào)。 根據(jù)本發(fā)明第二方面,提供一種控制流程序中動(dòng)態(tài)鏈接庫(kù)(DLL)加載狀態(tài)的裝 置,所述流程序包括至少一個(gè)操作模塊,所述至少一個(gè)操作模塊在所述流程序執(zhí)行期間需 要調(diào)用至少一個(gè)DLL,所述裝置包括控制器,所述控制器包括操作模塊確定單元,被配置 為響應(yīng)于接收指示流分支的觸發(fā)信號(hào),查找記錄有流分支和操作模塊對(duì)應(yīng)關(guān)系的關(guān)聯(lián)表, 確定所述流分支對(duì)應(yīng)的操作模塊;以及DLL控制單元,被配置為根據(jù)所述流分支對(duì)應(yīng)的操 作模塊卸載不使用的操作模塊所調(diào)用的DLL。 根據(jù)本發(fā)明第三方面,提供一種控制流程序中DLL加載狀態(tài)的方法,所述流程序 包括至少一個(gè)操作模塊,所述至少一個(gè)操作模塊在所述流程序執(zhí)行期間需要調(diào)用至少一個(gè) DLL,所述方法包括響應(yīng)于接收指示流分支的觸發(fā)信號(hào),查找記錄有流分支和操作模塊對(duì) 應(yīng)關(guān)系的關(guān)聯(lián)表,確定所述流分支對(duì)應(yīng)的操作模塊;以及根據(jù)所述流分支對(duì)應(yīng)的操作模塊 卸載不使用的操作模塊所調(diào)用的DLL。 通過本發(fā)明以上方面的裝置和方法,用戶可以通過以流程序定義DLL的控制邏輯 或規(guī)則,來(lái)實(shí)現(xiàn)對(duì)DLL加載狀態(tài)的自由控制,從而節(jié)省大量的計(jì)算資源。
以下結(jié)合
本發(fā)明的具體實(shí)施例,其中 圖1示出根據(jù)本發(fā)明一個(gè)實(shí)施例的編譯器的結(jié)構(gòu)示意圖; 圖2示出根據(jù)本發(fā)明實(shí)施例的一段示例性流程序代碼; 圖3示出圖2所示的流程序所涉及的操作模塊; 圖4A示出圖2的流程序的第一流分支中的操作模塊的連接示意圖; 圖4B示出圖2的流程序的第二流分支中的操作模塊的連接示意圖; 圖5示出根據(jù)本發(fā)明實(shí)施例的一個(gè)關(guān)聯(lián)表; 圖6示出根據(jù)本發(fā)明一個(gè)實(shí)施例的控制裝置的結(jié)構(gòu)示意圖; 圖7示出根據(jù)本發(fā)明一個(gè)實(shí)施例的編譯流程序的流程圖; 圖8示出根據(jù)本發(fā)明一個(gè)實(shí)施例的控制DLL加載狀態(tài)的方法的流程圖;以及 圖9示出控制器對(duì)流程序操作模塊的控制示意圖。
具體實(shí)施例方式
本發(fā)明希望能夠提供一種方案,該方案能夠?qū)LL的加載狀態(tài)進(jìn)行適當(dāng)?shù)目刂啤?
為了適當(dāng)控制DLL的加載和卸載,就必須知道DLL的控制邏輯,也就是,在一個(gè)程 序運(yùn)行期間,哪些DLL必須激活,哪些DLL不再需要從而可以卸載,以及加載和卸載這些DLL 的條件。在現(xiàn)有的應(yīng)用程序和操作系統(tǒng)中,DLL的設(shè)計(jì)者顯然并不適于描述這樣的控制邏 輯。了解應(yīng)用程序的算法和邏輯的只有程序的設(shè)計(jì)者或程序員。因此,只能由程序設(shè)計(jì)者 或程序員來(lái)定義加載或卸載特定DLL的控制邏輯。然而,對(duì)于流應(yīng)用程序來(lái)說,由于流程序語(yǔ)言并不支持分支結(jié)構(gòu),也就是不能對(duì)條件進(jìn)行比較、判斷和選擇,因此程序設(shè)計(jì)者通常不 能用流程序語(yǔ)言定義加載或卸載的DLL條件和控制邏輯。 具體地,流應(yīng)用程序所采用的流程序語(yǔ)言有很多種,如SPUR、 Cg、 Baker、 Spidle、 Streamlt、StreamC/KernelC、Brook、Sequoia等。下面以Streamlt為例,說明流程序的基本 特點(diǎn)。Streamlt是面向RAW開發(fā)的一種編程語(yǔ)言,是Java語(yǔ)法的一個(gè)子集擴(kuò)充。它將流處 理器的處理過程看作一個(gè)一個(gè)的單輸入輸出流計(jì)算模塊filter,而流則看作連接filter 之間的數(shù)據(jù)通路。多個(gè)filter通過流水(pipeline)、分割合并(splitjoin)和反饋循環(huán) (feedbackloop)三種結(jié)構(gòu)組成一個(gè)通信網(wǎng)絡(luò),該通信網(wǎng)絡(luò)被映射到各個(gè)Tile上并行執(zhí)行。 其他流程序語(yǔ)言在處理的流數(shù)據(jù)類型、流的級(jí)別等各方面互有不同??傮w來(lái)說,可以認(rèn)為流 程序包括多個(gè)操作模塊,例如Streamlt中的filter。每一操作模塊對(duì)輸入數(shù)據(jù)流進(jìn)行一定 的操作,并產(chǎn)生輸出數(shù)據(jù)流。為了執(zhí)行特定操作,一個(gè)操作模塊可以調(diào)用一個(gè)或多個(gè)DLL。
基于流程序的流式處理特點(diǎn),現(xiàn)有的上述流程序語(yǔ)言并不支持分支結(jié)構(gòu)。然而,為 了控制DLL的加載狀態(tài),必須知道被調(diào)用的DLL的控制邏輯,也就是必須將流程序中涉及的 各個(gè)操作模塊之間的控制邏輯描述出來(lái)。這就帶來(lái)了現(xiàn)有的流程序編譯器和系統(tǒng)無(wú)法解決 的問題。 考慮到上述問題,本發(fā)明提供一種裝置和方法,能夠在編譯階段對(duì)用戶,也就是程 序員以流程序語(yǔ)言定義的DLL控制邏輯進(jìn)行編譯和解讀,并在流程序執(zhí)行階段根據(jù)這樣的 控制邏輯來(lái)監(jiān)視加載、卸載DLL的條件,并在條件成立時(shí)執(zhí)行相應(yīng)的加載卸載操作,由此實(shí) 現(xiàn)由用戶自由控制DLL的加載狀態(tài)。 圖1示出根據(jù)本發(fā)明一個(gè)實(shí)施例的編譯器的結(jié)構(gòu)示意圖。該編譯器總體由附圖標(biāo) 記100標(biāo)識(shí)。如圖1所示,編譯器100包括關(guān)聯(lián)表生成單元102,被配置為根據(jù)用戶定義的 至少一條規(guī)則生成關(guān)聯(lián)表,該關(guān)聯(lián)表包括至少一個(gè)條目,每一個(gè)條目指示流程序的一種流 分支和該流分支對(duì)應(yīng)的至少一個(gè)操作模塊;以及觸發(fā)器生成單元104,被配置為根據(jù)所述 用戶定義的至少一條規(guī)則生成觸發(fā)器,所述觸發(fā)器用于判斷所述流程序適用的條件,將該 條件映射至流分支,并發(fā)出指示該流分支的觸發(fā)信號(hào)。如上所述,關(guān)聯(lián)表和觸發(fā)信號(hào)都是在 讀取用戶定義的至少一條規(guī)則的基礎(chǔ)上產(chǎn)生的。用戶定義的規(guī)則可以被稱為控制規(guī)則,是 針對(duì)一個(gè)流應(yīng)用程序以流程序語(yǔ)言定義的。該控制規(guī)則用于描述該流應(yīng)用程序中調(diào)用DLL 所基于的控制邏輯。下面說明流程序調(diào)用DLL的特點(diǎn)以及上述控制規(guī)則的描述方法。
下面以一段示例性代碼為例說明規(guī)則的定義。圖2示出根據(jù)本發(fā)明實(shí)施例的一段 示例性流程序代碼,該示例性代碼包括了用戶對(duì)DLL控制規(guī)則的定義。圖3示出圖2所示 的流程序所涉及的操作模塊。如圖2和圖3所示,該示例性流程序涉及8個(gè)操作模塊Pl, P2, . . . , P8,這些操作模塊在圖3中分別以數(shù)字1-8標(biāo)示,從這些操作模塊流出的數(shù)據(jù)流分 別以Sl, S2,. . . , S8表示。簡(jiǎn)單起見,假定每個(gè)操作模塊在執(zhí)行期間需要調(diào)用一個(gè)DLL,分別 記為DLL1,DLL2,... ,DLL8。這些操作模塊以一定邏輯順序連接起來(lái),構(gòu)成一個(gè)流程序。操 作模塊之間的連接在圖3中以操作模塊之間的帶方向的連線示出,在圖2中以特定形式用 流程序語(yǔ)言描述。在一般的流程序中,各個(gè)操作模塊之間的連接符合直接無(wú)循環(huán)圖形(DAG, directed acyclic graph)。具體地,在圖2的流程序語(yǔ)言中,以下面的形式表示操作模塊 和數(shù)據(jù)流之間的關(guān)系 輸出數(shù)據(jù)流=操作模塊(輸入數(shù)據(jù)流)[對(duì)操作模塊的修改]{}因此,Sn二Pn(Sm)[]{}就表示從操作模塊Pm流出的數(shù)據(jù)Sm是操作模塊Pn的輸入數(shù)據(jù)流,由Pn操作和處理 之后,成為數(shù)據(jù)流Sn流出,也就意味著,操作模塊Pm與Pn相連。利用這樣的形式,用戶可 以描述出操作模塊之間的數(shù)據(jù)流向,從而構(gòu)建一個(gè)完整的流程序。此外,用戶也可以采用上 述形式,定義操作模塊之間的邏輯,也就是DLL的控制規(guī)則。 在圖2所示的代碼中,從T1開始的代碼表示用戶對(duì)控制規(guī)則的定義。在定義規(guī)則 的代碼中,不僅包含有上述的多個(gè)操作模塊以及其連接關(guān)系,還包括對(duì)不同流分支的定義, 這些流分支成立的條件和監(jiān)視這些條件的觸發(fā)器。具體地,Tl表示第一種流分支,T2表示 第二種流分支。T1,T2后面的幾個(gè)語(yǔ)句分別定義在第一、第二流分支中,數(shù)據(jù)流在各個(gè)操作 模塊之間的流向。最后的一個(gè)語(yǔ)句用關(guān)鍵詞"TRG"描述了該流分支成立的條件和觸發(fā)器。 具體地,在CI條件下,該流程序按照第一流分支Tl運(yùn)行,在C2條件下,該流程序按照第二 流分支運(yùn)行。并且,"TRG"寫在操作模塊P5后面的[]中,因此,是對(duì)操作模塊P5的進(jìn)一步 修改和限定。也就是說,觸發(fā)器是嵌入在P5中的,每到流程序運(yùn)行到操作模塊P5時(shí),就要 執(zhí)行條件的判斷和觸發(fā)。 可以理解,上述流程序可以采用現(xiàn)有的各種流程序語(yǔ)言來(lái)實(shí)現(xiàn)。在上述的示例性 代碼中,用戶在主程序中以一段腳本定義了操作模塊的控制邏輯和規(guī)則。然而,在其他實(shí)施 方式中,用戶也可以在一個(gè)獨(dú)立的文件中,用流程序語(yǔ)言描述上述規(guī)則。在描述規(guī)則的過程 中,用戶可以根據(jù)需要定義各種流分支、流分支成立的條件以及觸發(fā)方法,而不限于以上給 出的示例性代碼中給出的例子。例如,根據(jù)需要,用戶可以對(duì)上述代碼中的條件C1,C2給出 詳細(xì)定義,如Cl為A > B, C2為A < B,其中A和B為操作模塊P5中的兩個(gè)變量。在條件 的成立涉及某些操作模塊內(nèi)部的數(shù)據(jù)時(shí),通常判斷條件是否成立的觸發(fā)器要嵌入在操作模 塊之內(nèi),如圖2的示例性代碼中所示。在其他實(shí)施方式中,用戶也可以在操作模塊外部定義 一個(gè)觸發(fā)器,例如TRG(T3 = throughput() > 5GBPS)??梢岳斫猓撚|發(fā)器是單獨(dú)定義的, 并沒有寫在某個(gè)操作模塊的解釋[]內(nèi),因而并沒有嵌入操作模塊內(nèi)部。依據(jù)該觸發(fā)器的定 義,設(shè)定了一個(gè)新的流分支T3,該流分支成立的條件為throughput () > 5GBPS。因此,該觸 發(fā)器可用于監(jiān)視數(shù)據(jù)的輸出,并在輸出量大于5GBPS時(shí)觸發(fā)流程序按照T3的流分支運(yùn)行。
在用戶定義了上述規(guī)則之后,關(guān)聯(lián)表生成單元102根據(jù)上述規(guī)則,產(chǎn)生關(guān)聯(lián)表,該 關(guān)聯(lián)表用于示出每一種流分支和該流分支對(duì)應(yīng)的操作模塊。下面仍然以圖2的示例性代碼 為例,說明該關(guān)聯(lián)表的產(chǎn)生。 首先,分析上述規(guī)則中對(duì)第一流分支的定義。對(duì)第一流分支的定義為
Tl : S7 = P7(S6, Sl) [ ] { } S3 = P3 (S7) S8 = P8 (S3) [ ]{ } P5 (S8) [TRG (Tl = Cl , T2 = C2) . ] {} 關(guān)聯(lián)表生成模塊102分析前三個(gè)語(yǔ)句可知,分別從操作模塊P6, Pl輸出的數(shù)據(jù)S6, Sl被輸入到操作模塊P7,經(jīng)P7操作之后的數(shù)據(jù)流S7接著被輸入到操作模塊P3,經(jīng)P3處 理之后成為數(shù)據(jù)流S3。之后,操作模塊P8對(duì)數(shù)據(jù)流S3進(jìn)行處理,輸出數(shù)據(jù)流S8。最后,S8 流入操作模塊P5,在P5中嵌入有觸發(fā)器。通過這樣的分析,可以得到如圖4A所示的第一流 分支中的操作模塊的連接示意圖。通過對(duì)比圖4A與圖3可以看出,相比于圖3中流程序所
7涉及的所有操作模塊的連接圖,圖4A的流分支中減少了操作模塊P2和P4,以及所有與P2 和P4相關(guān)聯(lián)的連線。這就意味著,在T1流分支下,并不需要運(yùn)行操作模塊P2, P4,也就不 需要加載P2和P4所調(diào)用的DLL。 類似的,分析上述規(guī)則中對(duì)第二流分支的定義,可以得到如圖4B所示的示意圖。 對(duì)比圖4B與圖3可以看出,相比于圖3,圖4A的流分支中減少了操作模塊P8以及Pl和P7 之間的連線。 為了更清楚示出上述流分支下所述流程序所使用的操作模塊,關(guān)聯(lián)表生成單元 102用條件關(guān)聯(lián)表的方式示出上述流分支和涉及的操作模塊之間的關(guān)聯(lián)。圖5示出根據(jù)本 發(fā)明實(shí)施例的一個(gè)關(guān)聯(lián)表。該關(guān)聯(lián)表對(duì)應(yīng)于圖2所示的示例性代碼中所定義的規(guī)則。如圖 5所示,該關(guān)聯(lián)表有3個(gè)條目,最后一個(gè)條目是流程序所涉及的所有操作模塊以及這些操作 模塊之間的連接關(guān)系。具體地,數(shù)字1即表示操作模塊P1,(1,2)即表示操作模塊P1與P2 之間相連。關(guān)聯(lián)表的第一個(gè)條目是流分支T1與該流分支下操作模塊的對(duì)應(yīng)關(guān)系。在該實(shí) 施例中,關(guān)聯(lián)表以_2, _4的形式示出,在流分支Tl中,所需的操作模塊相比于條目3中的所 有模塊缺少了操作模塊P2和P4。同樣的,在第二個(gè)條目中,以-8, -(1,7)的形式示出,將 條目3中的操作模塊和連接關(guān)系去除掉模塊P8和模塊P1、 P7之間的連線將會(huì)得到流分支 T2。 可以理解,關(guān)聯(lián)表的形式并不局限于圖5所示的形式。例如,在其他實(shí)施例中,可
以通過列出所需的操作模塊,而不是要去除的操作模塊,來(lái)描述一個(gè)流分支。 在用戶定義的規(guī)則中,除了描述特定流分支對(duì)應(yīng)的操作模塊,還定義了觸發(fā)該流
分支的條件。因此,觸發(fā)器生成單元104需要生成相應(yīng)的觸發(fā)器,并使得該觸發(fā)器能夠根據(jù)
用戶定義的規(guī)則,判斷所述流程序適用的條件,將該條件映射為流程序適用的流分支,并發(fā)
出指示該流分支的觸發(fā)信號(hào)。具體地,仍然以圖2示出的示例性代碼為例,說明觸發(fā)器生成
單元104生成觸發(fā)器的過程。 在圖2示出的代碼中,用戶以關(guān)鍵字TRG定義了一個(gè)觸發(fā)器TRG(T1 = Cl, T2 = C2),并將該觸發(fā)器嵌入在操作模塊P5中。這意味著,用戶希望程序運(yùn)行至操作模塊P5時(shí), 生成的觸發(fā)器判斷條件C1和C2是否成立。如果條件C1成立,觸發(fā)器就發(fā)出一個(gè)信號(hào)SG1, 該信號(hào)指示出目前條件Cl成立,流程序需要按照Tl的流分支來(lái)運(yùn)行。如果條件C2成立, 觸發(fā)器就發(fā)出信號(hào)SG2,指示出要執(zhí)行的流分支T2。 如前所述,常規(guī)的流程序語(yǔ)言并不支持分支結(jié)構(gòu),相應(yīng)地,對(duì)應(yīng)的編譯器也不能解 讀和編譯用戶對(duì)觸發(fā)條件的定義和描述。為此,觸發(fā)器生成單元104對(duì)用戶定義的觸發(fā)器 的邏輯進(jìn)行分析,并用支持分支結(jié)構(gòu)的語(yǔ)言產(chǎn)生一段反映該邏輯的程序代碼來(lái)實(shí)現(xiàn)觸發(fā)器 的功能。實(shí)際上,盡管流程序語(yǔ)言本身不支持分支結(jié)構(gòu),但是流程序中包含的操作模塊通常 是由支持分支結(jié)構(gòu)的程序語(yǔ)言,例如C/C++, Java等構(gòu)建的。例如對(duì)于StreamIT,操作模塊 是由Java構(gòu)建的。這時(shí),對(duì)于嵌入在操作模塊中的觸發(fā)器,觸發(fā)器生成單元104可以將觸 發(fā)器的判斷邏輯同樣以Java寫入操作模塊中。具體地,對(duì)于圖2所示的代碼中的觸發(fā)器, 就可以用諸如多個(gè)if語(yǔ)句將判斷條件Cl, C2并相應(yīng)產(chǎn)生觸發(fā)信號(hào)SG1, SG2的邏輯寫入操 作模塊P5。對(duì)于非嵌入式的觸發(fā)器,觸發(fā)器生成單元104在進(jìn)行觸發(fā)器條件編譯時(shí)直接將 其判斷邏輯添加至主程序即可。這樣,在執(zhí)行流程序時(shí),就能夠?qū)α鞒绦蜻m用的條件進(jìn)行判 斷,并產(chǎn)生相應(yīng)的觸發(fā)信號(hào)。
在流程序編譯階段根據(jù)用戶定義的規(guī)則產(chǎn)生關(guān)聯(lián)表和觸發(fā)器的基礎(chǔ)上,就可以在 執(zhí)行該流程序時(shí),對(duì)流程序所使用的操作模塊和調(diào)用的DLL進(jìn)行控制了 。對(duì)DLL加載狀態(tài)的 直接控制由操作系統(tǒng)中對(duì)應(yīng)于運(yùn)行時(shí)的控制裝置來(lái)執(zhí)行。圖6示出根據(jù)本發(fā)明一個(gè)實(shí)施例 的控制裝置的結(jié)構(gòu)示意圖。在該實(shí)施例中,控制裝置表現(xiàn)為一個(gè)控制器600。如圖所示,該 控制器600包括操作模塊確定單元602,被配置為響應(yīng)于接收指示流分支的觸發(fā)信號(hào),查找 記錄有流分支和操作模塊對(duì)應(yīng)關(guān)系的關(guān)聯(lián)表,確定所述流分支對(duì)應(yīng)的操作模塊;以及DLL 控制單元604,被配置為根據(jù)所述流分支對(duì)應(yīng)的操作模塊卸載不使用的操作模塊所調(diào)用的 DLL。下面結(jié)合圖2的代碼和圖5所示的關(guān)聯(lián)表描述控制器600的操作。
如上所述,在流程序編譯階段,編譯器已經(jīng)生成了關(guān)聯(lián)表和觸發(fā)器。所述關(guān)聯(lián)表通 常存儲(chǔ)在系統(tǒng)的緩存中。所述觸發(fā)器在該流程序執(zhí)行階段,能夠通過判斷流程序滿足的條 件產(chǎn)生指示一個(gè)流分支的觸發(fā)信號(hào)。在此基礎(chǔ)上,操作模塊確定單元602首先對(duì)產(chǎn)生的觸 發(fā)信號(hào)進(jìn)行分析。結(jié)合圖2的代碼,如果觸發(fā)信號(hào)為SG1,則指示了T1分支。進(jìn)一步地,操 作模塊確定單元602查詢編譯階段生成的關(guān)聯(lián)表,例如,圖5所示的關(guān)聯(lián)表,由此可以得到 Tl分支所涉及的操作模塊以及連接關(guān)系。具體地,相對(duì)于流程序所涉及的全部操作模塊,在 流分支Tl中,操作模塊P2和P4不再需要,因此,操作模塊P2,P4所分別調(diào)用的DLL2,DLL4 也可以被卸載。在獲得這樣的信息的基礎(chǔ)上,DLL控制單元604就可以卸載所述不需要的 操作模塊所調(diào)用的DLL。為了執(zhí)行DLL的卸載,在一個(gè)實(shí)施例中,DLL控制單元604可以向 操作模塊P2, P4發(fā)出結(jié)束指令,并調(diào)用卸載函數(shù),例如dll. close (),來(lái)卸載DLL2和DLL4。 也可以通過上述結(jié)束指令,使得操作模塊P2,P4自己調(diào)用卸載函數(shù),卸載相應(yīng)的DLL。類似 地,如果觸發(fā)信號(hào)為SG2,則指示了 T2分支。操作模塊確定單元602通過查詢關(guān)聯(lián)表可以 得到T2分支對(duì)應(yīng)的操作模塊。進(jìn)一步地,DLL控制單元604通過向不再需要的操作模塊發(fā) 出結(jié)束指令,可以卸載這些模塊所調(diào)用的DLL。由此,通過用戶自定義的規(guī)則,實(shí)現(xiàn)了對(duì)DLL 加載狀態(tài)的控制。 在一個(gè)實(shí)施例中,用于直接控制DLL加載狀態(tài)的控制器600由添加到操作系統(tǒng)中
的一段固定代碼來(lái)實(shí)現(xiàn)。該實(shí)施例適于接收固定形式的觸發(fā)信號(hào),查閱固定格式的關(guān)聯(lián)表,
并產(chǎn)生固定形式的加載/卸載命令。因此,對(duì)于固定格式的關(guān)聯(lián)表和觸發(fā)信號(hào),這樣的控制
器是有利的。在另一種實(shí)施例中,控制器600可以由編譯器100在編譯流程序和規(guī)則時(shí)現(xiàn)
場(chǎng)生成,并在流程序的執(zhí)行階段對(duì)DLL的加載狀態(tài)進(jìn)行直接控制。相應(yīng)地,編譯器100可選
地還可以包括控制器生成單元(未示出),用于生成如圖6所示的控制器。 以上的實(shí)施例都是結(jié)合圖2所示的示例性代碼進(jìn)行描述的??梢岳斫?,對(duì)于其他
以流程序語(yǔ)言定義的規(guī)則,可以用類似的編譯器對(duì)規(guī)則進(jìn)行編譯,產(chǎn)生關(guān)聯(lián)表和觸發(fā)器,并
用類似的控制器根據(jù)觸發(fā)信號(hào)和關(guān)聯(lián)表卸載特定分支對(duì)應(yīng)的DLL。然而,可以理解,所述規(guī)
則、關(guān)聯(lián)表、觸發(fā)信號(hào)都可以采用多種形式來(lái)實(shí)現(xiàn)。本領(lǐng)域技術(shù)人員可以在說明書教導(dǎo)之下
根據(jù)用戶定義的規(guī)則相應(yīng)地設(shè)計(jì)編譯器和控制器。 基于同一發(fā)明構(gòu)思,本發(fā)明還提供與上述編譯器和控制器對(duì)應(yīng)的執(zhí)行方法。
圖7示出根據(jù)本發(fā)明一個(gè)實(shí)施例的編譯流程序的流程圖。如圖7所示,首先在步 驟702,讀取用戶定義的控制規(guī)則。該控制規(guī)則由流程序語(yǔ)言定義。在步驟704中,根據(jù)上 述規(guī)則,產(chǎn)生關(guān)聯(lián)表,該關(guān)聯(lián)表用于示出每一種流分支和該流分支對(duì)應(yīng)的操作模塊。具體 地,對(duì)于圖2所示的流程序代碼,通過分析用戶定義的控制規(guī)則,可以生成如圖5所示的關(guān)
9聯(lián)表。在圖5中,該關(guān)聯(lián)表有3個(gè)條目,分別示出T1,T2流分支和不區(qū)分流分支的情況下流 程序所涉及的操作模塊以及操作模塊之間的連接關(guān)系。可以理解,關(guān)聯(lián)表的形式并不局限 于圖5所示的形式。 在步驟706中,根據(jù)用戶定義的規(guī)則,生成觸發(fā)器,該觸發(fā)器用于判斷所述流程序 適用的條件,將該條件映射為流程序適用的流分支,并發(fā)出指示該流分支的觸發(fā)信號(hào)。具體 地,在步驟706中通過對(duì)用戶定義的觸發(fā)器的邏輯進(jìn)行分析,用支持分支結(jié)構(gòu)的語(yǔ)言產(chǎn)生 一段反映該邏輯的程序代碼作為觸發(fā)器。對(duì)于嵌入在操作模塊中的觸發(fā)器,在步驟706中 將觸發(fā)器的判斷邏輯代碼寫入操作模塊中。 編譯生成的觸發(fā)器在流程序的執(zhí)行階段,就能夠?qū)α鞒绦蜻m用的條件進(jìn)行判斷, 并產(chǎn)生相應(yīng)的觸發(fā)信號(hào)。基于產(chǎn)生的觸發(fā)信號(hào)和編譯生成的關(guān)聯(lián)表,在執(zhí)行該流程序時(shí),就 能夠?qū)α鞒绦蛑猩婕暗腄LL進(jìn)行控制。 圖8示出根據(jù)本發(fā)明一個(gè)實(shí)施例的控制DLL加載狀態(tài)的方法的流程圖。如圖所示, 在步驟802,響應(yīng)于接收指示流分支的觸發(fā)信號(hào),查找記錄有流分支和操作模塊對(duì)應(yīng)關(guān)系的 關(guān)聯(lián)表,確定該流分支對(duì)應(yīng)的操作模塊;在步驟804,根據(jù)所述流分支對(duì)應(yīng)的操作模塊卸載 不使用的操作模塊所調(diào)用的DLL。 具體地,在步驟802中,首先對(duì)接收的觸發(fā)信號(hào)進(jìn)行分析。在一個(gè)實(shí)施例中,該觸 發(fā)信號(hào)由編譯器生成的觸發(fā)器產(chǎn)生。對(duì)于圖2所示的示例性流程序代碼,如果觸發(fā)信號(hào)為 SG1,則指示了 Tl分支。接著查詢圖5所示的關(guān)聯(lián)表,獲得Tl分支所涉及的操作模塊以及 連接關(guān)系。具體地,相對(duì)于流程序所涉及的全部操作模塊,在流分支T1中,操作模塊P2和 P4不再需要,因此,操作模塊P2, P4所分別調(diào)用的DLL2, DLL4可以被卸載。在獲得這些信 息的基礎(chǔ)上,在步驟804中,控制執(zhí)行DLL的卸載。具體地,可以向操作模塊P2, P4發(fā)出結(jié) 束指令,并調(diào)用卸載函數(shù),例如dll. close (),來(lái)卸載DLL2和DLL4。類似地,如果觸發(fā)信號(hào) 為SG2,則指示了T2分支。通過查詢關(guān)聯(lián)表可以得到T2分支對(duì)應(yīng)的操作模塊。進(jìn)一步地, 在步驟804中通過向不再需要的操作模塊發(fā)出結(jié)束指令,可以卸載這些模塊所調(diào)用的DLL。 由此,通過用戶自定義的規(guī)則,實(shí)現(xiàn)了對(duì)DLL加載狀態(tài)的控制。 圖9示出控制器對(duì)流程序操作模塊的控制示意圖。對(duì)比圖3可以看出,圖9在圖3 的流程序操作模塊外部添加了 一個(gè)控制器。該控制器可以是由編譯器生成,也可以由一段 固定的代碼來(lái)實(shí)現(xiàn)。如圖9所示,在流程執(zhí)行時(shí),控制器從嵌入在操作模塊P5中的觸發(fā)器 讀取觸發(fā)信號(hào),根據(jù)該觸發(fā)信號(hào)和關(guān)聯(lián)表產(chǎn)生控制指令。例如,在接收到的觸發(fā)信號(hào)為SG1 時(shí),控制器向操作模塊P2,P4發(fā)出DLL卸載指令,如虛線箭頭所示;在接收到的觸發(fā)信號(hào)為 SG2時(shí),控制器向操作模塊P8發(fā)出DLL卸載指令,如實(shí)線箭頭所示。 可以理解,圖1的編譯器和圖6的控制器分別可以用來(lái)執(zhí)行圖7和圖8所示的編 譯方法和控制DLL加載狀態(tài)的方法。由此,用戶通過定義規(guī)則,可以實(shí)現(xiàn)對(duì)DLL加載狀態(tài)的 自由控制,從而節(jié)省系統(tǒng)的計(jì)算資源。 本領(lǐng)域技術(shù)人員可以理解,上述的編譯器、控制器及其方法可以使用計(jì)算機(jī)可執(zhí) 行指令和/或包含在處理器控制代碼中來(lái)實(shí)現(xiàn),例如在諸如磁盤、CD或DVD-ROM的載體介 質(zhì)、諸如只讀存儲(chǔ)器(固件)的可編程的存儲(chǔ)器或者諸如光學(xué)或電子信號(hào)載體的數(shù)據(jù)載體 上提供了這樣的代碼。本實(shí)施例的控制器、編譯器及其單元、模塊可以由諸如超大規(guī)模集成 電路或門陣列、諸如邏輯芯片、晶體管等的半導(dǎo)體、或者諸如現(xiàn)場(chǎng)可編程門陣列、可編程邏輯設(shè)備等的可編程硬件設(shè)備的硬件電路實(shí)現(xiàn),也可以用由各種類型的處理器執(zhí)行的軟件實(shí) 現(xiàn),也可以由上述硬件電路和軟件的結(jié)合實(shí)現(xiàn)。 雖然以上結(jié)合具體實(shí)施例,尤其是結(jié)合一個(gè)示例性程序代碼,對(duì)本發(fā)明的控制DLL 加載狀態(tài)的裝置以及方法進(jìn)行了詳細(xì)描述,但本發(fā)明并不限于此。本領(lǐng)域普通技術(shù)人員能 夠在說明書教導(dǎo)之下對(duì)本發(fā)明進(jìn)行多種變換、替換和修改而不偏離本發(fā)明的精神和范圍, 例如對(duì)規(guī)則定義的方式、關(guān)聯(lián)表的格式等進(jìn)行擴(kuò)展或變換,使其適用于其他情況。應(yīng)該理 解,所有這樣的變化、替換、修改仍然落入本發(fā)明的保護(hù)范圍之內(nèi)。本發(fā)明的保護(hù)范圍由所 附權(quán)利要求來(lái)限定。
權(quán)利要求
一種流程序編譯器,用于對(duì)包括至少一個(gè)操作模塊的流程序進(jìn)行編譯,所述至少一個(gè)操作模塊在所述流程序執(zhí)行期間需要調(diào)用至少一個(gè)動(dòng)態(tài)鏈接庫(kù)DLL,所述編譯器包括關(guān)聯(lián)表生成單元,被配置為根據(jù)用戶定義的至少一條規(guī)則生成關(guān)聯(lián)表,該關(guān)聯(lián)表包括至少一個(gè)條目,每一個(gè)條目指示流程序的一種流分支和該流分支對(duì)應(yīng)的至少一個(gè)操作模塊;以及觸發(fā)器生成單元,被配置為根據(jù)所述用戶定義的至少一條規(guī)則生成觸發(fā)器,所述觸發(fā)器用于判斷所述流程序適用的條件,將該條件映射至流分支,并發(fā)出指示該流分支的觸發(fā)信號(hào)。
2. 如權(quán)利要求1的編譯器,其中所述用戶定義的至少一條規(guī)則包含在所述流程序中。
3. 如權(quán)利要求l的編譯器,其中所述流分支對(duì)應(yīng)的至少一個(gè)操作模塊是在該流分支下 所述流程序需要的操作模塊。
4. 如權(quán)利要求l的編譯器,其中所述流分支對(duì)應(yīng)的至少一個(gè)操作模塊是在該流分支下 所述流程序不需要的操作模塊。
5. 如權(quán)利要求1的編譯器,其中所述觸發(fā)器生成單元還被配置為將觸發(fā)器嵌入在所述 至少一個(gè)操作模塊中。
6. 如權(quán)利要求1-5中任一項(xiàng)的編譯器,還包括控制器生成單元,被配置為生成控制 器,所述控制器用于根據(jù)所述觸發(fā)信號(hào)指示的流分支,查找所述關(guān)聯(lián)表,確定該流分支對(duì)應(yīng) 的操作模塊,并卸載不使用的操作模塊所調(diào)用的DLL。
7. —種控制流程序中動(dòng)態(tài)鏈接庫(kù)DLL加載狀態(tài)的裝置,所述流程序包括至少一個(gè)操作 模塊,所述至少一個(gè)操作模塊在所述流程序執(zhí)行期間需要調(diào)用至少一個(gè)DLL,所述裝置包括 控制器,所述控制器包括操作模塊確定單元,被配置為響應(yīng)于接收指示流分支的觸發(fā)信號(hào),查找記錄有流分支 和操作模塊對(duì)應(yīng)關(guān)系的關(guān)聯(lián)表,確定所述流分支對(duì)應(yīng)的操作模塊;以及DLL控制單元,被配置為根據(jù)所述流分支對(duì)應(yīng)的操作模塊卸載不使用的操作模塊所調(diào) 用的DLL。
8. 如權(quán)利要求7的裝置,其中所述觸發(fā)信號(hào)是通過判斷所述流程序適用的條件,將該 條件映射至流分支而產(chǎn)生的。
9. 如權(quán)利要求7的裝置,其中所述關(guān)聯(lián)表是根據(jù)用戶定義的至少一條規(guī)則生成的,該 關(guān)聯(lián)表包括至少一個(gè)條目,每一個(gè)條目指示流程序的一種流分支和該流分支對(duì)應(yīng)的至少一 個(gè)操作模塊。
10. 如權(quán)利要求7的裝置,其中DLL控制單元進(jìn)一步被配置為向所述不使用的操作模塊 發(fā)出結(jié)束指令,并通過調(diào)用結(jié)束函數(shù)卸載其中的DLL。
11. 一種控制流程序中動(dòng)態(tài)鏈接庫(kù)DLL加載狀態(tài)的方法,所述流程序包括至少一個(gè)操 作模塊,所述至少一個(gè)操作模塊在所述流程序執(zhí)行期間需要調(diào)用至少一個(gè)DLL,所述方法包 括響應(yīng)于接收指示流分支的觸發(fā)信號(hào),查找記錄有流分支和操作模塊對(duì)應(yīng)關(guān)系的關(guān)聯(lián) 表,確定所述流分支對(duì)應(yīng)的操作模塊;以及根據(jù)所述流分支對(duì)應(yīng)的操作模塊卸載不使用的操作模塊所調(diào)用的DLL。
12. 如權(quán)利要求11的方法,其中所述觸發(fā)信號(hào)是通過判斷所述流程序適用的條件,將該條件映射至流分支而產(chǎn)生的。
13. 如權(quán)利要求ll的方法,其中所述關(guān)聯(lián)表是根據(jù)用戶定義的至少一條規(guī)則生成的, 該關(guān)聯(lián)表包括至少一個(gè)條目,每一個(gè)條目指示流程序的一種流分支和該流分支對(duì)應(yīng)的至少 一個(gè)操作模塊。
14. 如權(quán)利要求11的方法,其中卸載不使用的操作模塊所調(diào)用的DLL的步驟包括向 所述不使用的操作模塊發(fā)出結(jié)束指令,并通過調(diào)用結(jié)束函數(shù)卸載其中的DLL。
全文摘要
本發(fā)明涉及控制DLL加載狀態(tài)的裝置和方法。具體地,提供了一種流程序編譯器,包括關(guān)聯(lián)表生成單元,用于根據(jù)用戶定義的規(guī)則生成關(guān)聯(lián)表,該關(guān)聯(lián)表包括至少一個(gè)條目,每一條目指示一種流分支和該流分支對(duì)應(yīng)的操作模塊;以及觸發(fā)器生成單元,用于根據(jù)所述規(guī)則生成觸發(fā)器,該觸發(fā)器用于判斷流程序適用的條件,將該條件映射至所述流分支,并發(fā)出觸發(fā)信號(hào)。還提供了一種控制器,包括操作模塊確定單元,用于響應(yīng)于觸發(fā)信號(hào)指示的流分支查找關(guān)聯(lián)表,確定該流分支對(duì)應(yīng)的操作模塊;以及DLL控制單元,用于卸載不使用的操作模塊所調(diào)用的DLL。本發(fā)明還提供與上述編譯器和控制器相對(duì)應(yīng)的方法。由此,用戶可以通過定義DLL控制規(guī)則實(shí)現(xiàn)對(duì)DLL加載狀態(tài)的控制。
文檔編號(hào)G06F9/45GK101727345SQ20081017078
公開日2010年6月9日 申請(qǐng)日期2008年10月29日 優(yōu)先權(quán)日2008年10月29日
發(fā)明者侯銳, 劉之育, 王華勇, 王艷琦 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司