发明内容
技术问题:本发明的目的是提供一种基于模块化的移动代理的网格作业迁移方法,来解决网格环境下的作业迁移没能充分利用网格资源导致作业执行效率低下的问题。通过使用本发明提出的方案可以提高网格资源的利用率,进而提高作业执行的效率。
技术方案:本发明是一种策略性的方案,基于模块化的移动代理,通过将作业代码进行合理分割或按功能进行模块化设计,有计划的迁移代码中各个模块,可以有效的减少数据的传输量,同时还可以使无数据相关的代码模块在各个站点上并发执行,提高了网格资源的利用率和作业执行的效率。
基于模块化的移动代理的网格作业迁移方法,通过将作业代码进行合理分割或按功能进行模块化设计,有计划的迁移代码中各个模块,可以有效的减少数据的传输量,同时还可以使无数据相关的代码模块在各个站点上并发执行,提高了网格资源的利用率和作业执行的效率。具体如下:
步骤1.分解作业代码:
作业代码在网格上可以用以下三种方式进行分解,用户根据具体情况选择一种方式对作业代码进行分解:
a.按步骤分解:如果应用由一系列处理构成,可以将这些处理分布到网格上的不同节点上去执行,就像工厂的流水线一样;
b.按功能分解:如果计算任务能够分解成相互基本独立的不同功能单元,它们相互之间传输不是很频繁;
c.按数据分解:如果应用的数据量很大,可以将该应用的数据分解成多个数据块,把不同数据块分配到不同的计算机上处理;
步骤2.设计迁移序列:
用户将作业代码分解为各个模块后,需要设计一个迁移序列,来指定每个作业代码模块将被哪个站点资源来执行,该迁移序列由若干个段(segment)组成,其中每个段的基本组成如图2所示。
步骤3.向移动代理构造服务器发送请求:
用户完成任务分解,设计好迁移序列之后,向代理构造服务器发出一个请求原语,请求移动代理服务器为其生成一个代理,请求原语格式如下:
Request-Create-Agent{
ServerIp IpAddress 1;
UserIp IpAddress 2;
UserTask TaskId;
ScheduleQueue schedule_queue;}
步骤4.生成一个移动代理:
移动代理服务模块收到上述的请求原语后,分析该请求中的迁移序列是否存在错误,如果没有发现错误,就将用户所设计的迁移序列存入迁移序列记录表中,并在代理记录表中进行登记,生成一个代理,等待代理派遣器按照迁移序列将该代理发往它所要去的站点,
步骤5.代理的迁移:
移动代理派遣器从代理登记表中取出等待发送代理的序号,依据该序号从迁移序列记录表中读取该代理的迁移序列,将代理内核和迁移序列发往各段所指示的目的站点,然后分析迁移序列,从作业代码模块库中取出所需的模块并发往各段所指示的站点,
步骤6.代理的执行:
当目标站点接收到某个代理的内核后,则启动内核模块工作,由代理内核中的线程ModuleScheduling(schedule_queue)首先判断该代理的迁移序列是否已经到达该站点;如果尚未到达,则等待,若迁移序列已经到达,则从迁移序列中读取需启动的第1个模块名、执行条件及其相关关系;如果该模块的执行条件不满足,则跳过该模块;如果执行条件得以满足,检查该模块是否已经到达以及该模块是否等待别的某个作业代码模块的处理结果,当该模块的代码已经到达并且所需的数据也已准备好,则启动该模块工作,否则等待;一个模块启动后,再分析作业代码模块迁移序列,重复上述过程,直至按迁移序列的要求将各作业代码模块全部启动执行为止;
步骤7.数据相关的模块之间的通信及结果的返回:
代理内核中的线程ModuleListening负责监测所有正在执行的模块,当某个作业代码模块执行完毕后,该线程按照迁移序列中的数据相关关系的需要,将作业代码模块的执行结果发往相应的站点。
有益效果:使用该方案有如下优点:
(1)将移动Agent引入网格计算中,利用移动Agent来进行网格作业的迁移。由于移动Agent的自主性,使得用户只需将作业提交给移动Agent便可等待获取作业的执行结果,大大减轻了用户的负担。
(2)利用移动Agent的模块化,将作业代码进行合理分割或按功能进行模块化设计,有计划的迁移代码中各个模块,有效的减少了数据的传输量,同时还使无数据相关的代码模块能在各个站点上并发执行,提高了网格资源的利用率和作业执行的效率。
具体实施方式
一、体系结构
为了尽可能的减少Agent迁移过程中的数据传输量,提高Agent设计的灵活性,本系统为移动Agent设计了如图1所示的模块化结构模型。
Agent由内核、作业代码模块迁移序列的规范描述(下面简称迁移序列)、消息及数据缓冲区和一系列作业代码模块组成。为了使移动Agent适合于各种平台,整个系统采用Java语言进行编写,其中每个作业代码模块作为一个线程来实现。
Agent内核的作用是对迁移序列进行分析,并根据它来迁移各个作业代码模块。
作业代码模块迁移序列是描述移动Agent工作过程的主体,由若干个段(segment)组成,其中每个段的基本组成如图2所示。
一个段描述了Agent在一个站点上所应做的工作。每个段以一个保留字开始,紧接着是段序号,然后是Agent所应到达的目标站点,后面是Agent在该站点上应执行的若干个作业代码模块的描述。作业代码模块的描述分为模块序号、模块执行条件、模块名、模块的源站点、模块在源站点上的编号、初始参数、数据相关性。模块序号用于指示模块在该段中的序号;条件部分给出执行本模块所需的条件,只有该条件被满足,才启动此模块,否则跳过本模块;模块名给出作业代码模块的名称;模块的源站点和模块在源站点上的编号给出该作业代码模块的源代码所在的位置;后面是模块执行时需用到的初始参数;数据相关性用于描述本作业代码模块与哪些作业代码模块相关联,即该作业代码模块需用到哪些作业代码模块的执行结果,当存在数据相关时,该作业代码模块则需等到所需数据到达后才能启动执行。
当某个作业代码模块执行完毕后,将其执行结果写入消息及数据缓冲区,供其他作业代码模块使用或作为Agent执行的最终结果传送给用户。当所有作业代码模块按迁移序列的要求执行完毕后,则表示该Agent执行完毕。
系统设置了一个Agent构造服务器,协助用户自动的生成移动Agent。该构造服务器包括作业代码模块库、移动Agent服务模块、迁移序列记录表、Agent登记表和Agent派遣器。如图3所示。
作业代码模块库用来存放用户提交的作业所分解成的作业代码模块。移动Agent服务模块的作用是接收来自于用户站点的请求,为用户生成Agent,该请求中包括用户所设计的迁移序列。服务模块收到该请求后,分析其中的迁移序列是否存在错误,如果没有发现错误,就将用户所设计的迁移序列存入迁移序列记录表中,并在Agent记录表中进行登记,等待Agent派遣器按照迁移序列将该Agent发往它所要去的站点。
二、方法流程
1)作业代码的分解:
任务分解的主要功能是将提交的任务分解成多个尽可能高并行度的子任务。对一个具有普遍性的任务分解问题,已有不少学者对此进行了卓有成效的研究,如McCornock提出的基于聚簇的方法,Niizuna和Kitahachi提出的基于状态和等价关系的方法等。作业问题在网格上可以用三种方式进行分解。
(a)按步骤分解。某些应用由一系列处理构成,可以将这些处理分布到网格上的不同节点上,就像工厂的流水线一样。
(b)按功能分解。某些计算任务能够分解成相互基本独立的不同功能单元,它们相互之间传输不是很频繁。
(c)按数据分解。有许多应用的数据量很大,需要把不同数据块分配到不同的计算机上处理。如果数据块之间的耦合度很小,就能充分体现网格并行计算的优势。
2)生成Agent:
用户完成任务分解,设计好这些作业代码模块的迁移序列之后,向Agent构造服务器发送生成Agent的请求,该请求中包括了迁移序列和作业代码模块。服务器收到请求后,将作业代码模块存入作业代码模块库中,移动Agent服务模块分析请求中的迁移序列是否存在错误,如果没有发现错误,就将用户所设计的迁移序列存入迁移序列记录表中,并在Agent记录表中进行登记,生成一个Agent,等待Agent派遣器按照迁移序列将该Agent发往它所要去的站点。
3)Agent的迁移和执行:
在传统的方法中,Agent一般要携带所有作业代码按照它的旅行路线依次在各个站点上移动,但对于那些需要几个站点合作执行的作业来说,在Agent移动过程中这些作业代码每次都要进行传输,这样不但进行了不必要的数据传输,而且还影响了程序的并发性。
因此我们采用下述方法来实现Agent的迁移过程。移动Agent派遣器从Agent登记表中取出等待发送Agent的序号,依据该序号从迁移序列记录表中读取该Agent的迁移序列,将Agent内核和迁移序列发往各段所指示的目的站点,然后分析迁移序列,从作业代码模块库中取出所需的模块并发往各段所指示的站点。
当目标站点接收到某个Agent的内核后,则启动内核模块工作。Agent内核由两个线程组成,分别是ModuleScheduling和ModuleListening。
线程ModuleScheduling的作用是:首先判断该Agent的迁移序列是否已经到达该站点。如果尚未到达,则等待。若迁移序列已经到达,则从迁移序列中读取需启动的第1个模块名、执行条件及其相关关系;如果该模块的执行条件不满足,则跳过该模块。如果执行条件得以满足,检查该模块是否已经到达以及该模块是否等待别的某个作业代码模块的处理结果。当该模块的代码已经到达并且所需的数据也已准备好,则启动该模块工作,否则等待。一个模块启动后,再分析作业代码模块迁移序列,重复上述过程,直至按迁移序列的要求将各作业代码模块全部启动执行为止。
线程ModuleListening的作用是监测所有正在执行的模块。当某个作业代码模块执行完毕后,该线程按照迁移序列中的数据相关关系的需要,将作业代码模块的执行结果发往相应的站点。
本发明具体实施的步骤如下:
1)用户根据具体情况选择按步骤、功能或数据对作业代码进行分解,将其分解为多个作业代码模块;
2)用户设计一个作业代码模块迁移序列,来指定每个作业代码模块将被哪个站点资源来执行;
3)用户向Agent构造服务器发出一个请求原语,其格式如下:
Request-Create-Agent{
ServerIp IpAddress1;
UserIp IpAddress2;
UserTask TaskId;
ScheduleQueue schedule_queue;}
4)移动Agent服务模块收到上述的请求原语后,分析该请求中的迁移序列是否存在错误;
5)如果没有发现错误,就将用户所设计的迁移序列存入迁移序列记录表中;
6)服务模块在Agent记录表中进行登记,生成一个Agent;
7)移动Agent派遣器从Agent登记表中取出等待发送Agent的序号;
8)依据该序号从迁移序列记录表中读取该Agent的迁移序列,将Agent内核和迁移序列发往各段所指示的目的站点;
9)移动Agent派遣器分析该迁移序列,从作业代码模块库中取出所需的模块并发往各段所指示的站点;
10)目标站点接收到某个Agent的内核后,则启动内核模块工作;
11)Agent内核中的线程ModuleScheduling首先判断该Agent的迁移序列是否已经到达该站点;
12)如果迁移序列尚未到达,则等待。若已经到达,则从迁移序列中读取需启动的第1个模块名、执行条件及其相关关系;
13)如果该模块的执行条件不满足,则跳过该模块;
14)如果执行条件得以满足,检查该模块是否已经到达以及该模块是否等待别的某个作业代码模块的处理结果;
15)当该模块的代码已经到达并且所需的数据也已准备好,则启动该模块工作,否则等待;
16)一个模块启动后,再分析作业代码模块迁移序列,重复上述过程,直至按迁移序列的要求将各作业代码模块全部启动执行为止;
17)Agent内核中的线程ModuleListening负责监测所有正在执行的模块。当某个作业代码模块执行完毕后,该线程按照迁移序列中的数据相关关系的需要,将作业代码模块的执行结果发往相应的站点;
18)当所有作业代码模块都执行完毕后,则由该线程将执行结果返还给用户。