形式化验证工具(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 ...
随机推荐
- PhotoShop使用指南(2)——下雨动画效果
第一步: 第二步: 第三步: 第四步:
- python数据类型、操作符
python中数据类型包含:int,float,boolean,string,list(列表),set(集合),dictionary(字典) 数据类型转换: ①字符串 转 int:>>&g ...
- Agc007_C Pushing Balls
传送门 题目大意 在一条直线上有$N$个球和$N+1$个洞,每两个球之间有一个洞,每两个洞之间有一个球,最左端和最右端都是洞,其中产生的$2N$个间隔满足从左到右是等差数列.你每次随机选择一个未被推进 ...
- LeetCode Beautiful Arrangement II
原题链接在这里:https://leetcode.com/problems/beautiful-arrangement-ii/description/ 题目: Given two integers n ...
- 2017.10.7北京清北综合强化班DAY7
1.计数 (count.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍 ...
- 前端项目使用module.exports文件一定要Webpack编译吗?请问gulp可以编译这种文件吗
import引入类似这种文件,一定要用webpack去编译吗 module.pxports 是CMD规范的一个全局函数,功能是当前模块对外提供接口.require可以直接使用这个接口.例子: echo ...
- 如何用nodejs启一个前端服务
1.新建文件夹,如 notice 2.新建页面和js文件,如 index.html server.js 3.index.html页面内容随你写,如: <!DOCTYPE html> < ...
- QAbstractSocket::connectToHost() called when already looking up or connecting/connected to
tcpSocket_connect_HBJ->abort();//取消已有连接,重置套接字,tcpSocket_connect_HBJ是QTcpSocket类的对象 就不会报错了.
- 深入VR之前 你应该知道VR头显透镜原理
转自:http://www.gamelook.com.cn/2016/03/246817 要理解虚拟现实头显透镜的工作原理,首先要搞懂眼睛是如何看到事物的. 眼睛瞳孔后有晶状体,也就是眼珠子.眼睛的背 ...
- python学习笔记(一):python简介和入门
最近重新开始学习python,之前也自学过一段时间python,对python还算有点了解,本次重新认识python,也算当写一个小小的教程.一.什么是python?python是一种面向对象.解释型 ...