首页> 中国专利> 基于四级嵌套重启的任务关键系统生存应急恢复方法

基于四级嵌套重启的任务关键系统生存应急恢复方法

摘要

本发明提供的是一种基于四级嵌套重启的任务关键系统生存应急恢复方法。其主要技术特征包括:确定了系统不同粒度的重启层级别及不同级别的重启恢复策略;定义了重启优先级的计算方法,确定出系统各重启层模块的重启次序,建立了递归嵌套重启链;利用SPN和DFA形式化描述了递归重启应急恢复的实施过程。本发明具有以下优点:面向不同的故障场景,可以有效地选择不同粒度的重启对象,并确定出重启次序,减少了恢复时间,降低了恢复成本,增强了任务关键系统生存性的可恢复弹性。当系统生存性能退化到一定程度时,通过终止应用的继续运行,或重启系统、应用服务或进程以清理其内部状态,从而释放操作系统资源,使系统生存性能得到恢复。

著录项

  • 公开/公告号CN101539863A

    专利类型发明专利

  • 公开/公告日2009-09-23

    原文格式PDF

  • 申请/专利权人 哈尔滨工程大学;

    申请/专利号CN200910071914.6

  • 发明设计人 王慧强;赵国生;王健;

    申请日2009-04-29

  • 分类号G06F9/445(20060101);G06F11/00(20060101);

  • 代理机构

  • 代理人

  • 地址 150001 黑龙江省哈尔滨市南岗区南通大街145号1号楼哈尔滨工程大学科技处知识产权办公室

  • 入库时间 2023-12-17 22:44:28

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-04-16

    未缴年费专利权终止 IPC(主分类):G06F9/445 授权公告日:20121031 终止日期:20180429 申请日:20090429

    专利权的终止

  • 2012-10-31

    授权

    授权

  • 2009-11-11

    实质审查的生效

    实质审查的生效

  • 2009-09-23

    公开

    公开

说明书

(一)技术领域

本发明涉及增强任务关键系统生存性的应急恢复方法,尤其是面向高可生存性的任务关键系统应急重启恢复方法。

(二)背景技术

作为增强系统生存性最后手段的应急恢复技术,偏重于保障关键应用具备持续服务的能力,这是增强系统在面对成功入侵和恶意攻击时的可复原性(可恢复弹性)能力,做到系统深层次防御的最后一道防线,也是可生存系统采取的最后阶段的积极反应。应急恢复的基本思想是当系统或关键服务的生存性能下降到一定程度时,通过周期性地终止程序的继续运行,清除持续运行系统的内部状态,重新启动并恢复为初始状态或“健康的”中间状态,使系统或应用服务的生存性能得到一定程度的恢复,并预防将来可能发生的更严重的失效。

许多研究表明重启(Reboot or Rejuvenation)技术能够有效消除系统在运行过程中积累的一些错误、失效状态,包括那些人为攻击导致的错误、失效,因此重启能有效恢复系统或应用服务至初始良好状态。但当前对可生存性系统重启恢复策略的研究尚不深入,最新资料也只是执行到了服务级重启。Castelli简单地将重启分为两级:服务级和系统级,但并未给出确定重启时间间隔和重启优先级的具体方法。Hong按实际系统资源测量值来确定恢复粒度,当资源消耗的当前值不能反映导致资源损耗的程度时,这种方法不再适用。Xie虽然采用半马尔可夫过程对上文方法进行了优化,但其基本思想并未改变。以上研究都有其局限性,且尚显粗糙。相对来讲,在软件容错研究领域对软件失效后的重启技术的研究已进入较成熟的阶段。在UC Berkeley和Stanford大学合作开展的面向恢复的计算(Recovery-oriented Computing,RoC)项目的研究中提出了递归重启(Recursive Restartability,RR)技术之后,Candea又提出了微重启(Microreboot)技术,其思想是预先建立一棵重启树,重启树上的各节点是可以独立重启的应用或进程。当执行重启操作时,从重启树最底层的节点开始重启,性能不能恢复则上推一级,执行更大范围的重启。这两种技术要求软件的体系结构是已知的,且软件在开发之初即遵循了模块间松耦合的原则,使得一个模块的重启不会影响其它模块的正常工作。王慧强提出了一种通用的基于递归微重启技术的快速自恢复方法,主要是面向系统可用性的提高,同时降低系统的平均恢复时间。目前,现有重启恢复的研究还没有面向可生存性领域的成果出现,本发明提出的四级恢复等级与上述研究提到的微重启、宏重启存在着本质的区别,因此本发明是具有创新性的。

(三)发明内容

本发明的目的在于提供一种能减少恢复时间,降低恢复成本,增强任务关键系统生存性的基于四级嵌套重启的任务关键系统生存应急恢复方法。

本发明的目的是这样实现的:

(1)将重启层划分为系统级、服务级、进程级和线程级四个等级;

(2)重启优先级指标参数为Ks,Ks=d*Δp*∑,其中,s表示需要应急恢复的重启可控对象、d表示s的关键等级、Δp表示s的生存态势等级;在确定重启对象时,遵从以下规则:a.在同一层,可控对象的Ks越大,重启优先级越高,越优先重启;b.在不同层,如果某一进程的Ks大于其所属的应用服务的Ks值,则该进程和服务分别作为一个重启对象,且进程优先于所属应用服务执行重启操作;反之,则该进程不能作为重启对象,只将服务作为一个重启对象;如果重新引导整个系统的Ks值最大,则只以整个系统作为重启对象,执行简单的周期性恢复;

(3)用SPN描述了每次应急重启恢复的具体实施过程,用DFA控制各次重启恢复的返回位置。

所述的将重启层划分为系统级、服务级、进程级和线程级四个等级的确定重启层的级别和不同级别重启层的恢复策略为:

(a)系统级恢复策略:系统应急重启恢复时间间隔为η,ηi=MTBFi-MTTRi(i=0,1,...),当ηi时刻系统生存性降至Hmin,此时实施系统级重启策略;

(b)服务级恢复策略:当某一关键服务的生存性能降低到某一预定阈值Pmin时,进行一次服务级重启恢复;而当Pmax>P>Pmin时,进行M次的进程级恢复;同时,在M次的进程级恢复后,实施一次服务级恢复,使该服务的生存性能恢复到初始值Pmax,再重新开始M次的进程级恢复;

(c)进程/线程级恢复策略:利用系统loctl()函数调用,读取检查点文件,创建子进程后,父进程返回用户空间等到恢复任务完成,子进程则利用clone()函数产生多个线程重新恢复原任务;在通过最后一个阻塞点后,所有线程即离开内核空间,进入到用户空间,由回调函数继续执行进程恢复后的代码。

本发明旨在面向任务关键系统,提出了一种增强系统生存性的四级(系统级、服务级、进程级和线程级)递归嵌套的细粒度应急恢复方法。其主要技术特征包括:1、确定了系统不同粒度的重启层级别及不同级别的重启恢复策略;2、定义了重启优先级的计算方法,确定出系统各重启层模块的重启次序,建立了递归嵌套重启链;3、利用随机Petri网(SPN)和确定有限自动机(DFA)形式化描述了递归重启应急恢复的实施过程。

应急恢复是一种前慑的、抢先式的高生存性增强技术。本发明中四级恢复策略的实施基于以下的考虑:有计划的恢复比无计划的系统宕机消耗的成本低得多;恢复某一应用进程(进程级恢复)的成本比恢复整个应用程序(服务级恢复)的成本低得多;恢复某一应用程序(服务级恢复)的成本比恢复整个应用系统(系统级恢复)的成本低得多。

与传统的周期性系统级恢复方法相比,本发明具有以下优点:面向不同的故障场景,可以有效地选择不同粒度的重启对象,并确定出重启次序,减少了恢复时间,降低了恢复成本,增强了任务关键系统生存性的可恢复弹性。当系统生存性能退化到一定程度时,通过终止应用的继续运行,或重启系统、应用服务或进程以清理其内部状态,从而释放操作系统资源,使系统生存性能得到恢复。

(四)附图说明

图1为系统级递归恢复策略图;

图2为服务级递归恢复策略图;

图3为进程/线程级恢复策略图;

图4为四级嵌套的应急恢复策略实施过程图;

图5为四级嵌套的应急恢复DFA模型;

图6为k级嵌套的应急恢复策略实施过程图;

图7是本发明的流程框图。

(五)具体实施方式

下面结合附图举例对本发明做更详细地描述:

1.确定重启层的级别及不同级别的重启恢复策略

实施细粒度嵌套的应急恢复策略,需将系统分为若干重启层,而每层的重启对象须具有原子性、并发性的独立服务实体。由此,将重启恢复定义为4等级:系统级、服务级、进程级和线程级。系统级恢复是将整个系统作为重启对象,服务级恢复将应用服务作为重启对象,进程级恢复是将系统运行过程中执行的具体进程作为重启对象,而线程级恢复则将进程中的每个单元线程作为重启对象。在每次系统级恢复前执行多次的服务级恢复;在每次服务级恢复前执行多次的进程级恢复;进程级恢复过程中伴随着多次的线程级恢复。

(1)系统级恢复策略

依赖于现有系统的失效分布规律,定义系统应急重启恢复时间间隔为η,ηi=MTBFi-MTTRi(i=0,1,...)。如图1所示,系统刚开始运行时,具有最佳生存性能Hmax,随着各种失效、错误、攻击等不可测事件的发生,导致系统生存性能的逐渐下降,假设ηi时刻降至Hmin,此时实施系统级重启策略,使系统的生存性能快速恢复到起始状态。

(2)服务级恢复策略

服务级恢复策略是每当某一关键服务的生存性能降低到某一预定阈值Pmin时,进行一次服务级重启恢复;而当某一关键服务的生存性能Pmax>P>Pmin时,进行M次的进程级恢复,从而得到一系列不同的该服务的生存性能恢复值Pmax(1),Pmax(2),...,Pmax(n)和执行恢复的时间间隔η0,η1,...,ηn,如图2所示。由于服务级恢复不能释放被损耗的所有操作系统资源,该应急服务恢复后的生存性能值P和时间间隔序列值η依次递减,一定次数N后,开始频繁地执行恢复操作而无法正常提供服务,直至该服务彻底失效。因此我们考虑在M次的进程级恢复后,实施一次服务级恢复,使该服务的生存性能恢复到初始值Pmax,再重新开始M次的进程级恢复。依次循环,如果不发生其他故障,该关键服务有望长时间地运行下去。

(3)进程级与线程级恢复策略

为了避免关键服务在发生失效事件后由于从头开始执行而引起计算上的大量浪费,充分提高系统的可用性,在服务正常运行的适当时刻设置检查点(CheckPoint),保存服务进程当时的规范状态,并对各进程相关性进行跟踪和记录。发生服务中断故障后,将相关进程回卷到故障前服务的一致性状态(检查点),经过状态恢复后从该检查点处重新执行。

进程级或线程级恢复的过程就是从检查点文件中恢复内存镜像。恢复机制利用系统loctl()函数调用,读取检查点文件,创建完子进程后,父进程返回用户空间,一直等到恢复任务完成,结束退出。子进程则利用clone()函数产生多个线程重新恢复原任务,其中一个线程从检查点文件中读取基本信息,并且恢复各个线程的编号以及它们之间的关系。在通过最后一个阻塞点后,所有的线程即离开内核空间,进入到用户空间,并且它们的回调函数将继续执行进程恢复后的代码,如图3所示。

2.确定系统各重启层模块的重启次序,建立递归嵌套重启链

一般情况下,恢复粒度越细,服务失效时间越短,恢复成本也越低。但是,并不能因此就简单地确定重启次序为:线程级、进程级、服务级和系统级。本发明在确定重启次序时,引入了重启优先级指标参数Ks。定义Ks=d*Δp*∑(重启可控对象后释放的资源量/重启可控对象引发的恢复成本),其中,s表示需要应急恢复的重启可控对象;d表示s的关键等级;Δp表示s的生存态势等级。

在确定重启对象时,遵从以下规则:(1)在同一层,可控对象的Ks越大,重启优先级越高,越优先重启;(2)在不同层,如果某一进程的Ks大于其所属的应用服务的Ks值,则该进程和服务可以分别作为一个重启对象,且进程优先于所属应用服务执行重启操作;反之,则该进程不能作为重启对象,只将服务作为一个重启对象。如果重新引导整个系统的Ks值最大,则只需要以整个系统作为重启对象,执行简单的周期性恢复,而不用再考虑服务级和进程级、线程级的细粒度恢复策略。

因为一个应用服务的重启是对它运行过程中启用的所有进程的重置,重启该应用服务相当于重启从属它的所有进程。系统的重新引导将停止所有运行其上的应用服务程序,释放所有系统资源,是对系统生存性能的最彻底恢复。按以上规则可以得到各级重启对象,并按重启优先级可将这些重启对象排序为一链状结构,即为重启链。

3.构建递归重启应急恢复的实施过程模型

用SPN描述每次应急重启恢复的具体实施过程,用DFA控制各次重启恢复的返回位置,由此简化了SPN模型,易于理解和分析。四级嵌套的可生存系统应急重启恢复策略实施过程如图4所示。用DFA模型M控制各恢复子过程之间的关联与转移位置,这既避免了模型状态空间爆炸问题又避免了DFA模型不能描述策略实施细节的缺点。图中的圆圈表示位置,圆圈中的黑点为标记,小矩形框表示变迁。其中,Pavail、Pdown、Preju模拟系统进入的状态,Pclock表示执行恢复的记录时钟,空心框Tdown、Treju、Tup表示实施时间服从任意分布的变迁,实心框Tclock表示确定时间变迁,确定时间ηi即最优恢复时间间隔。变迁实施,则Token从其前一位置运动到后一位置,系统状态随之变化。将含有Token的位置记为1,不含Token的位置记为0,则位置组(Pavail,Pdown,Pclock,Preju)可标识系统在恢复子过程中所处的状态。

两大矩形框包含两组位置:{Pavail0,Pavail1,…,Pavailn}和{Pclock0,Pclock1,…,Pclockn},分别表示各恢复子过程的初始位置和记录时钟,每次恢复各有其中的一个位置参与。前n次恢复共用同一变迁Tdowni、Tclocki,但是,对应不同的初始位置,Tdowni服从不同的随机分布F1i(t)(0≤i<n),Tclocki的实施时间ηi(0≤i<n)也不同,进入恢复状态后实施相同变迁Tareju。任一时刻若系统进入失效状态,实施相同的变迁Tup,服从相同的随机分布。从Pclock位置组到自动机M的连接线,标示M的一个输入,由此获知系统的当前状态qijk;从变迁Tareju、Tsreju、Tup到自动机M,三线合一作为M的另一个输入,变迁Tareju、Tsreju、Tup的实施对应∑中系统执行的操作;M的转移函数θ读取这两个输入,得到系统的下一状态,作为M的输出,并控制下一子过程的初始位置。图4中将服务层、进程层、线程层重启的变迁表示为一组,如灰色框所示,其中变迁总数等于三层重启次数之和。

自动机的状态转移规则形式化描述如图5所示。图中用M的有限状态qijk控制位置组{Pavail0,…,Pavailn}和{Pclock0,…,Pclockn}中的标记,定义状态如下:对应初始状态q000,标记位于Pavail0和Pclock0;当系统进入状态qijk=00...010...00(第Σk1=0j-1Σk2=0i-1N[k1]+N[k2]+i+j+k+1位为1),则标记位于Pavaily和Pclocky,其中y=Σk1=0j-1Σk2=0i-1N[k1]+N[k2]+i+j+k+1,此时系统已执行了k次线程级重启,j次进程级重启,i次服务级重启;当系统到达状态qmN[m]N[y](y=N[m])时,标记位于Pavailn和Pclockn,准备执行系统级重启。

从Pclock位置组到M存在一个输入,由此获知系统的当前状态qijk;从变迁Tareju组、Tsreju、Tup到M作为其另一个输入,由此获知系统的重启类型;M的转移函数θ读取两个输入,得到系统的下一个状态,同时得知系统此时应执行的操作,作为M的输出,并控制下一恢复子过程中标记的初始位置,以及系统从位置出发所执行的重启对象。

将图4稍加改动即可用以表示任意的k级递归嵌套的应急恢复策略,如图6所示。

VS.Net示例进程级恢复管理的部分代码如下:

// 列出系统中的当前所有进程  //

         private void ListProcesses()

         {   Process[]ps;

             try

             {   ps=Process.GetProcesses();

                 // 更新进程列表的内容

                 lvProcesses.BeginUpdate();

                 lvProcesses.Clear();

                 // 添加列

 lvProcesses.Columns.Add(″映像名称″,100,Horizontal Alignment.Left);

 lvProcesses.Columns.Add(″进程ID″,60,Horizontal Alignment.Left);

 lvProcesses.Columns.Add(″优先级″,60,Horizontal Alignment.Right);

 lvProcesses.Columns.Add(″CPU时间″,100,Horizontal Alignment.Right);

lvProcesses.Columns.Add(″占用内存″,100,Horizontal Alignment.Right);

                 // 添加列表项

                 foreach(Process p in ps)

                 {   ListViewItem lvi=new ListViewItem();

                     lvi.Text=p.ProcessName;

                     lvi.SubItems.Add(p.Id.ToString());

                     lvi.SubItems.Add(p.BasePriority.ToString());

lvi.SubItems.Add(p.TotalProcessorTime.Hours.ToString()+″:″+p.TotalProcessorTim

e.Minutes.ToString()+″:″+p.TotalProcessorTime.Seconds.ToString());

lvi.SubItems.Add(p.WorkingSet.ToString());lvProcesses.Items.Add(lvi);

                 }

                 lvProcesses.EndUpdate();

             }

            catch(Exception e)

             {  MessageBox.Show(e.Message);

             }

        }

public int pid=0;

// 根据进程ID获取进程对象,然后显示它的属性

    private void FormProp_Load(object sender,System.EventArgs e)

      { if(pid==0)return;

        Process p=Process.GetProcessById(pid);

        if(p==null)return;

           try

            { txtID.Text=p.Id.ToString();

            txtName.Text=p.ProcessName;

           txtStartTime.Text=p.StartTime.ToLongTimeString();

           txtPriority.Text=p.PriorityClass.ToString();

           txtVirtualMem.Text=p.VirtualMemorySize.ToString();

           txtWorkingSet.Text=p.WorkingSet.ToString();

          if(p.MainModule !=null)

             { txtModuleName.Text=p.MainModule.FileName;

txtModuleDescription.Text=p.MainModule.FileVersion Info.FileDescription;

txtModuleVersion.Text=p.MainModule.FileVersion Info.FileVersion;

             } }

         catch(Exception ex)

          { MessageBox.Show(this,ex.Message,″出现异常″,MessageBox Buttons.OK,M

essageBoxIcon.Warning);

           }

            finally

           {

            p.Close();

           }

        }

///

// 根据用户在窗体中的输入创建ProcessStartInfo对象实例

// 然后使用这个对象实例启动新的进程

        private void btnOK_Click(object sender,System.EventArgs e)

        {   ProcessStartInfo si=new ProcessStartInfo();

            si.FileName=txtFileName.Text;

            si.Arguments=txtParam.Text;

            si.ErrorDialog=chkErrDlg.Checked;

            si.UseShellExecute=chkUseShell.Checked;

            if(cbxVerb.SelectedIndex  !=-1)

               si.Verb=cbxVerb.Text;

            si.WorkingDirectory=txtWorkDir.Text;

            if(cbxStyle.SelectedIndex==0)

               si.WindowStyle=ProcessWindowStyle.Maximized;

            else if(cbxStyle.SelectedIndex==1)

               si.WindowStyle=ProcessWindowStyle.Minimized;

            else

               si.WindowStyle=ProcessWindowStyle.Normal;

            try{   Process.Start(si);}

            catch(Exception ex)

            {

MessageBox.Show(this,ex.Message,″出现异常″,MessageBox Buttons.OK,MessageBoxIcon.War

ning);

                this.DialogResult=DialogResult.None;

            }}

private void Form1_Load(object sender,System.EventArgs e)

        {    ListProcesses();}

// 删除当前选择的进程

 private void btnKillProcess_Click(object sender,System.Event Args e)

        {

if(MessageBox.Show(this,″确定结束进程:″+lvProcesses.SelectedItems[0].Text,″结束进

程″,MessageBoxButtons.OK Cancel,MessageBoxIcon.Warning)==DialogResult.Cancel)

                  return;

int pid=Int32.Parse(lvProcesses.SelectedItems[0].Sub Items[1].Text);

            Process p=Process.GetProcessById(pid);

            if(p==null)return;

            if(!p.CloseMainWindow())

                p.Kill();

            p.WaitForExit();

            p.Close();

            ListProcesses();

        }

// 刷新进程列表

 private void btnRefresh_Click(object sender,System.EventArgs e)

        {   ListProcesses();}

// 创建新进程

 private void btnNewProcess_Click(object sender,System.Event Args e)

        {   FormStartInfo dlg=new FormStartInfo();

            if(dlg.ShowDialog()==DialogResult.OK)

               ListProcesses();}

// 显示当前选择进程的属性

private void btnProcessProp_Click(object sender,System.Event Args e)

        {   FormProp dlg=new FormProp();

 dlg.Text=″进程″+lvProcesses.SelectedItems[0].Text+″的属性″;

 dlg.pid=Int32.Parse(lvProcesses.SelectedItems[0].Sub Items[1].Text);

            dlg.ShowDialog()

        }

//进程挂起&进程恢复

Private Declare Function OpenProcess Lib″kernel32″(ByVal dwDesiredAccess As Long,

 ByVal bInheritHandle As Long,ByVal dwProcessId As Long)As Long

Private Declare Function CloseHandle Lib″kernel32″(ByVal hObject As Long)As Long

Private Const SYNCHRONIZE=&H100000

Private Const STANDARD_RIGHTS_REQUIRED=&HF0000

Private Const PROCESS_ALL_ACCESS=(STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFF

F)

Private Declare Function NtSuspendProcess Lib″ntdll.dll″(ByVal hProc As Long)As

Long

Private Declare Function NtResumeProcess Lib″ntdll.dll″(ByVal hProc As Long)As L

ong

Private Declare Function TerminateProcess Lib″kernel32″(ByVal hProcess As Long,B

yVal uExitCode As Long)As Long

Private hProcess As Long

Private Sub cmdClose_Click()’终止

    CloseHandle hProcess

End Sub

Private Sub cmdResume_Click()’关闭句柄

    If IsNumeric(txtPid.Text)Then

        hProcess=OpenProcess(PROCESS_ALL_ACCESS,False,CLng(txtPid.Text))

        If hProcess<>0Then

           NtResumeProcess hProcess

        End If

    End If

End Sub

Private Sub cmdTerminate Click()’恢复

    If hProcess Then

        TerminateProcess hProcess,0

    Else

        If IsNumeric(txtPid.Text)Then

            hProcess=OpenProcess(PROCESS_ALL_ACCESS,False,CLng(txtPid.Text))

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号