基于linuxC语言的轻量级流程调度方法

文档序号:6355653阅读:170来源:国知局
专利名称:基于linuxC语言的轻量级流程调度方法
技术领域
本发明涉及一种计算机C语言技术,尤其是一种流程调度方法,具体地说是一种 基于linux C语言的轻量级流程调度方法。
背景技术
目前,在JAVA中,我们可以使用反射机制来实现动态加载,通过JAVA的反射机制, 编译器能够方便地定位并初始化实现类,从而实现运行时动态加载不同的运行模块,实现 运行流程的动态调度。然而,在C和C++中,编译器并没有提供反射机制,而流程调度框架 一般都比较重,如何实现一个轻量级的、基于动态加载的流程调度引擎,是急需解决的难题之一。对于linux C或者C++项目而言,若果用户要求实现流程可配置,我们的第一反应 是利用商用的流程引擎来实现。但商用流程引擎对资源的需求和开销都是很高的,很多情 况下,迫切需要一个简单的流程调度来满足用户的需求。

发明内容
本发明的目的是针对linux C系统下实现流程可配置存在的资源需求和开销高的 问题,设计一个基于linux C语言的轻量级流程调度方法。本发明的技术方案是一种基于linux C语言的轻量级流程调度方法,其特征是它包括以下步骤首先针对所有的流程模块进行接口设计,将所有的流程模块抽象出一个统一的接 口,通过调用接口来实现调用具体的流程模块;对于需要流程调度的模块来说,前一个流程的输出,就是后一个流程的输入;为 此,把流程调度的所有模块作为一个黑匣子,则整个流程的输入和输出应该走遍流程的每 一个步骤,而流程只是对输入数据进行调控;在linux C语言中,动态加载针对的是so动态 库,通过加载不同的动态库来实现动态加载;然后通过以下方法进行动态调用首先,有一个流程定义,需按步骤进行Flowl、Flow2、Flow3、Flowl和Flow4的处 理;因为其中不确定哪些流程会重复处理,因此通过0/1来控制是否进行该流程;为此,定义一种流程定义和解析策略通过一位ASCII字符来定义流程名称,通过 一个String(Char)字符串来定义该流程定义对应的处理模块的so文件的具体路径信息, 并用$PATH表示具体的路径信息;这样,通过一个字符串来定义本次的流程,然后提交给流 程调度模块。流程调度模块解析流程定义的每一位字符,然后从流程定义表中获取该处理流程 的动态库的路径,通过dlopenO方法打开动态库,并通过dlsym()方法来执行,最后通过 dlclose来关闭动态库;当流程定义的字符串没有处理完毕时,不断重复上述操作,直到处 理完毕;其次按以下处理逻辑进行调度
第1步用户获取流程别名,并将流程别名和输入输出数据提交给流程引擎;第2步流程引擎获取到流程别名后,在流程配置表中查询并获取其定义的具体 流程信息;第3步获取第一位流程定义字符;第4步在流程定义表中获取该流程的处理模块so的定义信息,并将输入信息和 定义信息提交给执行模块;第5步执行模块动态加载并执行定义信息中的so文件,修改输入输出信息;第6步获取下一位流程定义字符,如果该字符为空,则转第7步,否则转第4步;第7步流程执行完毕。所述的接口定义规格如下
//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动态库是通过对结构的程序编译生成的
〃----------
//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动态库进行编译生成不同的so处理模块,最终形成动态库文件。本发明的有益效果本发明资源需求和开销小,运行效率高。本发明解决了 Iinux C或者C++项目下无需借且商用引擎即可实现流程的可配置 问题,可降低软件开发成本。本发明通过代码来实现处理模块的动态加载,并实现流程的动态调度。用户只需 要对流程配置表进行手动维护,就可以配置可重复处理的流程。当然,如果用户的流程数量 很多时,一位字符串无法定义一个单独的流程,此时可以通过多个字符串来定义一个流程; 在流程解析时,对连续的多个字符串进行匹配来获取流程的动态处理模块,从来实现流程 的动态调度。


图1是本发明的流程定义图。图2是本发明的流程定义表。图3是本发明的流程配置表。图4是本发明的轻量级流程调度处理逻辑。
具体实施例方式下面结合附图和实施例对本发明作进一步的说明。如图1-3所示。—种基于linux C语言的轻量级流程调度方法,其步骤如下首先针对所有的流程模块进行接口设计,将所有的流程模块抽象出一个统一的接 口,这样,通过调用接口来实现调用具体的流程模块。接口定义示例如下//----------
//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对于需要流程调度的模块来说,前一个流程的输出,就是后一个流程的输入(或 者说前一个流程的输出会对后一个流程的输入造成影响,因此才会有先后次序)。如果把 流程调度的所有模块作为一个黑匣子,则整个流程的输入和输出应该走遍流程的每一个步 骤,而流程只是对输入数据进行调控。在linux C中,动态加载针对的是so动态库,为此通 过加载不同的动态库来实现动态加载。针对每一个so的实现,如下所示
〃----------
//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处理模块,形成动态库文件,然后通过以 下方法进行动态调用首先,如错误!未找到引用源。所示,有一个流程定义,需按步骤进行Flowl、 Flow2、Flow3, Flowl和Flow4的处理。因为其中不确定哪些流程会重复处理,我们无法定 义出一个统一的流程,通过0/1来控制是否进行该流程。因此,我们定义了一种简单的流程定义和解析策略通过一位ASCII字符来定义 流程名称,通过一个String(Char)字符串来定义改流程定义对应的处理模块的so文件的 具体路径信息,如图1所示此处$PATH表示具体的路径信息,如./usr/flow/so。这样,用户通过一个字符 串来定义本次的流程为ABCAD,用户从图3的流程配置表中获取到流程1的流程定义为 ABCAD,然后提交给流程调度模块。流程调度模块解析流程定义的每一位字符,然后从图2 的流程定义表中获取该处理流程的动态库的路径(相对路径或者绝对路径),如./usr/ flow/so/Flowl. so,通过dlopenO方法打开动态库,并通过dlsym()方法来执行,最后通过 dlclose来关闭动态库。当流程定义的字符串没有处理完毕时,不断重复上述操作,直到处 理完毕。处理逻辑如图3所示,轻量级流程调度的处理逻辑描述如下stepl 用户获取流程别名,如图3中的流程1、流程2……,并将流程别名和输入输 出数据提交给流程引擎;step2:流程引擎获取到流程别名后,在流程配置表中查询并获取其定义的具体流 程信息st印3 获取第一位流程定义字符;st印4 在图2的流程定义表中获取该流程的处理模块so的定义信息,并将输入信 息和定义信息提交给执行模块;st印5 执行模块动态加载并执行定义信息中的so文件,修改输入输出信息;st印6 获取下一位流程定义字符,如果该字符为空,则转st印7,否则转st印4 ;st印7 流程执行完毕。
在linux C中,动态加载的关键是通过函数指针来实现的,如typedef polygon*create_t()所示,实现代码中,是通过该函数指针来加载不同的处理模块的,如create_t氺create—triangle = (create_t*)dlsym(triangle, “ create“);polygon氺poly = create_triangle();cout “ The area is: “ poly->area (ii) ' η' " \n〃 ;通过如上的代码来实现处理模块的动态加载,并实现流程的动态调度。用户只需 要对图3的流程配置表进行手动维护,这样就可以配置可重复处理的流程。当然,如果用户 的流程数量很多时,一位字符串无法定义一个单独的流程,此时可以通过多个字符串来定 义一个流程;在流程解析时,对连续的多个字符串进行匹配来获取流程的动态处理模块,从 来实现流程的动态调度。本发明未涉及部分均与现有技术相同或可采用现有技术加以实现。
权利要求
1.一种基于linux C语言的轻量级流程调度方法,其特征是它包括以下步骤首先针对所有的流程模块进行接口设计,将所有的流程模块抽象出一个统一的接口, 通过调用接口来实现调用具体的流程模块;对于需要流程调度的模块来说,前一个流程的输出,就是后一个流程的输入;为此,把 流程调度的所有模块作为一个黑匣子,则整个流程的输入和输出应该走遍流程的每一个步 骤,而流程只是对输入数据进行调控;在linux C语言中,动态加载针对的是so动态库,通 过加载不同的动态库来实现动态加载;然后通过以下方法进行动态调用首先,有一个流程定义,需按步骤进行Flowl、F10W2、F10W3、Flowl和Flow4的处理;因 为其中不确定哪些流程会重复处理,因此通过0/1来控制是否进行该流程;为此,定义一种流程定义和解析策略通过一位ASCII字符来定义流程名称,通过一个 string (char*)字符串来定义该流程定义对应的处理模块的so文件的具体路径信息,并用 $PATH表示具体的路径信息;这样,通过一个字符串来定义本次的流程,然后提交给流程调 度模块。流程调度模块解析流程定义的每一位字符,然后从流程定义表中获取该处理流程的 动态库的路径,通过dlopenO方法打开动态库,并通过dlsym()方法来执行,最后通过 dlclose来关闭动态库;当流程定义的字符串没有处理完毕时,不断重复上述操作,直到处 理完毕;其次按以下处理逻辑进行调度第1步用户获取流程别名,并将流程别名和输入输出数据提交给流程引擎; 第2步流程引擎获取到流程别名后,在流程配置表中查询并获取其定义的具体流程 fn息;第3步获取第一位流程定义字符;第4步在流程定义表中获取该流程的处理模块so的定义信息,并将输入信息和定义 信息提交给执行模块;第5步执行模块动态加载并执行定义信息中的so文件,修改输入输出信息; 第6步获取下一位流程定义字符,如果该字符为空,则转第7步,否则转第4步; 第7步流程执行完毕。
2.根据权利要求1所述的方法,其特征是所述的接口定义规格如下
3.根据权利要求1所述的方法,其特征是所述的so动态库是通过对结构的程序编译生 成的#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动态库进行编译生成不同的SO处理模块,最终形成动态库文件。
全文摘要
一种基于linux C语言的轻量级流程调度方法,其特征是它包括以下步骤首先针对所有的流程模块进行接口设计,将所有的流程模块抽象出一个统一的接口,通过调用接口来实现调用具体的流程模块;其次在linux C中,通过加载不同的动态库来实现动态加载,编译生成不同的so处理模块,形成动态库文件;动态调用时有一个流程定义,需按步骤进行Flow1、Flow2、Flow3、Flow1和Flow4的进行处理,并通过一位ASCII字符来定义流程名称,通过一个string(char*)字符串来定义改流程定义对应的处理模块的so文件的具体路径信息,用$PATH表示具体的路径信息,流程调度模块解析流程定义的每一位字符,然后流程定义表中获取该处理流程的动态库的路径通过dlopen()方法打开动态库,并通过dlsym()方法来执行,最后通过dlclose来关闭动态库。当流程定义的字符串没有处理完毕时,不断重复上述操作,直到处理完毕。本发明所需资源开销小,成本低。
文档编号G06F9/46GK102129389SQ20111005557
公开日2011年7月20日 申请日期2011年3月9日 优先权日2011年3月9日
发明者季君 申请人:南京恩瑞特实业有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1