形式化验证工具(PAT)Reader-Writers Problem学习
经过前几次的学习,我们应该对PAT有一点点的了解了,我们加下来就直接看例子中的一个问题,这个问题比较简单。
看代码:
//The classic Readers/Writers Example model multiple processes accessing a shared file. ////////////////The Model//////////////////
//the maximun size of the readers that can read concurrently
#define M 2;
var writing = false;
var noOfReading = ; Writer() = [noOfReading == && !writing]startwrite{writing = true;} -> stopwrite{writing = false;} -> Writer();
Reader() = [noOfReading < M && !writing]startread{noOfReading = noOfReading+;} ->
//the following guard condition is important to avoid infinite state space, because noOfReading can go negtively infinitely
([noOfReading > ]stopread{noOfReading = noOfReading-;} -> Reader()); //there are infinite number of Readers and Writers
ReadersWriters() = |||{..} @ (Reader() ||| Writer()); ////////////////The Properties//////////////////
#assert ReadersWriters() deadlockfree;
#define exclusive !(writing == true && noOfReading > 0);
#assert ReadersWriters() |= [] exclusive;
#define someonereading noOfReading > 0;
#assert ReadersWriters() |= []<>someonereading;
#define someonewriting writing == true;
#assert ReadersWriters() |= []<>someonewriting;
首先定义了一个M,这个M表示可以同时读书的最大读者数量。接下来定义了一个变量writing,表示是否在写。然后定义了noOfReading,表示在阅读的读者数量。
接下来我们看两个行为,写行为:
Writer() = [noOfReading == && !writing]startwrite{writing = true;} -> stopwrite{writing = false;} -> Writer();
写行为有一个前置gurd条件,就是在读书的人数必须是0而且不能有在写的,然后这个行为才可以写,写的时候把writing置为true,然后是停止写(writing置为false),然后回到写行为。
读行为:
Reader() = [noOfReading < M && !writing]startread{noOfReading = noOfReading+;} ->
//the following guard condition is important to avoid infinite state space, because noOfReading can go negtively infinitely
([noOfReading > ]stopread{noOfReading = noOfReading-;} -> Reader());
同样的,读行为也有一个前置条件,就是在读书的人数必须小于M,而且不能有在写的,然后这个行为才可以阅读(阅读人数加一),然后在阅读人数大余0的情况下,才可以停止阅读(阅读人数减一),然后回到阅读行为。
然后就是整个系统:
ReadersWriters() = |||{..} @ (Reader() ||| Writer());
我们看到前两种行为是没有交集的,所以,这里使用的三个竖线,就是interleaving。然后可以有无穷多的读者和作者过来。
下面就是一些验证了。
首先看看是不是不会发生死锁?我们自己来分析分析,系统肯定不会发生死锁,因为两个行为没有交集,都是一步一步运行下去。但是当我们验证的时候看到如下的结果。

结果表示PAT验证这个命题是正确还是错误,这是为什么呢?仔细的读者肯定能想到,我们的系统里面有无数个人过来,PAT根本走不到最后一个节点,甚至根本走不完所有的节点。所以PAT给一个结果表示无法验证(
NEITHER PROVED NOR DISPROVED),这里如果我们修改过来的人数,就可以看到验证结果是没有问题的。

接下来定义了变量,变量是写为真且读的个数大余0的取反,这个在每个状态都是对的,因为可以写的时候读的必须是0,可以读的时候,必须不能写。所以下面这个验证是对的。
#assert ReadersWriters() |= [] exclusive;

下面两个的验证是不正确的,因为,不一定会总有人在读书或者不一定总有人在写。所以这两个验证都不一定正确。
#define someonereading noOfReading > 0;
#assert ReadersWriters() |= []<>someonereading;
#define someonewriting writing == true;
#assert ReadersWriters() |= []<>someonewriting;


到这里我们这次就结束了。
形式化验证工具(PAT)Reader-Writers Problem学习的更多相关文章
- 形式化验证工具(PAT)羊车门代码学习
首先介绍一下PAT工具,下图是PAT工具的图标 PAT工具全称是Process Analysis Toolkit,可以做一些简单的验证. 今天我们分析一下例子里面的Monty Hall Problem ...
- 形式化验证工具(PAT)Perterson Algorithm学习
今天学习一下Perterson Algorithm. 这个算法是使用三个变量来实现并发程序的互斥性算法. 具体看一下代码: Peterson算法是一个实现互斥锁的并发程序设计算法,核心就是三个标志位是 ...
- 形式化验证工具(PAT)2PC协议学习
今天我们来看看2PC协议,不知道大家对2PC协议是不是了解,我们先简单介绍一下. 两阶段提交协议(two phase commit protocol, 2PC)可以保证数据的强一致性,许多分布式关系型 ...
- RChain的一键形式化验证:关于RCast 33 – LADL话题的讨论摘要
作者/Atticbee 在这一集,Greg和RChain的研究人员Isaac,Christian讨论了TLA(Temporal Logic of Actions)和RChain的LADL(Logic ...
- Linux登录验证机制、SSH Bruteforce Login学习
相关学习资料 http://files.cnblogs.com/LittleHann/linux%E4%B8%AD%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E8%AE% ...
- 《形式化分析工具Scyther性能研究》------摘抄整理
本篇论文的主要创新点在--------使用 Scyther工具发现对部分 KCI攻击搜索出现漏报的现象,并给出了存在的原因, 介绍了 形式化分析工具 AVispa全称是 Automated V ...
- Scyther 形式化分析工具资料整理(三)
1.作者Cas Cremers在做TLS1.3的时候我么发现并没有使用Scyther 形式化丰分析工具对其进行分析,而是使用了 The Tamarin .作者建立了TLS.13的模型. 那么我的目标是 ...
- 《SystemVerilog验证-测试平台编写指南》学习 - 第2章 数据类型
<SystemVerilog验证-测试平台编写指南>学习 - 第2章 数据类型 2.1 内建数据类型 2.2 定宽数组 2.2.1 声明 2.2.2 常量数组 2.2.3 基本的数组操作 ...
- LinqPad工具:帮你快速学习Linq
LinqPad工具:帮你快速学习Linq 参考: http://www.cnblogs.com/li-peng/p/3441729.html ★:linqPad下载地址:http://www.linq ...
随机推荐
- UVALive 3971 Assemble(二分+贪心)
本题思路不难,但是要快速准确的AC有点儿考验代码功力. 看了大白书上的标程,大有所获. 用map和vector的结合给输入分组,这个数据结构的使用非常精美,恰到好处. #include<iost ...
- Technocup 2019 C. Compress String
一个字符串 $s$,你要把它分成若干段,有两种合法的段 1.段长为 $1$,代价为 $a$ 2.这个段是前面所有段拼起来组成的字符串的字串,代价为 $b$ 问最小代价 $|s| \leq 5000$ ...
- 转载:maven依赖范围
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath(注意是与classpath)的关系. 主要的是三种依赖关系如下:1.compile: 默认编译依赖范围.对于编译,测试,运行 ...
- python的编解码问题
http://blog.chinaunix.net/uid-27838438-id-4227131.html
- shell split函数的使用
#!/bin/awk -f BEGIN{FS=","} {split($1,name," "); for (i in name) print name[i] }
- Js中的prototype的用法一
一 prototype介绍 prototype对象是实现面向对象的一个重要机制.每个函数也是一个对象,它们对应的类就是function,每个函数对象都具有一个子对象prototype.Prototyp ...
- 安装部署ELK系统监控Azure China的NSG和WAF Log
ELK是一个开源的产品,其官网是:https://www.elastic.co/ ELK主要保护三个产品: Elasticsearch:是基于 JSON 的分布式搜索和分析引擎,专为实现水平扩展.高可 ...
- 并发编程之五--ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- SQL命令优化
与数据库交互的基本语言是sql,数据库每次解析和执行sql语句多需要执行很多步骤.以sql server为例,当数据库收到一条查询语句时,语法分析器会扫描sql语句并将其分成逻辑单元(如关键词.表达式 ...
- KVO键值监听
KVO 键值监听:当我想知道一个对象的属性是否发生改变的时候 做出响应,就需要添加监听keypath 和 key的区别keypath会自动寻找子类的属性key只会寻找当前类的属性添加键值监听[pers ...