本发明涉及应用程序执行技术领域,尤其涉及一种程序可中断运行系统及方法。
背景技术:
程序调用是应用程序编码和执行过程中常见的执行方式。当一个应用程序执行到需要调用外部方法(例如调用外部数据库或者进行rpc调用等)时,该应用程序往往会停止运行,等待外部方法回传的调用结果再继续运行。这段时间内,应用程序虽然处于停止运行的状态,但是承载该应用程序的进程并没有将该应用程序抛弃,应用程序所占用的系统资源也没有得到释放,因此会浪费系统资源,并且导致后续等待执行的其他应用程序无法及时执行。
现有的进程中断机制虽然可以部分解决上述问题,但是进程中断机制是在系统底层运行的硬件解决机制,其无法被用户层面所获知,也无法被用户层面所控制,因此无法灵活应用在程序调用的过程中。
技术实现要素:
根据现有技术中存在的上述问题,现提供一种程序可中断运行系统及方法的技术方案,旨在模拟进程中断机制,实现程序的可中断运行控制,使得应用程序在用户层面具备操作系统核心对于进程的相似管理模式,极大化提高了任务的执行效率和资源的使用率。
上述技术方案具体包括:
一种程序可中断运行系统,其中,所述程序可中断运行系统运行于应用层上;
所述程序可中断运行系统中设置有多个运行单元,每个所述运行单元分别用于运行应用程序;
于所述应用程序的程序代码中的多个预定位置预先定义可中断编码;
每个所述运行单元分别连接一存储空间,所述存储空间中用于保存所述运行单元中发生所述程序中断事件的中断时刻的代码数据以及中断位置数据,所述代码数据中包括所述应用程序当前的局部变量数据和操作数栈数据;
所述程序可中断运行系统中还包括:
调度单元,分别连接每个所述运行单元,用于根据所述运行单元当前的运行状态对所述运行单元进行调度:
当所述运行单元的运行状态为初始状态时,所述调度单元调度所述运行单元承载所述应用程序并开始运行所述程序代码;
当所述运行单元的运行状态为执行状态,且所述程序代码运行至所述可中断编码处时,所述运行单元中断所述应用程序的运行,并将所述程序代码当前的所述中断数据暂存于所述运行单元所对应的所述存储空间内,所述调度单元将所述运行单元的运行状态改为中断状态;
当所述运行单元的运行状态由所述中断状态更改为恢复状态时,所述运行单元根据对应的所述存储空间内暂存的所述中断数据,将所述应用程序恢复到中断时的状态,所述调度单元将所述运行单元的运行状态更改为所述执行状态。
优选的,该程序可中断运行系统,其中,于所述程序代码中,在调用系统注册的预定接口处定义所述可中断编码。
优选的,该程序可中断运行系统,其中,还包括:
标记单元,连接每个所述运行单元;
当所述运行单元中断所述应用程序的运行时,所述标记单元在中断时执行的代码处添加一预定标签,并以所述预定标签作为所述中断位置数据保存在所述存储空间内;
当所述运行单元的运行状态由所述中断状态更改为恢复状态时,所述运行单元根据所述预定标签定位所述应用程序在中断时的执行位置。
优选的,该程序可中断运行系统,其中,所述程序可中断运行系统中设置一程序运行框架,所述运行单元可在所述程序运行框架内占用系统资源并运行应用程序;
当所述运行单元的运行状态为所述初始状态时,所述调度单元将所述运行单元调度到所述程序可中断运行系统的程序运行框架中,以使得所述运行单元能够运行所述应用程序;
当所述运行单元的运行状态为所述中断状态时,所述调度单元将所述运行单元拖离所述程序运行框架,以释放所述运行单元所占用的系统资源。
优选的,该程序可中断运行系统,其中,所述存储空间为栈帧集合;
所述栈帧集合中包括多个依序排列的栈帧,每个栈帧中用于保存所述应用程序在运行时的每一次方法调用所产生的所述代码数据,所述栈帧的排列顺序与方法调用的发生顺序相同。
一种程序可中断运行方法,其中,应用上述程序可中断运行系统;
所述程序可中断运行方法具体包括:
步骤s1,所述运行单元处于初始状态,所述调度单元调度所述运行单元开始承载所述应用程序并运行,同时将所述运行单元的运行状态改为所述执行状态;
步骤s2,当所述运行单元中的应用程序运行至所述可中断编码处时,所述运行单元中断所述应用程序的运行,所述调度单元将所述运行单元的状态更改为现场保存状态,随后所述运行单元将所述程序代码当前的所述中断数据暂存于所述运行单元所对应的所述存储空间内;
步骤s3,当所述中断数据暂存完毕后,所述调度单元将所述运行单元的运行状态改为中断状态;
步骤s4,当所述可中断编码所调用的方法有返回值时,所述运行单元的运行状态由所述中断状态更改为所述恢复状态;
步骤s5,所述调度单元重新对所述运行单元进行调度,并将所述运行单元的运行状态更改为重新执行状态;
步骤s6,所述运行单元根据对应的所述存储空间内暂存的所述中断数据,将所述应用程序恢复到中断时的状态,所述调度单元将所述运行单元的运行状态更改为所述执行状态,随后返回所述步骤s2。
优选的,该程序可中断运行方法,其中,所述步骤s2中,所述运行单元的执行过程具体包括:
步骤s21,所述运行单元运行所述应用程序的过程中遇到所述可中断编码,则所述运行单元调用所述可中断编码所对应的方法,随后转向步骤s22;
步骤s22,所述运行单元判断自身的运行状态是否为所述现场保存状态:
若是,则转向步骤s23;
若否,则继续执行所述应用程序,随后返回所述步骤s2;
步骤s23,所述运行单元将所述程序代码当前的所述中断数据暂存于所述运行单元所对应的所述存储空间内,随后转向所述步骤s3。
优选的,该程序可中断运行方法,其中,当所述运行单元中断所述应用程序的运行时,在中断时执行的代码处添加一预定标签,并以所述预定标签作为所述中断位置数据保存在所述存储空间内;
所述步骤s6中,所述运行单元的执行过程具体包括:
步骤s61,所述运行单元判断对应的所述存储空间内是否保存有所述中断位置数据:
若是,则转向步骤s62;
若否,则回到所述应用程序的起始代码处并开始执行,随后返回所述步骤s2;
步骤s62,所述运行单元根据所述中断位置数据定位到所述应用程序在中断时的执行位置;
步骤s63,所述运行单元从对应的所述存储空间内读取所述代码数据并恢复执行所述应用程序,随后返回所述步骤s2。
上述技术方案的有益效果是:
1)提供一种程序可中断运行系统,能够模拟进程中断机制,实现程序的可中断运行控制,使得应用程序在用户层面具备操作系统核心对于进程的相似管理模式,极大化提高了任务的执行效率和资源的使用率。
2)提供一种程序可中断运行方法,能够支持上述程序可中断运行系统正常运行。
附图说明
图1是本发明的较佳的实施例中,一种程序可中断运行系统的总体结构示意图;
图2是本发明的较佳的实施例中,运行单元的运行状态变化示意图;
图3是本发明的较佳的实施例中,一种程序可中断运行方法的总体流程示意图;
图4是本发明的较佳的实施例中,运行单元执行程序中断的流程示意图;
图5是本发明的较佳的实施例中,运行单元执行程序恢复的流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
下面结合附图和具体实施例对本发明作进一步说明,但不作为本发明的限定。
本发明的较佳的实施例中,基于现有技术中存在的上述问题,现构建一个程序可中断运行系统。区别于现有技术中的进程调用机制,该系统运行于应用层上,即运行于用户层面。同时,该系统运行于jvm应用环境中。
如图1中所示,该系统中设置有多个运行单元1,运行单元1作为该系统运行应用程序的基本单位,其概念类似于操作系统的进程,作为该系统可以调度的基本对象。每个运行单元分别用于运行应用程序,即作为应用程序的运行载体。
每个运行单元1分别连接一存储空间2,存储空间2中用于保存运行单元1中发生程序中断事件的中断时刻的代码数据以及中断位置数据,代码数据中包括应用程序当前的局部变量数据和操作数栈数据。上述存储空间2相互独立,并且可以被包括在同一个物理存储空间内,即为该物理存储空间内的不同的物理存储区域。图1中仅示出独立的多个存储空间2,并不示出该物理存储空间,在此不再赘述。
上述存储空间2分别用于保存对应的运行单元1中运行的应用程序在程序中断时的中断数据,也即保存中断时的数据快照。
本实施例中,上述程序可中断运行系统中还包括:
调度单元3,分别连接每个运行单元1,用于根据运行单元1当前的运行状态对运行单元1进行调度。
具体地,调度单元3对运行单元1的调度方式为:
当运行单元1的运行状态为初始状态时,调度单元3调度运行单元1承载应用程序并开始运行程序代码;
当运行单元1的运行状态为执行状态,且程序代码运行至可中断编码处时,运行单元1中断应用程序的运行,并将程序代码当前的中断数据暂存于运行单元1所对应的存储空间2内,调度单元3将运行单元1的运行状态改为中断状态;
当运行单元1的运行状态由中断状态更改为恢复状态时,运行单元1根据对应的存储空间2内暂存的中断数据,将应用程序恢复到中断时的状态,调度单元3将运行单元1的运行状态更改为执行状态。
具体地,本实施例中,运行单元1具有多个不同的运行状态,每个运行状态分别用于表示运行单元1目前处于哪个运行阶段,例如:
初始状态(ready):用于表示运行单元1已经准备好,可以被调度单元调度执行;
执行状态(running):用于表示运行单元1目前正在执行应用程序;
中断状态(interrupted):用于表示运行单元1目前处于应用程序中断的状态(此时中断数据已经暂存完毕);
恢复状态(resume):用于表示运行单元1目前处于可以重新执行应用程序的状态,该状态通常由之前导致中断的调用方法得到结果反馈触发的。
另外,除了上文中提及的运行状态外,上述运行单元1的运行状态还包括:
现场保存状态(capturing):用于表示运行单元1当前正在保存中断数据;
重新执行状态(restoring):用于表示运行单元1可以被调度单元重新调度执行;
完成状态(finish):用于表示运行单元1中承载的应用程序已经运行完毕。
本发明的较佳的实施例中,上述程序可中断运行系统中设置一程序运行框架(图中未示出),运行单元1可在程序运行框架内占用系统资源并运行应用程序;
当运行单元1的运行状态为初始状态时,调度单元3将运行单元1调度到程序可中断运行系统的程序运行框架中,以使得运行单元1能够运行应用程序;
当运行单元1的运行状态为中断状态时,调度单元3将运行单元1拖离程序运行框架,以释放运行单元1所占用的系统资源。
则上述运行单元1的调度过程和状态转换可以如图2中所示:
运行单元1处于初始状态,此时调度单元3将该运行单元1调度进程序运行框架中的执行队列,以使运行单元1上承载的应用程序能够运行,同时调度单元3将运行单元1的运行状态更改为执行状态。
运行单元1处于执行状态时,其存在两种可能性:
一种可能性为没有任何中断发生,运行单元1一直运行到应用程序执行完毕,此时运行单元1处于完成状态,调度单元1可以将其拖离程序运行框架,以释放该运行单元1占用的系统资源。
另一种可能性为发生了中断,此时调度单元3将运行单元1的运行状态由执行状态更改为现场保存状态,运行单元1开始将中断数据暂存到对应的存储空间2内。当中断数据存储完毕后,运行单元1的运行状态由现场保存状态更改为中断状态,此时调度单元3可以将运行单元1脱离程序运行框架,以释放该运行单元1占用的系统资源,同时允许其他正在等待执行的运行单元1开始执行。
在运行单元1处于中断状态时,若产生中断的调用方法回传相应的调用结果,则触发将运行单元1由中断状态更改为恢复状态,以表示运行单元1可以被重新执行。此时调度单元3调度运行单元1开始重新执行,其状态由恢复状态更改为重新执行状态,运行单元1根据之前暂存在存储空间2内的中断数据定位到相应的程序中断位置,并根据中断数据恢复程序中断时的现场状态。在恢复完毕后,调度单元3将运行单元1重新调度进程序运行框架中的执行队列,并将运行单元1的状态更改为执行状态,从而使得该运行单元1能够恢复执行其中承载的应用程序。
本发明的较佳的实施例中,上述运行单元1除了具有运行状态外,还具有程序的执行代码入口,该入口作用类似于main函数功能,提供给应用程序进行代码接入并自动运行。
本发明的较佳的实施例中,于程序代码中,在调用系统注册的预定接口处定义可中断编码。换言之,程序代码中预定可能中断的位置应当为系统定义好的一些方法调用处,例如调用外部数据库的位置,或者进行rpc调用的位置等。
本发明的较佳的实施例中,如图1中所示,上述程序可中断运行系统中还包括:
标记单元4,连接每个运行单元1;
当运行单元1中断应用程序的运行时,标记单元4在中断时执行的代码处添加一预定标签,并以预定标签作为中断位置数据保存在存储空间2内;
当运行单元1的运行状态由中断状态更改为恢复状态时,运行单元1根据预定标签定位应用程序在中断时的执行位置。
具体地,由于不存在类似程序指针寄存器之类的数据结构的支持,要在应用层上实现在程序中断的时候记录程序中断的位置是一个难点。在本实施例中,采用主动修改程序代码的方式解决上述问题,即当程序中断发生时(运行到预定的可中断编码处时),主动在该处添加一个预定标签,同时将该预定标签作为中断位置数据保存在存储空间2内。进一步地,一个调用方法中的所有预定标签统一使用从0开始的整数编号依序命名,在存储空间2内保存的中断位置数据就使用相应的预定标签的整数编号来记录,这样在恢复执行时就能够很方便地定位到之前程序中断发生的位置。
本技术方案实现的另一个难点在于:jvm应用环境是不对用户开放的,用户层面没有任何接口可以获得jvm应用环境中操作数栈内的数据。对于此,由于在引起程序中断的调用方法被调用时,操作数栈中的数据会依次对应转换为该调用方法的参数,因此本发明的较佳的实施例中,在程序中断发生时主动构造一个与产生中断的调用方法相同的方法,就能够将原有的调用方法中的参数转化为新构造的方法中的局部变量数据,即可以通过新构造的方法获得操作数栈中的数据。
本发明的较佳的实施例中,上述存储空间2均为栈帧集合;
栈帧集合中包括多个依序排列的栈帧,每个栈帧中用于保存应用程序在运行时的每一次方法调用所产生的代码数据,栈帧的排列顺序与方法调用的发生顺序相同。栈帧中用于保存上述代码数据以及中断位置数据。
综上所述,本发明技术方案中,在应用层上仿照底层进程中断的机制构建一个程序可中断运行系统,采用运行单元作为该系统的基本运行单位来运行应用程序,并通过运行单元的状态变化对运行单元进行调度,从而实现应用程序中断和恢复的调度过程。
本发明的较佳的实施例中,基于上文中所述的程序可中断运行系统,现提供一种程序可中断运行方法,具体如图3中所示,包括:
步骤s1,运行单元处于初始状态,调度单元调度运行单元开始承载应用程序并运行,同时将运行单元的运行状态改为执行状态;
步骤s2,当运行单元中的应用程序运行至可中断编码处时,运行单元中断应用程序的运行,调度单元将运行单元的状态更改为现场保存状态,随后运行单元将程序代码当前的中断数据暂存于运行单元所对应的存储空间内;
步骤s3,当中断数据暂存完毕后,调度单元将运行单元的运行状态改为中断状态;
步骤s4,当可中断编码所调用的方法有返回值时,运行单元的运行状态由中断状态更改为恢复状态;
步骤s5,调度单元重新对运行单元进行调度,并将运行单元的运行状态更改为重新执行状态;
步骤s6,运行单元根据对应的存储空间内暂存的中断数据,将应用程序恢复到中断时的状态,调度单元将运行单元的运行状态更改为执行状态,随后返回步骤s2。
本发明的较佳的实施例中,上述步骤s2中,运行单元的执行过程具体如图4中所示,包括:
步骤s21,运行单元运行应用程序的过程中遇到可中断编码,则运行单元调用可中断编码所对应的方法,随后转向步骤s22;
步骤s22,运行单元判断自身的运行状态是否为现场保存状态:
若是,则转向步骤s23;
若否,则继续执行应用程序,随后返回步骤s2;
步骤s23,运行单元将程序代码当前的中断数据暂存于运行单元所对应的存储空间内,随后转向步骤s3。
本发明的较佳的实施例中,当运行单元中断应用程序的运行时,在中断时执行的代码处添加一预定标签,并以预定标签作为中断位置数据保存在存储空间内;
则上述步骤s6中,运行单元的执行过程具体如图5中所示,包括:
步骤s61,运行单元判断对应的存储空间内是否保存有中断位置数据:
若是,则转向步骤s62;
若否,则回到应用程序的起始代码处并开始执行,随后返回步骤s2;
步骤s62,运行单元根据中断位置数据定位到应用程序在中断时的执行位置;
步骤s63,运行单元从对应的存储空间内读取代码数据并恢复执行应用程序,随后返回步骤s2。
以上所述仅为本发明较佳的实施例,并非因此限制本发明的实施方式及保护范围,对于本领域技术人员而言,应当能够意识到凡运用本发明说明书及图示内容所作出的等同替换和显而易见的变化所得到的方案,均应当包含在本发明的保护范围内。
1.一种程序可中断运行系统,其特征在于,所述程序可中断运行系统运行于应用层上;
所述程序可中断运行系统中设置有多个运行单元,每个所述运行单元分别用于运行应用程序;
于所述应用程序的程序代码中的多个预定位置预先定义可中断编码;
每个所述运行单元分别连接一存储空间,所述存储空间中用于保存所述运行单元中发生所述程序中断事件的中断时刻的代码数据以及中断位置数据,所述代码数据中包括所述应用程序当前的局部变量数据和操作数栈数据;
所述程序可中断运行系统中还包括:
调度单元,分别连接每个所述运行单元,用于根据所述运行单元当前的运行状态对所述运行单元进行调度:
当所述运行单元的运行状态为初始状态时,所述调度单元调度所述运行单元承载所述应用程序并开始运行所述程序代码;
当所述运行单元的运行状态为执行状态,且所述程序代码运行至所述可中断编码处时,所述运行单元中断所述应用程序的运行,并将所述程序代码当前的所述中断数据暂存于所述运行单元所对应的所述存储空间内,所述调度单元将所述运行单元的运行状态改为中断状态;
当所述运行单元的运行状态由所述中断状态更改为恢复状态时,所述运行单元根据对应的所述存储空间内暂存的所述中断数据,将所述应用程序恢复到中断时的状态,所述调度单元将所述运行单元的运行状态更改为所述执行状态。
2.如权利要求1所述的程序可中断运行系统,其特征在于,于所述程序代码中,在调用系统注册的预定接口处定义所述可中断编码。
3.如权利要求1所述的程序可中断运行系统,其特征在于,还包括:
标记单元,连接每个所述运行单元;
当所述运行单元中断所述应用程序的运行时,所述标记单元在中断时执行的代码处添加一预定标签,并以所述预定标签作为所述中断位置数据保存在所述存储空间内;
当所述运行单元的运行状态由所述中断状态更改为恢复状态时,所述运行单元根据所述预定标签定位所述应用程序在中断时的执行位置。
4.如权利要求1所述的程序可中断运行系统,其特征在于,所述程序可中断运行系统中设置一程序运行框架,所述运行单元可在所述程序运行框架内占用系统资源并运行应用程序;
当所述运行单元的运行状态为所述初始状态时,所述调度单元将所述运行单元调度到所述程序可中断运行系统的程序运行框架中,以使得所述运行单元能够运行所述应用程序;
当所述运行单元的运行状态为所述中断状态时,所述调度单元将所述运行单元拖离所述程序运行框架,以释放所述运行单元所占用的系统资源。
5.如权利要求1所述的程序可中断运行系统,其特征在于,所述存储空间为栈帧集合;
所述栈帧集合中包括多个依序排列的栈帧,每个栈帧中用于保存所述应用程序在运行时的每一次方法调用所产生的所述代码数据,所述栈帧的排列顺序与方法调用的发生顺序相同。
6.一种程序可中断运行方法,其特征在于,应用如权利要求1-5中任意一项所述的程序可中断运行系统;
所述程序可中断运行方法具体包括:
步骤s1,所述运行单元处于初始状态,所述调度单元调度所述运行单元开始承载所述应用程序并运行,同时将所述运行单元的运行状态改为所述执行状态;
步骤s2,当所述运行单元中的应用程序运行至所述可中断编码处时,所述运行单元中断所述应用程序的运行,所述调度单元将所述运行单元的状态更改为现场保存状态,随后所述运行单元将所述程序代码当前的所述中断数据暂存于所述运行单元所对应的所述存储空间内;
步骤s3,当所述中断数据暂存完毕后,所述调度单元将所述运行单元的运行状态改为中断状态;
步骤s4,当所述可中断编码所调用的方法有返回值时,所述运行单元的运行状态由所述中断状态更改为所述恢复状态;
步骤s5,所述调度单元重新对所述运行单元进行调度,并将所述运行单元的运行状态更改为重新执行状态;
步骤s6,所述运行单元根据对应的所述存储空间内暂存的所述中断数据,将所述应用程序恢复到中断时的状态,所述调度单元将所述运行单元的运行状态更改为所述执行状态,随后返回所述步骤s2。
7.如权利要求6所述的程序可中断运行方法,其特征在于,所述步骤s2中,所述运行单元的执行过程具体包括:
步骤s21,所述运行单元运行所述应用程序的过程中遇到所述可中断编码,则所述运行单元调用所述可中断编码所对应的方法,随后转向步骤s22;
步骤s22,所述运行单元判断自身的运行状态是否为所述现场保存状态:
若是,则转向步骤s23;
若否,则继续执行所述应用程序,随后返回所述步骤s2;
步骤s23,所述运行单元将所述程序代码当前的所述中断数据暂存于所述运行单元所对应的所述存储空间内,随后转向所述步骤s3。
8.如权利要求6所述的程序可中断运行方法,其特征在于,当所述运行单元中断所述应用程序的运行时,在中断时执行的代码处添加一预定标签,并以所述预定标签作为所述中断位置数据保存在所述存储空间内;
所述步骤s6中,所述运行单元的执行过程具体包括:
步骤s61,所述运行单元判断对应的所述存储空间内是否保存有所述中断位置数据:
若是,则转向步骤s62;
若否,则回到所述应用程序的起始代码处并开始执行,随后返回所述步骤s2;
步骤s62,所述运行单元根据所述中断位置数据定位到所述应用程序在中断时的执行位置;
步骤s63,所述运行单元从对应的所述存储空间内读取所述代码数据并恢复执行所述应用程序,随后返回所述步骤s2。
技术总结