Promela轻松入门教程
来源:互联网 发布:xampp linux 使用教程 编辑:程序博客网 时间:2024/05/12 21:17
最近在学并发开发, 里面需要用到Promela语言来检测代码的逻辑
Promela用起来很麻烦, 不过网上有个Windows GUI程序, 里面还带了很多例子代码, 稍微看看就可以懂了
工具名称叫JSpin, 在这里下载
https://code.google.com/p/jspin/
安装起来很简单, 安装好之后, 打开安装目录下的config文件, 吧Mingw路径配置好就可以了.
打开程序运行, 随便找个示例代码跑下, 如果编译不成功, 那么就在他的Run.bat前面加上这行
SET PATH=%path%;c:/path_of_mingw/bin
你可以在安装目录下找到用户手册jspin-user.pdf
一般检测并发代码需要检测下面三项
1.互斥(Mutual exclusion)
2.无死锁(Free from Deadlock)
3.无饥饿(Free from starvation)
在这个工具里面, 你可以用assert()来进行检测, 也可以自己写LTL(线性时间逻辑)来检测,
你可以打开里面的 dekker.pml 学习下如何使用它们来检测
pml语言的语法略奇葩,不过看看就会, active proctype 就是声明一个线程
/* Dekker's algorithm */bool wantp = false, wantq = false;byte turn = 1;bool csp = false, csq = false;ltl { []<>csp && []<>csq }active proctype p() { do :: wantp = true; do :: !wantq -> break; :: else -> if :: (turn == 1) :: (turn == 2) -> wantp = false; (turn == 1); wantp = true fi od; csp = true; assert (!(csp && csq)); csp = false; wantp = false; turn = 2 od}active proctype q() { do :: wantq = true; do :: !wantp -> break; :: else -> if :: (turn == 2) :: (turn == 1) -> wantq = false; (turn == 2); wantq = true fi od; csq = true; assert (!(csp && csq)); csq = false; wantq = false; turn = 1 od}
线性时间逻辑就是在逻辑的基础上加上了时间的概念, []表示永远是1, <>表示在未来终究会出现1 等等
http://web.iitd.ac.in/~sumeet/slide3.pdf
https://www.youtube.com/watch?v=KVQdTjvtyUw
ltl { []<>csp && []<>csq }
表示的意思就是
永远会反反复复的进入p的critical section && 永远会反反复复的进入q的critical section
这句话就是用来检测starvation的, 如果程序有能力反复执行p而不执行q(无论几率多么小), jspin都会报错
检测ltl的时候请选择acceptance模式.
测试starvation的时候去掉weak fairness
意思就是:允许一个能够反复执行的进程无限反复执行,每次都是他执行, 而不让其他的进程执行(在现实的计算机cpu中是不现实的)
如果你的程序有了starvation freedom的话, 那么就会保证上述的情况永远不会出现
0 0
- Promela轻松入门教程
- ArcEngine10 轻松入门教程
- Promela BCL-6 A Protocol
- 习语言(c语言)轻松入门教程
- Promela BCL-6 B4.0 Protocol [Incomplete]
- 轻松使用SaltStack管理成千上万台服务器(入门教程)
- 轻松.....
- OHSCE入门教程(四)-大肚函数PHP轻松搞HTTP(S)API(URL/REST)
- 入门教程
- GitHub入门教程的入门教程
- 轻松一下
- 一身轻松
- 轻松一刻
- 轻松过节
- 继续轻松
- 轻松一下^^
- 轻松看一看
- 轻松走职场
- Java学习笔记13:复合优先于继承
- 二叉树的遍历
- 信号量与自旋锁
- 引入解释性变量
- HDU 1421 搬寝室[DP]
- Promela轻松入门教程
- Vim试水
- springmvc 如何跳转到根目录下的index.jsp页面
- qemu笔记
- xcode 编译静态库 libcurl
- B树、B-树、B+树、B*树
- 第3章、第一个“Hello,world!”之Android App(从零开始学Android)
- linux文件系统命令(6)---touch和mkdir
- cocos2dx学习书签