專利名稱:基于linuxC語言的輕量級流程調度方法
技術領域:
本發(fā)明涉及一種計算機C語言技術,尤其是一種流程調度方法,具體地說是一種 基于linux C語言的輕量級流程調度方法。
背景技術:
目前,在JAVA中,我們可以使用反射機制來實現(xiàn)動態(tài)加載,通過JAVA的反射機制, 編譯器能夠方便地定位并初始化實現(xiàn)類,從而實現(xiàn)運行時動態(tài)加載不同的運行模塊,實現(xiàn) 運行流程的動態(tài)調度。然而,在C和C++中,編譯器并沒有提供反射機制,而流程調度框架 一般都比較重,如何實現(xiàn)一個輕量級的、基于動態(tài)加載的流程調度引擎,是急需解決的難題之一。對于linux C或者C++項目而言,若果用戶要求實現(xiàn)流程可配置,我們的第一反應 是利用商用的流程引擎來實現(xiàn)。但商用流程引擎對資源的需求和開銷都是很高的,很多情 況下,迫切需要一個簡單的流程調度來滿足用戶的需求。
發(fā)明內容
本發(fā)明的目的是針對linux C系統(tǒng)下實現(xiàn)流程可配置存在的資源需求和開銷高的 問題,設計一個基于linux C語言的輕量級流程調度方法。本發(fā)明的技術方案是一種基于linux C語言的輕量級流程調度方法,其特征是它包括以下步驟首先針對所有的流程模塊進行接口設計,將所有的流程模塊抽象出一個統(tǒng)一的接 口,通過調用接口來實現(xiàn)調用具體的流程模塊;對于需要流程調度的模塊來說,前一個流程的輸出,就是后一個流程的輸入;為 此,把流程調度的所有模塊作為一個黑匣子,則整個流程的輸入和輸出應該走遍流程的每 一個步驟,而流程只是對輸入數(shù)據(jù)進行調控;在linux C語言中,動態(tài)加載針對的是so動態(tài) 庫,通過加載不同的動態(tài)庫來實現(xiàn)動態(tài)加載;然后通過以下方法進行動態(tài)調用首先,有一個流程定義,需按步驟進行Flowl、Flow2、Flow3、Flowl和Flow4的處 理;因為其中不確定哪些流程會重復處理,因此通過0/1來控制是否進行該流程;為此,定義一種流程定義和解析策略通過一位ASCII字符來定義流程名稱,通過 一個String(Char)字符串來定義該流程定義對應的處理模塊的so文件的具體路徑信息, 并用$PATH表示具體的路徑信息;這樣,通過一個字符串來定義本次的流程,然后提交給流 程調度模塊。流程調度模塊解析流程定義的每一位字符,然后從流程定義表中獲取該處理流程 的動態(tài)庫的路徑,通過dlopenO方法打開動態(tài)庫,并通過dlsym()方法來執(zhí)行,最后通過 dlclose來關閉動態(tài)庫;當流程定義的字符串沒有處理完畢時,不斷重復上述操作,直到處 理完畢;其次按以下處理邏輯進行調度
第1步用戶獲取流程別名,并將流程別名和輸入輸出數(shù)據(jù)提交給流程引擎;第2步流程引擎獲取到流程別名后,在流程配置表中查詢并獲取其定義的具體 流程信息;第3步獲取第一位流程定義字符;第4步在流程定義表中獲取該流程的處理模塊so的定義信息,并將輸入信息和 定義信息提交給執(zhí)行模塊;第5步執(zhí)行模塊動態(tài)加載并執(zhí)行定義信息中的so文件,修改輸入輸出信息;第6步獲取下一位流程定義字符,如果該字符為空,則轉第7步,否則轉第4步;第7步流程執(zhí)行完畢。所述的接口定義規(guī)格如下
//polygon, hpp:
#ifndef P0LYG0N_HPP #define P0LYG0N_HPP class polygon { protected:
double side_lengthpublic:
polygon ()side_length_(0) {} virtual polygon () {}
void set—side—length (double side—length) { side—length— = side—length;
ι
virtual double area (double i) const = 0;
};
Il the types of the class factories typedef polygon水 create_t (); typedef void destroy—t(polygon氺); #endif 0所述的so動態(tài)庫是通過對結構的程序編譯生成的
〃----------
//triangle, cpp:
#include 〃../head/polygon. hpp〃 #include <cmath>
class triangle : public polygon { public:
virtual double area(double i) const { return i氺2;
ι
ι;
Il the class factoriesextern 〃C〃 polygon* create () { return new triangle;
}
extern 〃C〃 void destroy(polygon水 ρ) { delete ρ;
ι重復對不同的so動態(tài)庫進行編譯生成不同的so處理模塊,最終形成動態(tài)庫文件。本發(fā)明的有益效果本發(fā)明資源需求和開銷小,運行效率高。本發(fā)明解決了 Iinux C或者C++項目下無需借且商用引擎即可實現(xiàn)流程的可配置 問題,可降低軟件開發(fā)成本。本發(fā)明通過代碼來實現(xiàn)處理模塊的動態(tài)加載,并實現(xiàn)流程的動態(tài)調度。用戶只需 要對流程配置表進行手動維護,就可以配置可重復處理的流程。當然,如果用戶的流程數(shù)量 很多時,一位字符串無法定義一個單獨的流程,此時可以通過多個字符串來定義一個流程; 在流程解析時,對連續(xù)的多個字符串進行匹配來獲取流程的動態(tài)處理模塊,從來實現(xiàn)流程 的動態(tài)調度。
圖1是本發(fā)明的流程定義圖。圖2是本發(fā)明的流程定義表。圖3是本發(fā)明的流程配置表。圖4是本發(fā)明的輕量級流程調度處理邏輯。
具體實施例方式下面結合附圖和實施例對本發(fā)明作進一步的說明。如圖1-3所示?!N基于linux C語言的輕量級流程調度方法,其步驟如下首先針對所有的流程模塊進行接口設計,將所有的流程模塊抽象出一個統(tǒng)一的接 口,這樣,通過調用接口來實現(xiàn)調用具體的流程模塊。接口定義示例如下//----------
//polygon.hpp:
//----------
#ifndef POLYGON HPP #define POLYGON HPP
class polygon { protected:
double side—length—;
public:
polygon()
:side_length_(0) {}
virtual ~polygon() { }
void set—side—length(double side—length) {
side—length— = side—length;
} — — —
virtual double area(double i) const = 0;
};
Il the types of the class factories typedef polygon* create—t(); typedef void destroy—t(polygon*);
#endif對于需要流程調度的模塊來說,前一個流程的輸出,就是后一個流程的輸入(或 者說前一個流程的輸出會對后一個流程的輸入造成影響,因此才會有先后次序)。如果把 流程調度的所有模塊作為一個黑匣子,則整個流程的輸入和輸出應該走遍流程的每一個步 驟,而流程只是對輸入數(shù)據(jù)進行調控。在linux C中,動態(tài)加載針對的是so動態(tài)庫,為此通 過加載不同的動態(tài)庫來實現(xiàn)動態(tài)加載。針對每一個so的實現(xiàn),如下所示
〃----------
//triangle, cpp:
//----------
#include "../head/polygon.hpp" #include <cmath>
class triangle : public polygon {public:
virtual double area(double i) const { return i*2;
// the class factories extern "C" polygon* create() { return new triangle;
}
extern "C" void destroy(polygon* p) { delete p;
}重復上面的步驟,并編譯生成不同的so處理模塊,形成動態(tài)庫文件,然后通過以 下方法進行動態(tài)調用首先,如錯誤!未找到引用源。所示,有一個流程定義,需按步驟進行Flowl、 Flow2、Flow3, Flowl和Flow4的處理。因為其中不確定哪些流程會重復處理,我們無法定 義出一個統(tǒng)一的流程,通過0/1來控制是否進行該流程。因此,我們定義了一種簡單的流程定義和解析策略通過一位ASCII字符來定義 流程名稱,通過一個String(Char)字符串來定義改流程定義對應的處理模塊的so文件的 具體路徑信息,如圖1所示此處$PATH表示具體的路徑信息,如./usr/flow/so。這樣,用戶通過一個字符 串來定義本次的流程為ABCAD,用戶從圖3的流程配置表中獲取到流程1的流程定義為 ABCAD,然后提交給流程調度模塊。流程調度模塊解析流程定義的每一位字符,然后從圖2 的流程定義表中獲取該處理流程的動態(tài)庫的路徑(相對路徑或者絕對路徑),如./usr/ flow/so/Flowl. so,通過dlopenO方法打開動態(tài)庫,并通過dlsym()方法來執(zhí)行,最后通過 dlclose來關閉動態(tài)庫。當流程定義的字符串沒有處理完畢時,不斷重復上述操作,直到處 理完畢。處理邏輯如圖3所示,輕量級流程調度的處理邏輯描述如下stepl 用戶獲取流程別名,如圖3中的流程1、流程2……,并將流程別名和輸入輸 出數(shù)據(jù)提交給流程引擎;step2:流程引擎獲取到流程別名后,在流程配置表中查詢并獲取其定義的具體流 程信息st印3 獲取第一位流程定義字符;st印4 在圖2的流程定義表中獲取該流程的處理模塊so的定義信息,并將輸入信 息和定義信息提交給執(zhí)行模塊;st印5 執(zhí)行模塊動態(tài)加載并執(zhí)行定義信息中的so文件,修改輸入輸出信息;st印6 獲取下一位流程定義字符,如果該字符為空,則轉st印7,否則轉st印4 ;st印7 流程執(zhí)行完畢。
在linux C中,動態(tài)加載的關鍵是通過函數(shù)指針來實現(xiàn)的,如typedef polygon*create_t()所示,實現(xiàn)代碼中,是通過該函數(shù)指針來加載不同的處理模塊的,如create_t氺create—triangle = (create_t*)dlsym(triangle, “ create“);polygon氺poly = create_triangle();cout “ The area is: “ poly->area (ii) ' η' " \n〃 ;通過如上的代碼來實現(xiàn)處理模塊的動態(tài)加載,并實現(xiàn)流程的動態(tài)調度。用戶只需 要對圖3的流程配置表進行手動維護,這樣就可以配置可重復處理的流程。當然,如果用戶 的流程數(shù)量很多時,一位字符串無法定義一個單獨的流程,此時可以通過多個字符串來定 義一個流程;在流程解析時,對連續(xù)的多個字符串進行匹配來獲取流程的動態(tài)處理模塊,從 來實現(xiàn)流程的動態(tài)調度。本發(fā)明未涉及部分均與現(xiàn)有技術相同或可采用現(xiàn)有技術加以實現(xiàn)。
權利要求
1.一種基于linux C語言的輕量級流程調度方法,其特征是它包括以下步驟首先針對所有的流程模塊進行接口設計,將所有的流程模塊抽象出一個統(tǒng)一的接口, 通過調用接口來實現(xiàn)調用具體的流程模塊;對于需要流程調度的模塊來說,前一個流程的輸出,就是后一個流程的輸入;為此,把 流程調度的所有模塊作為一個黑匣子,則整個流程的輸入和輸出應該走遍流程的每一個步 驟,而流程只是對輸入數(shù)據(jù)進行調控;在linux C語言中,動態(tài)加載針對的是so動態(tài)庫,通 過加載不同的動態(tài)庫來實現(xiàn)動態(tài)加載;然后通過以下方法進行動態(tài)調用首先,有一個流程定義,需按步驟進行Flowl、F10W2、F10W3、Flowl和Flow4的處理;因 為其中不確定哪些流程會重復處理,因此通過0/1來控制是否進行該流程;為此,定義一種流程定義和解析策略通過一位ASCII字符來定義流程名稱,通過一個 string (char*)字符串來定義該流程定義對應的處理模塊的so文件的具體路徑信息,并用 $PATH表示具體的路徑信息;這樣,通過一個字符串來定義本次的流程,然后提交給流程調 度模塊。流程調度模塊解析流程定義的每一位字符,然后從流程定義表中獲取該處理流程的 動態(tài)庫的路徑,通過dlopenO方法打開動態(tài)庫,并通過dlsym()方法來執(zhí)行,最后通過 dlclose來關閉動態(tài)庫;當流程定義的字符串沒有處理完畢時,不斷重復上述操作,直到處 理完畢;其次按以下處理邏輯進行調度第1步用戶獲取流程別名,并將流程別名和輸入輸出數(shù)據(jù)提交給流程引擎; 第2步流程引擎獲取到流程別名后,在流程配置表中查詢并獲取其定義的具體流程 fn息;第3步獲取第一位流程定義字符;第4步在流程定義表中獲取該流程的處理模塊so的定義信息,并將輸入信息和定義 信息提交給執(zhí)行模塊;第5步執(zhí)行模塊動態(tài)加載并執(zhí)行定義信息中的so文件,修改輸入輸出信息; 第6步獲取下一位流程定義字符,如果該字符為空,則轉第7步,否則轉第4步; 第7步流程執(zhí)行完畢。
2.根據(jù)權利要求1所述的方法,其特征是所述的接口定義規(guī)格如下
3.根據(jù)權利要求1所述的方法,其特征是所述的so動態(tài)庫是通過對結構的程序編譯生 成的#include 〃. . /head/polygon.hpp〃 #include <cmath>class triangle : public polygon { public:virtual double area (double i) const { return i氺2;ιι;Il the class factories extern 〃C〃 polygon水 create () { return new triangle;ιextern 〃C〃 void destroy(polygon水 ρ) { delete ρ;ι重復對不同的S0動態(tài)庫進行編譯生成不同的SO處理模塊,最終形成動態(tài)庫文件。
全文摘要
一種基于linux C語言的輕量級流程調度方法,其特征是它包括以下步驟首先針對所有的流程模塊進行接口設計,將所有的流程模塊抽象出一個統(tǒng)一的接口,通過調用接口來實現(xiàn)調用具體的流程模塊;其次在linux C中,通過加載不同的動態(tài)庫來實現(xiàn)動態(tài)加載,編譯生成不同的so處理模塊,形成動態(tài)庫文件;動態(tài)調用時有一個流程定義,需按步驟進行Flow1、Flow2、Flow3、Flow1和Flow4的進行處理,并通過一位ASCII字符來定義流程名稱,通過一個string(char*)字符串來定義改流程定義對應的處理模塊的so文件的具體路徑信息,用$PATH表示具體的路徑信息,流程調度模塊解析流程定義的每一位字符,然后流程定義表中獲取該處理流程的動態(tài)庫的路徑通過dlopen()方法打開動態(tài)庫,并通過dlsym()方法來執(zhí)行,最后通過dlclose來關閉動態(tài)庫。當流程定義的字符串沒有處理完畢時,不斷重復上述操作,直到處理完畢。本發(fā)明所需資源開銷小,成本低。
文檔編號G06F9/46GK102129389SQ20111005557
公開日2011年7月20日 申請日期2011年3月9日 優(yōu)先權日2011年3月9日
發(fā)明者季君 申請人:南京恩瑞特實業(yè)有限公司