一种高效大规模系统的LTL模型检测方法与流程

文档序号:12362593阅读:418来源:国知局
本发明涉及模型检测领域,特别涉及一种LTL模型检测技术。
背景技术
::模型检测算法是一种好的方法针对于硬件和软件的形式化验证,他可以自动的检测是否满足系统的状态并且可以检测出反例,模型检测在硬件的形式化方法当中有着广泛的使用。但是这种方法面临着状态空间爆炸的问题,因为该方法在使用大规模系统的时候会面临着内存不足。实际当中模型检测主要存在以下两个方式:内存算法和外存算法;为了解决状态爆炸问题,内存算法主要针对于降低系统的大小和表现。到目前为止,有很多方法针对于内存算法,例如:偏序规约、对称消减、抽象提取、组合提取、符号模型检测、符号路径追踪、自动机理论以及边界模型检测等等,尽管如此,由于内存的局限性,在大规模系统验证当中,内存算法显得不是很实用。相比较于内存,外存设备可以提供足够大的存储空间,在过去的几年里,外存的存储空间也是巨大的发展,并且外存的费用也在逐渐降低,外存的单位字节费用要比内存便宜的多,因此更加推荐使用外部存储设备,由于外部存储设备就存储速度要比内部存储速度要慢几个数量级,因此降低I/O的次数从而提高时间效率是目前继续解决的问题。I/O复杂模型因为信息在外部存储设备当中的存储速度要比在内部存储速度慢的多,因此外部存储算法通常作为I/O的操作算法,这里I/O操作值得是将数据从内存中读取放到外存当中去,例如:针对于ITC’99,B15(std),P1的基准,算法代价在210次I/O操作当中找到反例。对于外部存储算法的复杂度分析,广泛使用的模型是Aggarwal和Vitter,在该模型当中,I/O操作的次数通常被描述为0O(scan(N))和O(sort(N)),基于O(N/B)和O(N/B·logM/B(N/B)),分别的,当N定义为系统状态的总数量,M定义为第一次进入到内存当中的数量,B定义为可以被单个I/O操作的转移的状态数量,并且O(N/B)定义为与N/B有相同的阶数。技术实现要素:本发明为解决上述技术问题,提出了一种高效大规模系统的LTL模型检测方法,采用LHS算法用于快速找到磁盘中哈希表中存储的哈希值;采用CDD技术允许在内存中的副本通过有效访问检测出来,通过HLS,CDD可以降低副本检测的复杂度,采用DPM使得嵌套的两个深度优先栈可以动态的共享内存单元,并且通过有效对栈和状态的管理可以解决内存的抖动问题。本发明采用的技术方案是:一种高效大规模系统的LTL模型检测方法,包括:S1、初始化存储结构跟内存使用情况:数据库DB包括四张表,具体为:第一张表tableDD1和第二张表tableDD2用于检测重复状态和两个由相同状态字段和哈希字段组成的数据结构;第三张表tableP1存储着路径在第一个DFS的状态;第四张表tableP2存储着路径在第二个DFS的状态;将内部存储器划分为代码段和数据段,然后将数据段划分为两个相同大小的第一存储模块T1和第二存储模块T2,第一存储模块T1被进一步分为两个大小相同的第一存储单元T11和第二存储单元T12,第一存储单元存储第一DFS的第一哈希表H1,第二存储单元T12存储第二DFS的第二哈希表H2;第二存储模块T2通过第一堆栈stack1和第二堆栈stack2共享动态内存;第一哈希表H1和第二哈希表H2当中的每一个元素都是一个元祖(h,s),其中,s是表示被访问过的状态,h代表s的哈希值,H1和H2当中的所有元素都存储在时间序列当中;S2、当检测第一堆栈stack1和第一存储单元T11为满状态,执行步骤S3;S3、则将二元组中的一部分第一哈希表H1放到tableDD1当中,并且用调用函数Merge-sort()对tableDD1进行排序;S4、对于当前状态x,首先通过CDD去执行重复检测;对于每一个成功的状态s,如果s为新的状态,那么将s入栈stack1,同时将二元组(hash(s),s)入栈H1;S5、当所有的成功的状态都被遍历,则从第一堆栈stack1中取出各个成功状态;如果该成功状态是可接受的状态,则进入第二个DFS。进一步地,移动到tableDD1的二元组数量取决于参数ρ1。进一步地,步骤S4所述的CDD具体为:当一个状态生成以后,CDD首先检查状态的哈希值是否在内存的H表当中,若是那么判断状态都被访问过;否则,CDD则进一步检测外存当中哈希状态值的状态是否在tableDD当中,若是则判断状态被访问过;否则,状态就是新建立的。进一步地,步骤S5还包括:当T2是满的时候,只移动stack1和stack2的一些状态到数据库去是内存空间为新的状态;对于stack1,通过函数Append()算法移动k1(=#(stack1)·ρ2)状态从栈底到tableP1,然后释放相关内存空间,其中ρ2为大于0小于1的参数,与此同时,stack1栈底的指针指向第(k1+1)个状态;对于stack2来说,算法以相同的方式进行处理;当stack1变为空的时候,当tableP1不为空,并且k1=min(#(tableP1),(M2-#(stack2)·ρ2)),将k1状态存储到最近的tableP1到stack1,反过来则称为push();从tableP1当中删除则调用Delete();当stack2为空的时候,算法执行相同的步骤。本发明的有益效果:本申请采用了以下三种方法:1线性哈西存储LHS,2缓存副本检测叫做CDD,3动态路径管理DPM;用于降低I/O的复杂度和提高时间效率;LHS算法主要针对于快速找到磁盘中哈希表中存储的哈希值,无论内存中的哈希表的分类是否为空,都会在外存中存储哈希表并且存储到外存当中以一个新的技术,I/O的复杂度是哈希表一样的线性大小;CDD技术允许在内存中的副本通过有效访问检测出来,通过HLS,CDD可以降低副本检测的复杂度,DPM的计划使得嵌套的两个深度优先栈可以动态的共享内存单元,并且通过有效对栈和状态的管理可以解决内存的抖动为题,其中内存抖动指的是状态在内存当中的频繁移动,可能会显著的增加I/O的操作次数从而降低算法的效率。附图说明图1为本发明提供的方案流程图。具体实施方式为便于本领域技术人员理解本发明的技术内容,下面结合附图对本
发明内容进一步阐释。本发明的技术方案为:一种高效大规模系统的LTL模型检测方法,包括:S1、初始化存储结构跟内存使用情况:数据库DB包括四张表,具体为:第一张表tableDD1和第二张表tableDD2用于检测重复状态和两个由相同状态字段和哈希字段组成的数据结构;第三张表tableP1存储着路径在第一个DFS的状态;第四张表tableP2存储着路径在第二个DFS的状态;将内部存储器划分为代码段和数据段,然后将数据段划分为两个相同大小的第一存储模块T1和第二存储模块T2,第一存储模块T1被进一步分为两个大小相同的第一存储单元T11和第二存储单元T12,第一存储单元存储第一DFS的第一哈希表H1,第二存储单元T12存储第二DFS的第二哈希表H2;第二存储模块T2通过第一堆栈stack1和第二堆栈stack2共享动态内存;第一哈希表H1和第二哈希表H2当中的每一个元素都是一个元祖(h,s),其中,s是表示被访问过的状态,h代表s的哈希值,H1和H2当中的所有元素都存储在时间序列当中。使用二元组的目的是加快磁盘表tableDD2和tableDD2的搜索,同时也可以避免哈希冲突。通过使用二元组,不仅可以快速通过哈希值去查找磁盘表,还可以区分两种不同的状态即使他们有相同给的哈希值。S2、当检测第一堆栈stack1和第一存储单元T11为满状态,执行步骤S3;S3、则将二元组中的一部分第一哈希表H1放到tableDD1当中,并且用调用函数Merge-sort()对tableDD1进行排序;移动到tableDD1的二元组数量取决于参数ρ1。每一个状态都被定义了哈希值,表1展示了内存中的状态和在磁盘当中表的合并之前通过非递减序列排序的哈希值,(a)为内存当中的状态,(b)为磁盘当中的状态。本申请的目的是将内存中的表合并到磁盘当中去,表1b的最后一行“---”为1000个附加的空记录,1000指的是内存当中状态的数量,100个状态可以转入一个I/O操作,接下来依次进行以下操作:1、将最后100个状态(从4409到5833)移动TableI(b)中,2、将他们按照线性排序,3、将状态移到内存当中去,其中内存中哈希值要比表1(b)中的值要大于或者等于4409,相关结果将在表2中的a或者b当中。这些操作一直进行到表1中b所以都被处理了,磁盘当中的处理结果就是表2的c,a为内存当中的状态,b为磁盘当中的状态,c为最后的结果。表1内存中的状态和在磁盘当中表的合并之前通过非递减序列排序的哈希值表2合并以后的状态,S4、对于当前状态x,首先通过CDD去执行重复检测;对于每一个成功的状态s,如果s为新的状态,那么将s入栈stack1,同时将二元组(hash(s),s)入栈H1。CDD具体为:在重复检测方法当中,做访问的状态可以被分为两组:最近的状态和历史状态,最近状态是最近生成的并且在内存的H表当中存储,历史状态是存储在磁盘表的tableDD当中,其中H表可能是H1或者H2,tableDD可能是tableDD1或者tableDD2,如果H为满,那么CCD将调用LHS只移动H表中第一个(#(H)·ρ1)元组到tableDD并且对新的tableDD表进行排序,因此,相关状态就变成历史状态。当一个状态生成以后,CDD首先检查状态的哈希值是否在内存的H表当中,若是那么判断状态都被访问过;否则,CDD则进一步检测外存当中哈希状态值的状态是否在tableDD当中,若是则判断状态被访问过;否则,状态就是新建立的。通常来说,选择ρ1<0.05,那么内存当中所有重复检测的转台都被检测。假设数据段被分配到2G内存当中并且每个状态需要500比特的内存并且每一个哈希值需要12比特,那么H1则需要0.5G大小的空间可以拥有新生成的220个元组,当H表为满了以后那么算法移动哈希表中第一个(#(H)·ρ1)元组到外存当中去,因为ρ1<0.05,H1当中二元组的数量在220达到峰值。一般来说,当前生成状态超过220个已有状态的概率是非常小的,因此,对于大多数状态来说,他们的重复检测都是在内存当中执行的。S5、当所有的成功的状态都被遍历,则从第一堆栈stack1中取出各个成功状态;如果该成功状态是可接受的状态,则进入第二个DFS。搜索路径管理可以划分为静态的和动态的,静态管理意味着算法分配固定的内存给两个用于嵌套的深度优先搜索的栈,动态管理意味着两个栈可以共享内部存储。因此,动态管理可以更加有效地利用内存。动态搜索路径管理称为DPM。在搜索的时候,当T2满了并且生成一个新的状态,为了避免内存溢出,需要从两个栈移动状态到DB。但是,这可能导致状态频繁的在内存当中移动额现象。接下来分析一下为什么会导致状态频繁的在内存当中的移动,假设交换M2状态在T2和磁盘之间,其中M2是T2可容纳的状态。当T2为满,转移T2中所有的状态到磁盘当中,直到T2为空。接下来,如果算法由于回溯需要从stack1或stack2中提取出状态,那么刚刚转移到磁盘当中的状态M2必须要转移到内存当中,从而T2变为满了。随后,如果有新的生产状态并且需要压入到stack1和stack2当中,那么M2状态必须在再内存以外当中移动从而再次为新的状态制造空间。将这个现象称为内存抖动,该现象可以提高磁盘的访问和算法的复杂性。通过以下步骤解决内存抖动的问题:1、当T2是满的时候,只移动stack1和stack2的一些状态到数据库去是内存空间为新的状态。对于stack1,通过函数Append()移动k1(=#(stack1)·ρ2)状态从栈底到tableP1,然后释放相关内存空间,其中ρ2为大于0小于1的参数,与此同时,stack1栈底的指针指向第(k1+1)个状态。对于stack2来说,以相同的方式进行处理,此过程要用到Dmem-DB()函数。2、当stack1变为空的时候,当tableP1不为空,并且k1=min(#(tableP1),(M2-#(stack2)·ρ2)).将k1状态存储到最近的tableP1到stack1,反过来则称为push();从tableP1当中删除则调用Delete()。当stack2为空的时候,执行相同的步骤。相关联的过程则应用到DDB-mem()函数当中。当T2为满的时候,观察到一些状态有两个状态,总存在两个栈同时有相同的状态则避免了内存抖动的现象。通过实验对IOEMC和DAC、MAP、IDDFS就I/O的复杂度进行比较。DAC在可接受周期内的I/O算法效率可以知道为O(lSCC·(hBFS+|pmax|+|E|/M)·scan(N)),其中lSCC定义为SCC图的最长路径,pmax是通过强连通分量的最长路径(没有自环),hBFS是BFS的高度,|E|是边的数量,因为N/M·scan(N)和sort(|E|)明显小于|E|/M·scan(N),所以IOEMC的I/O复杂度要明显小于DAC。对于MAP而言,当候选集合放在内存当中的时候,I/O的复杂度是O(|F|((d+|E|/M+|F|)scan(N)+sort(N))),当候选集合放在外存当中时,I/O的复杂度是O(|F|((d+|F|)scan(N)+sort(|F|·|E|))),其中d是图的直径。因为|E|要比N大,当候选集合位于内存当中时,IOEMC的I/O复杂度也要比MAP的复杂度要小,当候选集合位于外存当中时,在第三部分的A中,可以观察到|F|等于N/3当自动机A和S有交叉的情况下,也就是MAP的I/O复杂度是O(N3),因此IOEMC的I/O复杂度也要比MAP要好。IDDFS是半外部算法,它复杂度是O(εS·sort(N)+sort(|E|)),其中εs=max{δ(s,υ)|υ∈V}是最大BFS宽度,并且δ(s,υ)是从s到v的最短路径长度。因此IDDFS对于小规模BFS水平的模型检测系统的问题很有效,假设每个状态需要k比特去用于内存空间,那么需要5比特去用于半外部搜索当计算机有mG的内存时,当规模大于(m·230·8/5)个状态是,IDDFS不可以解决大规模模型检测问题。因此对于IDDFS系统可以验证的,B/M要比(m·230/5)/(m·230/k)=k/5要小,因此相关的IOEMC的复杂度大小是O((k/5)·scan(N)+sort(|E|)),也就是O(sort(|E|)),所以IOEMC相比于IDDFS有更低的复杂度。本申请主要对IOEMC和DAC、DAC、MAP、IDDFS比较运行时间和磁盘的分配情况。A:基准为了对比IOEMC和DAC、MAP、IDDFS的实验结果,选择了基准,并且选择了Peterson(6),P4andSzyman.(6)模型进行测试,两个模型可以表面在有限的规模下IDDFS是可以进行验证的。所有选定的基准来自于BEEM项目,这些基准里面包含了有效的性能和无效的属性,覆盖范围状态小到50000,多到6000000000。这些都是典型资料并且可以用来当作一个好的测试区验证模型检测算法效率和性能。B:实验步骤四个实验在DiVine库顶部上已经有了实施,并且提供了状态空间的产生和STXXL库,可以提供I/O原语。对于IOEMC,设置参数ρ1=0.02和ρ2=0.9所有的实验都是在CPU2.4G,内存为2G,外存为400G,Linux操作系统下运行的。例如,每个算法运行100次,对于每个算法的每次运行,选择它的平均时间和平均外存占用率,时间形式为hh:mm:ss(代表着小时、分、秒)。C:实验结果有效属性的实验结果在表3当中呈现出来,从表3当中可以清楚地知道IOEMC的验证效率明显的高于其它算法。5个基准分别为Elevator2(16),P4,MCS(5),P4,Phils(16,1),P3,Lamport(5),P4,andITC99,b15(std),P2,每一个算法有效验证都在10小时以内,IOEMC要比其他算法快了2到3倍。对于两个硬件基准Peterson(6),P4andSzyman.(6),P4,IDDFS由于内存的不足并没有比他们更加快,因为它是一个半外部算法,他需要对每个状态需要内存当中的额外的5比特。此外,DAC和MAP都需要超过30小时的运行时间去验证这两个基准。然而对于Peterson(6),P4andSzyman.(6),P4,IOEMC只需要12到15小时。然而尽管如此,IOEMC需要存储的不仅仅是状态,它还需要存储外存中每个状态的值,在模型有效属性上,它有着更多的内存消耗相比于其他算法。无效值得实验结果在表4中呈现出来,正如从表4中可以观察到除了DAC其他算法都可以快速找到反例对于这些样本基准。在基准为Bakery(5,5),P3,Elevator2(16),P5,Szyman(4),P2,andLifts(7),P4,其中IOEMC就时间消耗上占领先的位置相对于其他几个算法。对于其他几个基准,IOEMC至少比其他算法快2倍。固然,对于小的模型来说ITC’99,b15(std),P1,andLifts(7),P4,,IOEMC要比其他几个算法要慢一点,这是因为IOEMC为了大规模模型采用的新技术减少了I/O操作的次数,从而使得在小的模型上没有足够高的效率,表5给出了不同参数值的运行时间。表3有效属性的模型检测结果表4无效熟悉的模型检测结果表5不同参数值的运行时间本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的权利要求范围之内。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1