首页 > 范文大全 > 正文

基于Ruby的产品线并行探讨

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于Ruby的产品线并行探讨范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘要】本文在Ruby环境下,利用其动态语言特性通过对数据模型的映射,进程并发控制环节中的信号同步通信问题,并发数据保障机制的研究。对产品线核心资产生产环节并行性进行了分析与探讨。

【关键词】软件产品线;Ruby;并行机制;信号同步;数据保障

1.引言

软件产品线(Software Product Line)是一种基于预先规划的软件复用技术,其重要的目的之一是为了将一系列有着特定应用领域并且功能相类似的软件产品进行分析合集,提炼出软件产品集合的共同点并将该类共同点资产化、规范化,提高该类软件产品设计和开发的软件复用度,缩短开发周期,提高软件质量[1]。

而KobrA方法通过构件化的软件基本理论以及UML方法给予了工程实践上的理论指导。如图1所示通过基于KobrA的用例模型描述核心资产产品线构件与最终产品的交互,从初始构件K开始,依靠:①实例化过程,来去除系统的通用性;②分解过程,分解系统构件成更低粒度模块;③具体化过程,生成系统不同功能部分的运行表示,从而降低其抽象性。而对KobrA方法产生的生成树模型表明在产品线核心资产生产中并行是可行的[2]。

2.基于ruby的并行方法

2.1 敏捷并行程序设计方法

在传统并行算法的设计上有以下几个过程:经历业务建模到串行算法的实现,然后由串行算法实现到任务及数据的分解,最终实现并行算法。而敏捷方法的出现,是对传统软件工程领域中的工程方法的一种颠覆,其作为一种革命同样适用于并行程序的设计领域,通过敏捷方法,我们可对传统并行算法环境进行精简,对其中的“实现串行算法”及“任务和数据”两个环节的缩减成了一种可行的策略。Ruby作为一种动态语言,对于敏捷开发有着较好的支持,在现今的软件工程领域备受瞩目。从Unix演化发展而来的Ruby,在应对多处理器、多线程下的程序设计等方面有着较好的优势,通过Ruby环境对产品线进行并行设计是有着一定潜力的。而采用敏捷设计理念是建立在构思、探索和不断调整适应的基础之上,因此它侧重于开发者如何协同工作、采用的协作机制以及具体的实施。敏捷开发过程的目标不是“重复”的过程,而是“可靠”的过程[3]。

2.2 Ruby的并行性

程序开发者在Ruby中可以按自身的算法需求设计相关的并行线程模型,通过脚本方式来进行描述,而数据的发送和收集以及线程的控制都会以此种直观的方式表现出来。依靠Ruby的语言环境程序开发者不用过多考虑并行环境的配置,而把问题着重于并行算法单元和相关单元的分发及回收的逻辑性上。建立一种机制让建模模型直接映射算法,而采用此种敏捷方法的开发者可灵活运用基本数据结构来控制整体并行算法的逻辑。

多进程交互是并行程序框架在多处理机的本质结构。Ruby继承了UNIX多进程创建的特征,通过相关的OS库和UNIX/Linux系统交互,能够使用系统调用功能(如fork)来创建子进程,Ruby在表现层这一级上并非直接支持并行程序的接口,而是通过对UNIX的系统调用从而来实现相应功能的基本库。它于不同的并行设计的编程标准是全公开透明的,图2说明了Ruby与并行机制之间的关系。

和传统标准的MPI不同的是,Ruby通过并行解析库来实现其并行化,这就要求有一种相对统一的语法和陈述标准,而不用考虑在底层由于标准的不同带来的差异操作。

2.3 并行数据的模型映射

并行程序在传统实现时需要通过并行编译的这样一个过程,使得在模型和算法的最终实现上是分离开的[4]。采用敏捷方法让程序语言着重于对模型的直接表达,而Ruby所拥有的强大业务表达能力为此种设计理念提供了契机。通常数据和任务图模型的并行性在算法建模中是容易发掘的,但那些传统权重级语言在模型表达时容易陷入各种类型检测及语法规则的繁琐事务中,而那些BNF范式和算法模型在语义和形式上均有不同构的特征,导致了开发者的转换难度。

而如图3所示的二维矩阵进行划分,KobrA下的产品线经过不断的细分,其最终的数据为一颗二叉树,图中Ruby按矩阵方式从而把各个分块数据发到六个进程并进行相应操作,这样的方式可以看出Ruby进程间的并发控制是可显式继承,让开发者不用把精力投入到模型转换上,而着重考虑于算法设计。

由静态模型映射所得到并行程序将数据任务分模块组织,最终算法的执行结果是由各个模块的独立性来决定的。不同的软件产品线对应着不同的程序应用,自然相关程序结构对应于模型结构,在线性的模型中能直接和程序结构进行映射,如遇到高维度映射,则需要采用降维处理机制处理为二位模型,从而在程序中以矩阵方式表示。

依靠递归调用,我们将一个算法整体设为δ,分解元为Φ,将整个算法分为ω=δ/Φ,假设有Ψ使得ΦΨ=ω,分解维度为Ψ,Ψ为实数,而在后续分解下,将Ψ代替ω,可以把维度进一步降解,如下语句:

Def Partition(count)

For x in range(6)do

For y range(6)do

Process=Oprator(x,y)

Process.start

end

end

Def Oprator(x.y):

Call Partition(count+1)

Partition(0)

end

2.4 Ruby消息传递机制及动态映射

在任务分解降维过程中由于任务相互存在序列关系,进程Px和Py的运行结果为其他进程的运行提供信息,Ruby忽略类型检查的特性,使得进程中通过带有时间戳以及标识的共享散列信息可以是范式类型,能够对数据进行传输以及操作类和进程,从而解决进程间消息通信问题[5]。而图4为两个进程之间消息通信的演示。

假设将Px看作控制节点,那么Px可以传递若干进程到Py、Pz等进程,那么下面形式的任务图就如图5所示的表达。

Ruby灵活简单的特性可在程序运行中把数据任务动态的分配给各个运算单元。其采用的分布式映射方法难度在于:进程间的任务分配及职能调度,以及相互间的职能转换。而Ruby的分布式消息通信类型有范式的特性,在此采用下面的机制来实现映射。

进程Px产生结果ξ,ξ需要动态分配Py、Pz,两个进程进行计算,分配机制如下:

(1)Px将对Py、Pv进程请求放入数据共享区;

(2)Py、Pv获得请求后将自身句柄发送给Pi,清除相关信息;

(3)获得句柄的Px将任务分配并唤醒Py、Pv。

该机制泛化调度为进程之间消息通信,Ruby中的消息处理机制确保了映射的准确有效完成。

3.并发控制探讨

3.1 确保信号同步

任务分发与回收过程里,为保证整体产品线并行算法的一致性,要对每个进程行为采取并发控制。而Ruby中有着完善的信号模型来确保这一过程,它实现了信号绑定句柄。而为了满足KobrA方法的产品线并行,我们希望能在此基础上有一定拓展:句柄绑定粒度要到进程一级,并能依据信号标识进行一对一或一对多的进程操作。为此又需要进行两个定义:

①进程句柄:一种能够对进程进行标识、执行、阻塞、消除的方法,并可以进行进程通信。

②进程集:对一组进程的标识,通过索引得到进程的具体句柄。

通常在进程处理完相关操作后就会发送出带有自身标识的信号,而其他需要同步的进程一旦接受到这个信号便可以进行进程同步操作,但仍然需要对信号进行区分。将信号分为广播和私有信号:对于广播,各种参与进程不需要对信息进行确认,不必要进行信息销毁。而私有信号,则可分为一对一,和一对多两种情况,前者可采用TCP中的三次握手机制确认后信息销毁;而后者把信息接收到公用buff中,并设置时间戳,采用超时自动回复重发的机制并广播作废信息通知。

3.2 数据保障

产品线核心资产并行运算中,各个模块不断并发操作,为保障运算实体所读取的数据可靠有效,需要设置数据锁机制确保数据一致性。Ruby在解析库中支持并行运算的数据锁机制,开发者可以在语法中显式定义数据锁和加锁方:

Def process_x

Share_message={:Py=>’DATA’}

Drb.start_service(‘Px’,Share_message,’tag’)

end

Def process y

Share_message=MessageSve.fetch (‘Px’)

Message_Get=Share_message [‘Px’]

end

在process_y使用数据process_x前要确保Share_message[‘Px’]中的数据信息未被其他进程修改,因此在process_x中对共享数据加锁:

Def process_x

Share_message={:Py=>’DATA’}

withLocked(Share_message,’ w’,’process y’)

Drb.start_service(‘Px’,Share_message,’tag’)

End

通过对process_x数据加了写锁指令,并将解锁权限给了process_y,该进程若要更数据内容,则需要定义解锁指令:

Def process_y

Share_message=MessageSve.fetch(‘Px’)

unlocked(Share_message)

Message_Get=Share_message[‘Px’]

4.结束语

通过采用KobrA方法对产品线核心资产生产进行分解,在Ruby环境下通过模型映射及其同构性分析,提出一种思路,利用Ruby的动态语言特性,并根据其信号通信和数据保障机构的探讨来分析的产品线核心资产并行运算的可行性,但在未来工作中,需要对多模型同构进行进一步分析研究,并研究产品线中的核心资产和产品生产间的相关并行机制。

参考文献

[1]Parnas.On the Design and Development of Pro-gram Families[J].IEEE Transactions on Software Engineering,1976:SE-2(1)1-9.

[2]杨扬.基于KobrA的产品线并行性探讨[J].价值工程,2012,06.

[3]赵熙朝.敏捷软件开发过程改进的行动框架[J].Software Engineering and Standardization,2007.

[4]Michele Marchesi.Giancarlo Succi,Don Wells et al.极限编程透视[M].北京:电子工业出版社,2004.

[5]高桥征义,后藤裕藏.Ruby Programming[M].北京:电子工业出版社,2009.

作者简介:杨扬(1983―),男,硕士,玉溪师范学院信息技术工程学院讲师,研究方向:软件工程、网络工程。