CMurphi入门笔记(一)——概览

原文地址:http://www.cnblogs.com/Rainday/p/cmurphi_prime_1.html                       

 

本来以为自己会是一个搞技术的人的,没想到现在彻底变成一个搞科研的人了。搞的东西,现在自己也不是很懂。摸着石头过河吧。

 

Murphi验证系统由Murphi编译器和Murphi描述性语言组成。

  • Murphi编译器根据Murphi描述生成一个特定目的的验证器。这个验证器可以用来检查系统的特性,比如错误断言,不变量和死锁。
  • Murphi描述语言是一个高级描述语言,针对状态有限的异步并行系统。Murphi在某些特性上是高级的,这些特性可以在很多高级编程语言如Pascal或者C中找到,同时这些特性也是Murphi的一部分。例如,Murphi拥有用户定义的数据类型,过程,以及描述的参数化方法。

 

1. Murphi描述的结构

Murphi描述由以下部分组成:

  • 常量,类型,全局变量和过程的定义;
  • 状态迁移规则的集合;
  • 初始状态的描述;
  • 不变量集。

Murphi的行为部分,是一个状态迁移规则的集合。每一条规则都是一条保护命令,其由一个条件(全局变量上的布尔表达式)和一个动作(一条可以修改变量的值的语句)组成。条件和动作均以类Pascal的风格书写。动作可以是包含循环和条件的任意复合语句,但不论其多么复杂,动作的执行都是原子的——没有其他的规则可以改变变量或者说,当它正在执行的时候,没有其他的接口。

 

2. 使用Murphi验证一个系统的简单四步

a) 编写Murphi语言程序,命名如pingpong.m。

b) 在其上边运行Murphi编译器,其命令行:

1 $(murphipath)/mu pingpong.m

这样会生成一个文件pingpong.C。

c) 在pingpong.C中运行C++编译器,其命令行:

1 $(g++path)/g++ pingpong.C -I$(includepath)

记住说明所有包含文件的路径。

d) 最终,你可以通过调用a.out运行一个模拟过程或者验证过程。可以通过下边的命令查看命令行开关的列表:

1 a.out -h

事实上,这整个过程以后可以通过使用Makefile简化,这个文件在ex文件夹中提供。然而,你必须分别对变量CPLUSPLUS,MURPHIPATH和INCLUDEPATH进行设置。

 

3. Murphi的执行模型

Murphi状态,是对描述中的所有全局变量的赋值。描述的执行可以由下边的无限循环生成。

无限循环:

  1. 寻找当前状态下所有的规则,这些规则的条件值均为true。也就是说,条件表达式的值为true,可以为全局变量赋当前值。
  2. 任意选择一个规则并且执行其动作,进入另一个状态。

注意,Murphi描述是非确定性的,因为在上边的第2步中进行了任意的选择。用户无法控制这个选择的过程,所以不管那条规则被选择,“正确”的Murphi程序必须能够做正确的事情。然而,一旦一条规则被选择,动作就是确定的了(有确定的下一个状态)。

这个执行模型对描述通过共享变量交互的异步系统(以不同的速度运行不同的进程)是有好处的,这种系统中,进程A通过写一个进程B将会读取的变量来影响进程B。信息传递可以通过读写缓冲区变量或者数组来进行建模。

Murphi模拟器在所有的规则中任意选择一条来进入新的状态。另一方面,验证器决定所有可能的选择的结果。当前的验证器通过广度优先搜索或者深度优先搜索来做到这个,这两种方法都在一个巨大的哈希表中存储状态,这样就可以在遇到一个曾经遇到过的状态时中断搜索。

当验证器生成状态时,会检查各种条件。有时会出现运行时错误,大部分都是赋值或者数组索引出界。有显式"assert"和"error"语句可以在一个动作中调用。如果这些语句中的一个发生了,验证器就会中止并且打印出诊断信息,包含导致由初始状态运行到错误状态的重新排序的状态列表。验证器也会在不变量表达式(用户给出的描述中的一部分)对当前状态的值为false或者当前状态“死锁”(无法成功跳出当前状态)的时候这么做(打印诊断信息)。

 

4. Murphi编译器的选项

Murphi编译器拥有几个命令行选项:

  • -h    帮助
  • -l    打印许可信息
  • -b    使用位压缩状态
  • -c    使用哈希压缩

默认情况下,Murphi将所有状态变量按字节对齐。结果就是状态的描述会是在每个位都被使用的情况(即位压缩,选项-b)下的2~4倍大。然而,Murphi的运行速度大约会快25%。

当使用哈希压缩(选项-c)时,通常被压缩为40bit大小的值会保存在哈希表中,而不是完整的状态描述。以后会更加详细地讨论。当完整的状态描述必须要使用的时候,哈希压缩可以和位压缩结合使用来减小活动状态队列对存储的需求。

 

5. 使用已生成的特殊目的的验证器

Murphi编译器为特殊的Murphi描述生成了特殊目的的验证器。下面的列表是相应的命令行选项:

1) 一般:

  • -h    帮助
  • -l    打印许可信息

2) 验证策略(默认-v):

  • -s    模拟器
  • -v或者-vbfs    使用广度优先搜索验证
  • -vdfs    使用深度优先搜索验证
  • -ndl    不检查死锁

3) 其他选项(默认-m8, -p3, -loop1000)

  • -m<n>    哈希表的存储数量,单位是Mb
  • -k<n>    同上,单位是Kb
  • -loop<n>    允许循环最多执行n次
  • -p    使模拟或者验证转为冗余模式(verbose)
  • -p<n>    每10^n次事件报告一次进展,n的值为1~5
  • -pn    不打印进展报告
  • -pr    打印规则信息

4) 错误跟踪操纵(默认-tn)

  • -tv    写出违反跟踪(默认与-td一起使用)
  • -td    只写出与前一个状态的不同(在模拟模式下,只写出冗余模式下的不同)
  • -tf    在跟踪中写完整的状态
  • -ta    写所有生成的状态至少一次
  • -tn    不写跟踪

5)压缩技术(默认-sym3和-permlimit 10,使用multiset压缩)

  • -nosym    不使用对齐压缩(multiset压缩仍然有效)
  • -nomultiset    不使用multiset压缩
  • -sym<n>    使用对齐压缩
  • -permlimit<n>    在alg 3中检查的序列的最大数目(设为0来标准化)
n 方法
1 彻底标准化
2 试探快速标准化(可能会比alg 3标准化慢或者快,对大数量集使用很多附加存储)
3 试探低存储标准化(依赖于-permlimit)
4 试探快速标准化(alg 3和-permlimit 1同时使用)

6) Hash压缩(默认使用40位的哈希压缩)

  • -b<n>    用来存储的位的数目
  • -d dir    将跟踪信息写入文件dir/sci.trace中

命令行选项"-s"将验证器转换为Murphi的模拟器,将会任意选择规则。不使用"-s",验证器决定所有可能选择的结果。当前的验证器通过BFS(默认)或者DFS(通过选项"-vdfs")来这么做。

一个巨大的哈希表被用来存储能够达到的状态。哈希表的大小通过"-m"和"-k"确定。默认的存储使用是8MB。文件"mu_prolog.inc"中的常量"gPercentActiveStates"可以修改,来改变BFS或者DFS中验证时使用的队列的容量。

 

 


这一部分算是结束了,其实好好看一遍手册,发现自己上次看的几遍都有理解错误或者遗漏的东西。。

 

 

传送门:

CMurphi入门笔记(一)——概览

CMurphi入门笔记(二)——基本概念

CMurphi入门笔记(三)——定义

CMurphi入门笔记(四)——表达式

CMurphi入门笔记(五)——语句

CMurphi入门笔记(六)——规则,起始状态和不变式

 

 

 

 

posted @ 2013-07-28 15:24  Raindai  阅读(1455)  评论(11编辑  收藏  举报