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入門筆記(六)——規則,起始狀態和不變式

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM