双进程冗余瞬时故障容错方法转让专利

申请号 : CN201310006126.5

文献号 : CN103064770B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 门朝光何忠政李香冯红斌

申请人 : 哈尔滨工程大学

摘要 :

本发明提供的是一种双进程冗余瞬时故障容错方法。由双进程冗余故障检测用户级模块、双进程冗余故障检测内核级模块、检查点设置用户级模块、检查点设置内核级模块、检查点卷回恢复用户级模块和检查点卷回恢复内核级模块六个模块组成的Linux内核模块实现。该方法将任务进程进行派生,派生出一个傀儡进程和两个任务进程(主任务进程和从任务进程),通过两个任务进程系统调用参数的比较及系统调用的执行和模拟,实现系统调用参数的瞬时故障检测;通过任务进程正常运行过程中设置的检查点实现故障后的卷回恢复。开销低,适用于基于普通硬件架构的进程级双模冗余容错方法,通用性好。

权利要求 :

1.一种双进程冗余瞬时故障容错方法,由双进程冗余故障检测用户级模块、双进程冗余故障检测内核级模块、检查点设置用户级模块、检查点设置内核级模块、检查点卷回恢复用户级模块和检查点卷回恢复内核级模块六个模块组成的Linux内核模块实现,其特征是具体包括如下步骤:(1)应用程序执行时,由双进程冗余故障检测用户级模块调用变量初始化函数,对配置变量进行初始化,然后注册检查点设置信号和双进程冗余比较结果信号,实现检查点设置的响应、傀儡进程和主/从任务进程的信息通信;接着应用程序进程调用fork系统调用,派生出两个子进程,并调用execve系统调用,将自身替换为用户任务进程;最后将应用程序作为参数,传给双进程冗余故障检测内核级模块,应用程序进程本身退化为傀儡进程;所述傀儡进程用于检查点的设置及响应用户操作并将操作命令和信号分发给任务进程,返回任务进程执行结果,监控所有任务进程状态;

(2)双进程冗余故障检测内核级模块实现系统调用的封装、傀儡进程和主/从任务进程的注册、系统调用参数瞬时故障检测;

所述系统调用的封装的方法为:首先获取原系统调用表地址;然后将原系统调用表导入临时系统调用表中;接着将临时系统调用表中需要捕获的系统调用进行替换;最后在主函数中添加被监控进程判定、系统调用参数比较、系统调用执行和模拟、检测结果反馈的功能,并用临时系统调用替换当前系统调用;

所述傀儡进程和主/从任务进程的注册的方法包括:

傀儡进程注册步骤为:首先分配傀儡进程记录结构体数据空间,然后给傀儡进程的进程号、阻塞队列数据赋值,最后将傀儡进程加入傀儡进程链表;

主/从任务进程注册步骤为:首先分配主/从任务进程记录结构体数据空间,这包括进程号,隶属傀儡进程、主/从任务进程标记序号数据,并为这些数据赋值;然后将主/从任务进程分别加入主/从任务进程链表;最后将主/从任务进程加入hash链表,并修改位图标记;

所述系统调用参数瞬时故障检测包括捕获系统调用、系统调用参数比较、系统调用的执行和模拟、双进程冗余比较结果信号的发送;当主/从任务进程正常运行并执行系统调用时,双进程冗余瞬时故障检测内核级模块首先捕获系统调用,然后判定该进程是否是被监控进程,如果是被监控进程,则进行系统调用参数比较,如果不是被监控进程,则执行原系统调用;

(3)检查点设置用户级模块实现检查点设置信号的响应,并调用检查点设置内核级模块实现检查点状态的保存;

(4)检查点设置内核级模块实现检查点设置信号的处理,完成任务进程检查点状态的保存;

(5)检查点卷回恢复用户级模块实现傀儡进程检查点卷回恢复的响应,并调用检查点卷回恢复内核级模块实现进程的卷回恢复;

(6)检查点卷回恢复内核级模块实现故障进程卷回恢复。

说明书 :

双进程冗余瞬时故障容错方法

技术领域

[0001] 本发明涉及的是一种计算机系统容错方法。具体地说是一种计算机系统任务进程瞬时故障容错方法。

背景技术

[0002] 随着计算机、互联网技术的飞速发展,信息化已经深入到社会的方方面面,计算机已成为当前科研、商用、军事作战不可或缺的设备,计算机技术在提高工作效率、提高信息交流等方面极大地改变了人们的生活方式,因此计算机性能的提升成为人们一直追求的目标。在计算机性能提升过程中,设备中集成电路制造工艺持续发展,电路中晶体管尺寸及工作电压的减小降低了集成电路噪声容限,且集成度进一步提高使芯片更易受瞬时故障影响;器件速度的加快导致功耗也越来越高,器件寿命及可靠性受到影响,从而影响系统可靠性。恶劣的环境也使得计算机面临更加严峻的瞬时故障的影响,这使得执行任务的计算机性能及其中任务的稳定、可靠、正确执行必然会受到影响。对那些需要保障信息安全和提供不间断信息服务的机构如证券、制造、通信、银行、运输等来说,业务系统的可靠性和不间断性尤为重要,因为一次系统的故障可能带来无法估量的损失。因此随着计算机向更高速度、更高性能发展的需求,其不可避免的面临健壮性、可靠性问题。容错技术正是在这种客观需求下应运而生。
[0003] 容错技术是在冗余资源(硬件冗余、时间冗余、信息冗余、软件冗余)的基础上,通过设计合理的体系结构及算法而形成。故障检测是实现容错计算机系统的关键技术之一,故障检测技术能够实时监测并发现系统中存在及潜在的故障,并指导采取相应的措施,减少故障带来的损害。对任务数据的比较、表决是错误检测的主要手段。故障恢复技术能够在检测出故障后,使任务恢复正确执行,以提高计算机系统的健壮性、安全性,从而避免更严重的故障传播后果。故障检测与故障恢复技术是提高计算机系统健壮性和安全性的重要手段。
[0004] 对数据的比较、表决主要有基于硬件和基于软件两种方式。基于硬件的方法在系统中增加包含比较或投票逻辑的比较芯片,对所有待写出的数据进行比较、表决,这种方式发现错误及时,但设计复杂,实现成本高。由于瞬时故障具有影响瞬时性、随机性强、相同故障重复发生概率极小、故障不会持久存在的特点,当重新写入新数据后故障现象即消失,基于软件实现的容错技术能够通过重复执行程序来实现错误检测和恢复功能。基于软件方法在库函数或者应用程序中设置比较、表决点,对任务的中间结果和最后输出进行一致性判断,这种方式系统设计简单,但对应用透明性差。基于双进程冗余系统调用参数比较的瞬时故障检测方式在实现计算机系统自身的故障检测方面,具有成本低,通用性强,且能够过滤良性故障的影响,能够在进程的执行过程中进行故障检测。结合检查点设置与卷回恢复的双进程冗余瞬时故障技术与三模冗余容错技术相比能够降低给计算机系统带来的额外开销。
[0005] 对于软件或硬件引起的瞬时故障,在计算机系统的软、硬件资源都有限的情况下,利用时间冗余的软件容错方法来实现计算机系统的容错,具有成本低、实现和使用简单、对资源要求低且不需修改硬件的体系结构的优势,可以提高计算机系统的健壮性与可靠性。当前最流行的基于时间冗余软件容错方法是检查点设置与卷回恢复技术,该技术已被广泛应用于单处理器、多处理机、分布式系统以及并行计算机的容错。根据设置检查点与恢复机制的不同,检查点设置与卷回恢复机制被分为两大类:基于检查点的卷回恢复和基于日志的卷回恢复。基于日志的卷回恢复协议需要一定的存储空间来记录系统运行日志,同时也增加了系统无故障执行时的开销。
[0006] 按照检查点功能实现方式的不同,检查点系统主要分为用户级和系统级。用户级的检查点系统具有实现简单,可移植性好,但是透明性较差,检查点功能有限。系统级的检查点系统对应用程序透明,且检查点功能较用户级强大。

发明内容

[0007] 本发明的目的在于提供一种能够实现任务进程瞬时故障的自动检测到恢复,无需人工干预恢复,且能够过滤良性故障对任务进程执行的影响,开销低,通用性好的双进程冗余瞬时故障容错方法。
[0008] 本发明的目的是这样实现的:
[0009] 由双进程冗余故障检测用户级模块、双进程冗余故障检测内核级模块、检查点设置用户级模块、检查点设置内核级模块、检查点卷回恢复用户级模块和检查点卷回恢复内核级模块六个模块组成的Linux内核模块实现,具体包括如下步骤:
[0010] (1)应用程序执行时,由双进程冗余故障检测用户级模块调用变量初始化函数,对配置变量、用户参数进行初始化,然后注册检查点设置信号和双进程冗余比较结果信号,实现检查点设置的响应、傀儡进程和主/从任务进程的信息通信;接着应用程序进程调用fork系统调用,派生出两个子进程,并调用execve系统调用,将自身替换为用户任务进程;最后将应用程序作为参数,传给双进程冗余故障检测内核级模块,应用程序进程本身退化为傀儡进程;
[0011] (2)双进程冗余故障检测内核级模块实现系统调用的封装、傀儡进程和主/从任务进程的注册、系统调用参数瞬时故障检测;
[0012] (3)检查点设置用户级模块实现检查点设置信号的响应,并调用检查点设置内核级模块实现检查点状态的保存;
[0013] (4)检查点设置内核级模块实现检查点设置信号的处理,完成任务进程检查点状态的保存;
[0014] (5)检查点卷回恢复用户级模块实现傀儡进程检查点卷回恢复的响应,并调用检查点卷回恢复内核级模块实现进程的卷回恢复;
[0015] (6)检查点卷回恢复内核级模块实现故障进程卷回恢复。
[0016] 本发明还可以包括:
[0017] 1、所述系统调用的封装的方法为:首先获取原系统调用表地址;然后将原系统调用表导入临时系统调用表中;接着将临时系统调用表中需要捕获的系统调用进行替换;最后在主函数中添加被监控进程判定、系统调用参数比较、系统调用执行和模拟、检测结果反馈的功能,并用临时系统调用替换当前系统调用。
[0018] 2、所述傀儡进程和主/从任务进程的注册的方法包括:
[0019] 傀儡进程注册步骤为:首先分配傀儡进程记录结构体数据空间,然后给傀儡进程的进程号、阻塞队列数据赋值,最后将傀儡进程加入傀儡进程链表;
[0020] 主/从任务进程注册步骤为:首先分配主/从任务进程记录结构体数据空间,这包括进程号,隶属傀儡进程、主/从任务进程标记序号数据,并为这些数据赋值;然后将主/从任务进程分别加入主/从任务进程链表;最后将主/从任务进程加入hash链表,并修改位图标记。
[0021] 3、所述系统调用参数瞬时故障检测包括捕获系统调用、系统调用参数比较、系统调用的执行和模拟、双进程冗余比较结果信号的发送;当主/从任务进程正常运行并执行系统调用时,双进程冗余瞬时故障检测内核级模块首先捕获系统调用,然后判定该进程是否是被监控进程,如果是被监控进程,则进行系统调用参数比较,如果不是被监控进程,则执行原系统调用。
[0022] 本发明提供了一种基于系统调用参数比较和检查点设置与卷回恢复的双进程冗余瞬时故障容错方法。该方法组合使用双进程冗余故障检测和检查点设置与卷回恢复技术。采用服务于操作系统核心层的双进程冗余执行容错方法,主任务进程正常执行系统调用,从任务进程进行系统调用模拟执行,通过对主/从任务进程系统调用参数的比较,进行瞬时故障的检测。如果参数一致则说明没有故障,如果参数不一致,则说明有故障,触发检查点卷回恢复,将任务进程卷回至过去某一正确任务状态。通过在Linux操作系统中添加内核模块,实现任务双进程冗余执行时的故障检测和检查点设置及故障后的卷回恢复功能。
[0023] 组合采用双进程冗余故障检测和检查点设置与卷回恢复技术,使任务进程能够容忍在执行过程中由于瞬时故障引起的系统调用参数错误,通过系统调用参数的比较实现瞬时故障的检测;在检测出故障后,检查点卷回恢复技术能够将故障进程卷回至过去某一正确的任务状态,使故障进程恢复正确的执行,实现计算机系统的容错。该方法能够实现任务进程瞬时故障的自动检测到恢复,无需人工干预恢复,且能够过滤良性故障对任务进程执行的影响。与三模冗余故障检测方式相比,该方法具有较低的开销。本发明是在操作系统核心层以内核模块方式实现,无须硬件定制且无须修改操作系统内核和应用程序,适用于基于普通硬件架构的进程级双模冗余容错方法,通用性好,而且可加载的内核模块实现方式可以根据用户需求进行进程的故障检测和恢复。

附图说明

[0024] 图1是本发明方法的模块结构图;
[0025] 图2是双进程冗余瞬时故障容错傀儡进程和主/从任务进程记录结构体链表存储结构;
[0026] 图3是双进程冗余系统调用参数瞬时故障容错示意图。

具体实施方式

[0027] 下面结合附图对本发明做更详细地描述:
[0028] 本发明是一种基于双进程冗余系统调用参数比较和检查点设置与卷回恢复技术的进程级瞬时故障自动容错方法分为两个部分:第一部分是故障检测部分,即在任务运行过程中进行系统调用时,进行系统调用参数的比较;同时通过检查点信号实现对任务进程进行周期性的检查点设置,以保存进程中间状态。第二部分是故障恢复部分,如果系统调用参数比较一致,进程继续执行,如果系统调用参数不一致,则触发检查点卷回恢复实现进程的卷回恢复,将故障进程卷回至过去某一正确状态。该方法由双进程冗余故障检测用户级模块、双进程冗余故障检测内核级模块、检查点设置用户级模块、检查点设置内核级模块、检查点卷回恢复用户级模块、检查点卷回恢复内核级模块六个模块组成的Linux内核模块实现。其模块结构图如图1所示。该方法的具体实现步骤如下:
[0029] (1)应用程序执行时,由双进程冗余故障检测用户级模块调用变量初始化函数,对相关配置变量、用户参数进行初始化。然后注册检查点设置信号和双进程冗余比较结果信号(信号状态由系统调用参数比较结果决定,参数值为1,则信号状态为故障,参数值为0,则信号状态为正常),实现检查点设置的响应、傀儡进程和主/从任务进程的信息通信。接着应用程序进程调用fork系统调用,派生出两个子进程,并调用execve系统调用,将自身替换为用户任务进程。最后将应用程序作为参数,传给双进程冗余故障检测内核级模块,应用程序进程本身退化为傀儡进程。傀儡进程用于检查点的设置及响应用户操作并将操作命令和信号分发给任务进程,返回任务进程执行结果,监控所有任务进程状态。傀儡进程等待主/从任务进程从内核发来的双进程冗余比较结果信号,若信号为正常执行完成标识,则进程继续执行,若信号为故障标识,则进行检查点卷回恢复。主任务进程和从任务进程分别执行参数中指定的相同任务,实现故障检测功能。
[0030] (2)双进程冗余故障检测内核级模块实现系统调用的封装、傀儡进程和主/从任务进程的注册、系统调用参数瞬时故障检测。
[0031] 1)系统调用的封装
[0032] 双进程冗余故障检测内核级模块实现进程系统调用参数瞬时故障检测,其实现方式是采用Linux内核模块方法对系统调用进行封装,在用户级和内核级之间建立系统调用模拟层,用于对SoR(Sphere of Replication,复制区域,对应进程的应用程序和库函数)区域的输入数据进行复制,及系统调用的仿真,并对SoR区域的输出数据进行比较。
[0033] 为了实现对应用程序的信息捕获,内核模块要在程序执行系统调用时将其捕获,捕获系统调用的方法就是更改系统调用表。系统调用表是一个函数指针数组,每个数据项都是一个函数指针,因此可以修改数据项让其指向新的自定义内核函数来实现对系统调用的捕获。新的系统调用函数进行系统调用参数比较后,再调用真正的系统调用。新的系统调用函数因系统调用号不同而不同,但为了保证接口一致,构建相同的主函数入口,所有新的系统调用函数调用主函数,通过不同的参数标识不同的系统调用。具体步骤为:首先获取原系统调用表地址;然后将原系统调用表导入临时系统调用表中;接着将临时系统调用表中需要捕获的系统调用进行替换;最后在主函数中添加被监控进程判定、系统调用参数比较、系统调用执行和模拟、检测结果反馈的功能,并用临时系统调用替换当前系统调用。
[0034] 2)傀儡进程和主/从任务进程的注册
[0035] 为了实现内核对傀儡进程和主/从任务进程的有效处理、区分被监控主/从任务进程和其他非被监控进程、判定主/从任务进程所隶属傀儡进程,需要对傀儡进程和主/从任务进程进行内核注册。傀儡进程注册在内核中保存主/从任务进程的公共信息,主/从任务进程注册在内核中保存各自的私有信息以备比较使用。
[0036] 傀儡进程注册步骤为:首先分配傀儡进程记录结构体数据空间,然后给傀儡进程的进程号、阻塞队列等数据赋值,最后将傀儡进程加入傀儡进程链表。
[0037] 阻塞队列用于进程进入系统调用时的同步等待及系统调用完成退出时的同步等待,其结构体为:
[0038] struct barrier_queue_str{
[0039] atomic_t arrive;/*已进入系统调用进程数目*/
[0040] atomic_t err;/*系统调用参数比较结果,1:结果不一致,0:结果一致*/[0041] atomic_t ret;/*系统调用返回结果*/
[0042] atomic_t leader_return;/*系统调用是否完成,1:完成,0:未完成*/[0043] wait_queue_head_t wait_in_kernel;/*系统调用进入同步等待队列*/[0044] wait_queue_head_t wait_sys_call;/*系统调用退出同步等待队列*/[0045] };
[0046] 傀儡进程记录结构体为:
[0047] struct figurehead_str{
[0048] struct active t{
[0049] s32arrive[P_NUM];/*00:没有到达内核,01:比较过程,10:执行系统调用*/[0050] spinlock_t a_lock;/*自旋锁,互斥访问arrive*/
[0051] }active;
[0052] struct semaphore sem;/*傀儡进程读写信号量*/
[0053] rwlock_t h_lock;/*傀儡进程读写锁*/
[0054] s32sys_num;/*系统调用号*/
[0055] s32param[MAX_PARAM_NUM];/*需比较的系统调用参数数组*/
[0056] volatile u32arrived;/*已进入系统调用进程数量,0:没有,1:一个*/[0057] structlist_head p_children;/*指向主任务进程的指针*/
[0058] struct list_head next_p_header;/*指向下一个傀儡进程的指针*/[0059] struct barrier_queue_str barrier;/*阻塞队列*/
[0060] struct task_struct*master;/*主任务进程task_struct指针*/[0061] struct task_struct*parent;/*傀儡进程task_struct指针*/
[0062] pid_t parent_pid;/*傀儡进程的进程号*/
[0063] atomic t c_num;/*已注册任务进程(主/从任务进程)数量*/
[0064] };
[0065] 主/从任务进程注册步骤为:首先分配主/从任务进程记录结构体数据空间,这包括进程号,隶属傀儡进程、主/从任务进程标记序号(首先完成注册的为主任务进程,其序号比从任务进程的序号小)等数据,并为这些数据赋值;然后将主/从任务进程分别加入主/从任务进程链表;最后将主/从任务进程加入hash链表,并修改位图标记,以便在系统调用参数比较时能够快速查询进程是否属于被监控进程。
[0066] 主/从任务进程记录结构体:
[0067] struct child_str{
[0068] struct list_head hash_process_ptr;/*子进程hash链表中的下一个进程*/[0069] struct list_head p_brother;/*同一个任务的下一个进程*/
[0070] struct figurehead_str*header;/*隶属傀儡进程指针*/
[0071] struct task_struct*myself;/*指向进程自身task_struct的指针*/[0072] pid_t mypid;/*进程自身的PID*/
[0073] s8*str;/*比较字符串缓冲区*/
[0074] s32param[MAX_PARAM_NUM];/*需比较的系统调用参数数组*/
[0075] };
[0076] 3)系统调用参数瞬时故障检测
[0077] 双进程冗余故障检测内核级模块的瞬时故障检测步骤包括捕获系统调用、系统调用参数比较、系统调用的执行和模拟、双进程冗余比较结果信号的发送。
[0078] 当主/从任务进程正常运行并执行系统调用时,双进程冗余瞬时故障检测内核级模块首先捕获系统调用,然后判定该进程是否是被监控进程。如果是被监控进程,则进行系统调用参数比较。如果不是被监控进程,则执行原系统调用。
[0079] 为兼顾判定方法的效率和准确性,采用位图和hash链表的方法来进行是否是被监控进程的判定。位图法是在模块加载时申请一个页面大小的空间,该页的第n个bit位中,‘0’代表进程号对页面大小(4×1024×8bit)取模后为n的进程不在监控列表中,‘1’代表该进程在监控列表中,此时只需在hash链表中搜索。hash链表法采用一个链表数组记录被监控进程,数组下标表示进程pid经hash算法后模上数组大小后的值,数组中每个元素指向的链表记录具有相同hash值的进程。只有位图标识为被监控状态,且在hash链表中的进程属于被监控进程。
[0080] 系统调用参数比较的实现首先需读入系统调用参数,但参数类型不同,获取内容也不尽相同。例如:当参数为指针变量时需要将其所指向的数据读入,并取CRC校验码作为比较数据;当有的变量参数允许不相同时可以不作比较;有的变量参数可以直接进行比较。
[0081] 在任务进程执行系统调用时,通过傀儡进程记录结构体中的已进入系统调用进程数量参数arrived来判断该进程是第几个进入系统调用的进程。如果参数arrived值为0,则该进程为第一个进入系统调用的进程,如果值为1则该进程为第二个进入系统调用的进程。如果该进程是第一个进入系统调用的进程,则将自身需要比较的参数信息存储在傀儡进程记录结构体中的系统调用比较参数数组,将已进入系统调用进程数量参数arrived值加1,进入系统调用进入同步等待队列,等待另一个进程进入系统调用;如果不是第一个进入系统调用的进程,则将傀儡进程记录结构体中的第一个进程的系统调用参数与进程自身的参数进行比较,并将系统调用参数比较结果赋值给傀儡进程结构体中的比较结果记录参数,并唤醒主任务进程继续执行。
[0082] 若系统调用参数不一致,则由主任务进程将标记为故障的双进程冗余比较结果信号发送给傀儡进程,通知傀儡进程进行检查点卷回恢复,主/从任务进程分别调用do_exit()终止执行。若系统调用参数一致,则由主任务进程将标记为正常的双进程冗余比较结果信号发送给傀儡进程,主任务进程进行系统调用的执行,从任务进程进行系统调用的模拟。
[0083] 系统调用的模拟需根据不同的系统调用类型进行不同的操作。对于需要向外界输出的系统调用,从任务进程不做任何操作。对于需要从外界输入的系统调用,从任务进程数据必须从主任务进程读入。对于其他的不会对外界造成干扰的系统调用,从任务进程可以执行该系统调用。系统调用的执行只需将系统调用号作为参数,从原系统调用表中提取系统调用函数入口地址,执行真正的系统调用。
[0084] 主任务进程系统调用执行完成之后,唤醒处于休眠状态的从任务进程,然后自身进入系统调用退出同步等待队列,进入休眠等待状态。从任务进程进行系统调用模拟,并通过读取阻塞队列中的主任务进程系统调用返回结果获取系统调用结果。从任务进程唤醒主任务进程。主任务进程将双进程冗余比较结果信号返回给傀儡进程,主/从任务进程分别完成系统调用的执行。
[0085] (3)检查点设置用户级模块实现检查点设置信号的响应,并调用检查点设置内核级模块实现检查点状态的保存。
[0086] 检查点设置用户级模块负责检查点信号处理,调用检查点设置内核级模块设置检查点,向调用者返回执行结果。为了实现用户透明性操作,采用预加载技术(LD_PRELOAD环境变量),在用户程序执行前首先将检查点设置用户级模块和相应的公共库文件一起加载到用户程序空间,使用户程序接收到检查点设置信号后主动调用检查点设置用户级模块,从而避免了修改用户代码。
[0087] (4)检查点设置内核级模块实现检查点设置信号的处理,完成任务进程检查点状态的保存。具体实现方法为:
[0088] 检查点设置内核级模块作为动态加载的内核模块实现进程状态保存,采用/proc设备虚拟文件方式与检查点设置用户级模块交互。在任务进程正常运行过程中,傀儡进程周期性通过检查点设置信号启动检查点设置用户级模块,检查点设置用户级模块调用检查点设置内核级模块,实现保存主/从任务进程状态。
[0089] 主/从任务进程接收到检查点设置信号后,检查点设置用户级模块中的检查点信号处理程序通过系统调用(ioctl方式)转入内核,执行检查点设置内核级模块。该模块将任务进程的进程标识相关信息、CPU寄存器相关信息、内存相关信息、信号相关信息、文件相关信息保存到检查点文件,并存储至稳定存储设备。
[0090] (5)检查点卷回恢复用户级模块实现傀儡进程检查点卷回恢复的响应,并调用检查点卷回恢复内核级模块实现进程的卷回恢复。
[0091] 在双进程冗余故障检测内核级模块检测出进程瞬时故障之后,向傀儡进程发送双进程冗余比较结果信号(信号值为故障标识),傀儡进程接收到信号后,触发检查点卷回恢复用户级模块派生出两个新进程,作为新的主/从任务进程恢复载体。检查点卷回恢复用户级模块执行ioctl系统调用,调用检查点卷回恢复内核级模块进入内核空间执行卷回恢复操作。
[0092] (6)检查点卷回恢复内核级模块实现故障进程卷回恢复。具体实现方法为:
[0093] 检查点卷回恢复内核级模块首先释放新的主/从任务进程的所有用户空间数据;然后根据检查点卷回恢复用户级模块传入的检查点文件路径,读入检查点文件内容,新建用户空间存储区,读入用户空间保存的数据;接着逐步替换主/从任务进程的进程标识符相关信息、CPU寄存器相关信息、信号相关信息、内存相关信息、文件相关信息。新的主/从任务进程核心结构替换为检查点文件保存的内容后,从内核空间返回用户空间,完成任务进程的恢复。
[0094] 在本发明的图1-图3中,1表示傀儡进程链表;2表示主任务进程链表;3表示从任务进程链表;4表示傀儡进程记录结构体;5表示主任务进程记录结构体;6表示从任务进程记录结构体;7表示系统调用进入同步等待队列;8表示系统调用退出同步等待队列;9表示检查点设置信号10表示双进程冗余比较结果信号;11表示导致系统调用参数发生错误的瞬时故障。
[0095] 运行insmod命令加载内核模块,双进程冗余故障检测内核级模块实现系统调用封装,初始化傀儡进程记录结构体4、主/从任务进程记录结构体5/6、被监控进程标记位图和被监控进程记录hash链表;检查点设置内核级模块实现在proc文件夹下新建checkpt/ctrl设备文件,并初始化该设备文件的open、read、write、ioctl基本文件操作,初始化检查点设置链表,检查点卷回恢复内核级模块实现初始化检查点卷回恢复链表。
[0096] 任务进程执行时,用户输入‘mulrun应用程序名称’命令,应用程序将采用双进程冗余瞬时故障容错方法运行。由双进程冗余故障检测用户级模块调用变量初始化函数,对相关配置变量、用户参数进行初始化。然后注册检查点设置信号和双进程冗余比较结果信号。接着应用程序进程调用fork系统调用,派生出两个子进程,并调用execve系统调用,将自身替换为用户任务进程。最后将应用程序作为参数,传给双进程冗余故障检测内核级模块,应用程序进程本身退化为傀儡进程,等待主/从任务进程从内核发来的故障检测结果信号,主任务进程和从任务进程分别执行参数中指定的相同任务。
[0097] 双进程冗余瞬时故障检测内核级模块注册傀儡进程、主任务进程和从任务进程,为傀儡进程记录结构体4和主/从任务进程记录结构体5/6赋值;然后将傀儡进程加入傀儡进程链表1,主/从任务进程分别加入主/从任务进程链表2/3;最后将主/从任务进程加入到hash链表,并修改位图标记。如果其他任务采用双进程冗余瞬时故障容错方法运行,先为该任务的傀儡进程和主/从任务进程记录结构体赋值;然后将该任务的傀儡进程加入傀儡进程链表1,并将该任务的主/从任务进程分别加入其傀儡进程链接的主/从任务进程链表2/3;最后将其主/从任务进程添加到hash链表,并修改位图标记。傀儡进程和主/从任务进程注册后,在内核中形成如图2所示的结构体链表。
[0098] 在任务进程执行过程中,傀儡进程调用检查点设置用户级模块和检查点设置内核级模块周期性发送检查点设置信号9(检查点设置周期为Tc),对主/从任务进程设置检查点,保存任务进程状态。
[0099] 如图3所示,在任务进程第一次进行系统调用时,按照进程系统调用进入同步等待方法进行同步,即如果该进程是第一个进入系统调用的进程,则将自身需要比较的参数信息存储在傀儡进程记录结构体中的系统调用比较参数数组,将已进入系统调用进程数量参数arrived值加1,进入系统调用进入同步等待队列7,等待另一个进程进入系统调用;如果不是第一个进入系统调用的进程,则将傀儡进程记录结构体中第一个进程的系统调用参数与进程自身的参数进行比较,并将系统调用参数比较结果赋值给傀儡进程记录结构体中的比较结果记录参数,并唤醒主任务进程继续执行。在本次系统调用时,系统调用参数比较一致,由主任务进程将标记为正常的双进程冗余比较结果信号10发送给傀儡进程,主任务进程进行系统调用的执行,从任务进程进行系统调用的模拟。
[0100] 主任务进程系统调用执行完成之后,唤醒处于休眠状态的从任务进程,然后自身进入系统调用退出同步等待队列8,进入休眠等待状态。从任务进程进行系统调用模拟,并通过读取阻塞队列中的主任务进程系统调用返回结果获取系统调用结果。从任务进程唤醒主任务进程,主/从任务进程分别完成系统调用的执行。
[0101] 在第一次系统调用执行完成之后,由于瞬时故障11导致主任务进程系统调用参数发生错误。在第二次进行系统调用时,进程同步完成之后,比较发现系统调用参数不一致,则由主任务进程将标记为故障的双进程冗余比较结果信号10发送给傀儡进程,通知傀儡进程进行检查点卷回恢复,主/从任务进程分别调用do_exit()终止执行。
[0102] 傀儡进程接收到标记为故障的双进程冗余比较结果信号10后,停止检查点设置信号9的发送,调用检查点卷回恢复用户级模块和检查点卷回恢复内核级模块进行故障进程的卷回恢复。派生两个进程作为主/从任务进程恢复载体,分别将主/从任务进程检查点文件中的相关信息加载到新的主/从任务进程的相应位置,完成主/从任务进程的卷回恢复。