1说明书摘要本发明公开了一种基于虚拟内核对象的Linux程序检查点用户级实现方法,在应用层与系统API层之间插入检查点层,其中检查点层包括应用线程检查点控制层和内核对象状态跟踪记录与对象引用映射层,应用层对系统API的调用被重定向到检查点层;对应用线程设置执行位置标志;控制应用线程的检查点不落入内核对象状态跟踪记录与对象引用映射层、系统API层和内核层中。本发明在用户级为Linux应用程序进程在不同机器之间的迁移,为进程在动态环境下基于检查点的正确恢复提供支持,以实现负载平衡、系统容错和高效软件排错。1摘要附图系统API层应用层完整内核对象内核对象状态跟踪记录与对象引用映射层应用线程检查点控制层中断点检查点层中断例程执行代码流内核层原子方式执行①②③④④⑤1权利要求书1、一种基于虚拟内核对象的Linux程序检查点用户级实现方法,其特征在于,在应用层与系统API层之间插入检查点层,其中检查点层包括应用线程检查点控制层和内核对象状态跟踪记录与对象引用映射层,应用层对系统API的调用被重定向到检查点层,对应用线程设置执行位置标志:当应用线程的执行从应用层移入检查点层时,置位其执行位置标志,当应用线程的执行从应用线程检查点控制层返回应用层时复位其执行位置标志;控制应用线程的检查点不落入内核对象状态跟踪记录与对象引用映射层、系统API层和内核层中,进程检查点实现方法如下:进程启动执行时,执行检查点初始化例程,完成系统API截获、检查点线程创建、检查点参数读取操作;该进程的进程检查点过程包括如下三个阶段:1)使该进程的所有应用线程进入检查点就绪状态;该进程的检查点线程置位检查点标志,触发检查点中断信号;该进程的所有应用线程的执行将被中断,转去执行中断例程,在中断例程中,应用线程如果发现自己的执行位置标志在复位状态,则调用检查点例程;对执行位置标志为置位状态的应用线程,其执行从中断例程返回,并将移入应用线程检查点控制层,调用检查点例程;在检查点例程中,应用线程释放其拥有的所有同步对象,获取自身线程上下文,然后进入检查点就绪状态,等待进程状态快照完成;2)进程状态快照获取:在该进程的所有应用线程进入检查点就绪状态后,该进程的检查点线程做进程状态快照,内容包括该进程的应用线程上下文、所有虚拟内核对象、应用线程栈,以及该进程中应用程序使用的堆、全局变量、申请的内存数据块;23)执行恢复:进程状态快照完成后,该进程的检查点线程触发所有应用线程恢复执行:应用线程恢复拥有其在第一阶段释放的同步对象,然后等待检查点线程的通知,在所有应用线程都恢复拥有其同步对象之后,检查点线程触发所有应用线程恢复执行,运行态线程恢复其正常执行,等待态线程则重新调用等待API函数进入等待状态。1说明书基于虚拟内核对象的Linux程序检查点用户级实现方法技术领域本发明涉及一种捕获Linux应用程序进程状态,以及恢复进程状态使其继续执行的方法,具体是一种基于虚拟内核对象的Linux程序检查点用户级实现方法。背景技术进程检查点可以分别在操作系统级、用户级或者应用级实现,各有其特点。操作系统级实现的进程检查点对用户程序透明,容易得到进程的内核数据结构,但需要修改系统内核,其可配置性和移植性差,检查点开销也大。用户级的进程检查点将检查点功能实现部分编译为一个库并链接到应用程序,可以实现对应用程序透明,具有易于配置且开销较小的特点。不过其实现机制与操作系统平台相关,平台移植性较差。应用级检查点的优点是能够实现平台无关性,可在不同的操作系统间移植,其不足之处是对应用的限定多,只能对部分应用程序有效。由于用户级的进程检查点具有对应用程序透明、易于配置、开销较小且实用等特点,因此很多检查点系统都选择在用户级实现。Unix、Windows、Linux是目前使用最广的操作系统,在用户级实现进程检查点都已有一些方法。进程状态包括用户空间状态和内核空间状态。用户空间状态在进程用户地址空间和CPU寄存器中,在用户级可以直接对其进行访问。内核空间状态是指与目标进程相关的系统内核对象及其状态。内核空间由操作系统管理,在用户级不能对其直接进行访问。现有获取内核空间状态的方法是跟踪进程对系统2API的调用,然后基于跟踪信息来判定内核空间状态。进程用户空间状态和内核空间状态存在耦合关系,即用户空间状态中存有内核空间中相关对象的引用。在用户级对系统内核对象进行访问操作,要求通过调用系统API来实现。在用户级通过调用系统API来创建(打开)系统内核对象时,操作系统返回一个对象引用。随后应用程序对内核对象的访问都是使用对象引用作为标识参数调用相应系统API来完成。在恢复时,系统重启,使用检查点信息来恢复进程状态,使进程从检查点状态继续执行。现有内核空间状态恢复方法是使用检查点信息通过系统API调用来完成。这种内核空间状态恢复方法不能实现严格一致的恢复,恢复后的用户空间状态和内核空间状态的耦合关系有可能被打破。具体来说,就是恢复时操作系统所给的对象引用与保存在用户空间状态中的对象引用不一定相同。这种对象引用不重现特性给进程恢复执行带来问题。故障恢复后的执行中,应用程序会使用恢复前的对象引用去访问恢复后所创建的内核对象,导致应用程序恢复执行失败。针对该问题,现有解决方法包括对象引用复制方法和虚拟对象方法。在对象引用复制方法中,恢复时反复调用对象引用复制函数,直至系统返回一个相同的引用值。该方法的问题是有可能复制不出一个相同的引用值而使恢复失败。在虚拟对象方法中,应用程序使用虚拟对象引用访问内核对象,检查点系统负责管理虚拟对象引用和真实对象引用,在应用程序访问内核对象时负责把虚拟对象引用转换成真实对象引用。做检查点时,在用户级对应用线程的控制是一种异步操作,应用线程的检查点位置具有不确定性。当应用线程检查点位于系统API调用代码、系统API代码或者内核代码中时,检查点中记录的内核对象状态可能与真实的内核对象状态不一致。虚拟对象方法依然存在恢复不成功的隐患。图1为恢复不成功的例子。我们知道,程序可看作由计算、系统API调3用这样的单元串接而成。图1中假定应用线程检查点落在设置文件指针这个系统API代码中。重启恢复执行会有如下两个问题:1)使用原来的文件引用(h=1)去访问恢复后的内核文件对象(由于不能严格一致恢复,文件引用已变为h=3),执行失败;2)即使恢复后没有引用问题,恢复时使用检查点信息把文件指针恢复为p=5,设置文件指针API调用返回后,p=8,而实际应该等于5,产生逻辑错误。发明内容针对现有技术存在的上述缺陷,本发明旨在提供一种基于虚拟内核对象的Linux程序检查点用户级实现方法,改变程序执行中的函数调用关系,使得原有的不可控耦合关系变成可控的耦合关系,控制应用线程检查点不落在系统API调用代码、系统API代码或者内核代码中;本发明是一种捕获Linux应用程序进程状态,以及恢复进程状态使其继续执行的方法,在用户级为Linux应用程序进程在不同机器之间的迁移,为进程在动态环境下基于检查点的正确恢复提供支持,以实现负载平衡、系统容错和高效软件排错。为达到上述发明目的,本发明的技术方案是:一种基于虚拟内核对象的Linux程序检查点用户级实现方法,在应用层与系统API层之间插入检查点层,其中检查点层包括应用线程检查点控制层和内核对象状态跟踪记录与对象引用映射层,应用层对系统API的调用被重定向到检查点层;对应用线程设置执行位置标志:当应用线程的执行从应用层移入检查点层时,置位其执行位置标志,当应用线程的执行从应用线程检查点控制层返回应用层时复位其执行位置标志;控制应用线程的检查点不落入内核对象状态跟踪记录与对象引用映射层、系统API层和内核层中,进程检查点实现方法如下:进程启动执行时,执行检查点初始化例程,完成系统API截获,即系统4API调用重定向、检查点线程创建、检查点参数读取操作;该进程的进程检查点过程包括如下三个阶段:1)使该进程的所有应用线程进入检查点就绪状态;该进程的检查点线程置位检查点标志,触发检查点中断信号;该进程的所有应用线程的执行将被中断,转去执行中断例程,在中断例程中,应用线程如果发现自己的执行位置标志在复位状态,则调用检查点例程;对执行位置标志为置位状态的应用线程,其执行从中断例程返回,并将移入应用线程检查点控制层,调用检查点例程;在检查点例程中,应用线程释放其拥有的所有同步对象,获取自身线程上下文,然后进入检查点就绪状态,等待进程状态快照完成;2)进程状态快照获取:在该进程的所有应用线程进入检查点就绪状态后,该进程的检查点线程做进程状态快照,包括该进程的应用线程上下文、所有虚拟内核对象、应用线程栈,以及该进程中应用程序使用的堆、全局变量、申请的内存数据块;3)执行恢复:进程状态快照完成后,该进程的检查点线程触发所有应用线程恢复执行:应用线程恢复拥有其在第一阶段释放的同步对象,然后等待检查点线程的通知,在所有应用线程都恢复拥有其同步对象之后,检查点线程触发所有应用线程恢复执行,运行态线程恢复其正常执行,等待态线程则重新调用等待API函数进入等待状态。基于检查点的进程恢复执行过程如下:进程重启执行时,主线程首先调用检查点初始化例程,然后检查是否为进程恢复。如果是,则执行恢复例程。在恢复例程中,主线程首先读取要恢复的检查点,然后基于检查点信息恢复所有虚拟内核对象,并通过系统API调用创5建相应同步对象,将其状态设为相应虚拟内核对象的状态,再以线程上下文所在内存地址为传递参数创建子线程。子线程入口函数不是原有线程函数,而是一个只包含调用系统API函数siglongjmp()语句的函数。被创建的子线程一启动就使用传递参数调用系统API函数siglongjmp()恢复其线程上下文。主线程创建完子线程后,从检查点中读取自己栈指针值,然后调用一递归函数来减小自己栈指针,直至其小于检查点中保存的值,然后使用检查点数据,恢复进程用户空间状态,其中包括自己线程栈数据(从保存的栈指针至栈底这段内存中的数据),子线程栈数据,堆,全局变量,以及应用申请的内存数据块。最后主线程调用系统API函数siglongjmp()恢复其线程上下文。在所有应用线程恢复了上下文之后,检查点线程触发所有应用线程恢复执行。应用线程恢复其原拥有的同步对象,然后等待检查点线程的通知。在所有应用线程都恢复拥有其同步对象之后,检查点线程触发所有应用线程恢复执行。运行态线程恢复其正常执行,等待态线程则重新调用等待API进入等待状态。至此,进程恢复完毕。本发明的工作原理详细描述如下:所述基于虚拟内核对象的Linux程序检查点用户级实现方法,在应用层与系统API层之间插入虚拟内核对象层(检查点层),应用代码不再直接通过调用系统API去访问内核对象了,而是被重定向去访问对应的虚拟内核对象。对应用层请求的操作,虚拟内核对象再调用相应系统API来完成。这样,系统API层对应用层就不再可见(即透明)。虚拟内核对象跟踪记录相应内核对象的属性值,同时维护两个对象引用值:提供给应用层的虚拟对象引用值,相应内核对象的真实对象引用值。真实对象引用值只对虚拟内核对象可见,对应用层不可见。这样真实对象引用值在用户地址空间中的存储就具有了可管理性,检查点系统能够管理其内存存储地址。针对上述虚拟内核对象,须要对应用线程6的检查点进行控制。对应用线程检查点的控制有两个要求:1)保证虚拟内核对象的属性值与相应内核对象的属性值完全一致;2)在用户空间状态中,真实对象引用值除了出现在对应虚拟内核对象的成员变量中外,不能出现在其它任何地方(例如线程栈中)。真实对象引用值出现在其他地方是完全可能的,例如,当虚拟内核对象调用系统API时,它将作为传递参数出现在线程栈中。在本发明方法中,检查点层分成两层:应用线程检查点控制层和内核对象状态跟踪记录与对象引用映射层,应用线程检查点控制层控制其下的代码段就检查点而言以原子方式执行,即线程检查点不落入其中,以满足上述应用线程检查点控制要求。具体的控制方法如下:程序启动执行时,主线程首先调用检查点初始化例程,完成系统API截获(系统API调