TLA+介绍

TLA+(WIKI官网)是一门领域特定语言,主要用于数理逻辑计算和并发系统的正确性验证。TLA+中的TLA代表的是“行为时序逻辑(Temporal Logic of Actions)”,Action 是纯函数;“+”代表“Data Logic”。这是由 Dr. Lamport所提出的学说,他也因此获得了2013年图灵奖。Lamport在分布式计算和并发系统领域研究40多年,发布了180多篇高价值论文,是有志于此领域的必读材料。官网提供了大量的学习资源,另外Hillel Wayne写了一个很棒的入门教程

TLA+利用高中或者大学学到的一些简单的数学知识(时序逻辑和数据逻辑),就可以发现程序中的错误,而这些错误用计算机来跑很长时间也可能不会发现。

作为一门领域特定语言,TLA+语法简单,基础数据对象只有Set、Tuple、Function(这并不是其他语言中的函数,可以理解成Python的Dict或Java的hashmap)几种。剩下的语法都是数学逻辑知识,不过这也是其中最困难的部分,就是用抽象的思维来思考,用数学的方式来思考。数学本身不会让程序运行得更有效率,但能让程序更逻辑严谨。TLA+已在航空航天、微软、亚马逊等实际系统中起到关键作用。

此外,为了便于使用,Lamport开发了PlusCal语言。PlusCal语言风格与C/Pascal语言类似,对传统语言出身的软件工程师对更加友好。在TLA+开发集成环境(TLA+ Toolbox)中,PlusCal会自动翻译成TLA+并运行。

本文不尝试讲解TLA+和PlusCal基础语法和设计方法,因为这方面官网提供了语言讲解、教学视频、代码示例、cheatsheet等等丰富资源。本文主要想通过2个示例来展示TLA+的优雅和强大,让大家感受到TLA+的魅力所在。

TLA+应用示例

看下面这题,如果用TLA+来解题,应该该如何实现?

在电影“虎胆龙威3-纽约大劫案”中,布鲁斯·威利斯和杰里米·艾恩斯遇到这样一个难题:给他们一个3加仑小壶和一个5加仑的大壶,要求在5加仑大壶里准确装入4加仑的水。

本质上,TLA+(行为时序逻辑)描述的是一个状态机,每一个时序(Temporal Logic)下都是一个特定状态(action),状态的跳变只依赖于自身(即纯函数的含义)。

本题中,状态机初始状态为小壶和大壶都为空;此后存在6种状态:小壶倒空、大壶倒空、小壶倒满、大壶倒满、小壶倒入大壶、大壶倒入小壶,状态机的下一个状态必为这6个状态中的一个。把如上分析转化为TLA+描述(如下):

设置不变量(invariant):big \= 4, TLA+会遍历所有状态可能性,并找到答案(如下):

START(大壶水为0加仑)->{big:0,small:0} (初始状态)-> {big:5, small:0}(倒满大壶)-> {big:2, small:3}(大壶导入小壶)-> {big:2, small:0}(倒空小壶)-> {big:0, small:2}(大壶倒入小壶)-> {big:5, small:2}(倒满大壶)-> {big:4, small:3}(大壶导入小壶)->END(大壶水为4加仑)

并发系统设计正确性验证

cache = {}
def increment(id):
x = cache.get(id, None)
if x is None:
x = database.read(id)
cache[id] = x x = x + 1
database.write(id, x)
cache[id] = x

上面一段Python代码,increment功能为对数据库(database)的一个字段值加一后再存入数据库中,为了优化数据库的读效率,在数据库上加了一层缓存(cache)。

在并发环境下,这段代码实现是有问题的,你能看的出来么?如何证明或验证此并发程序的正确性?

把上面的python代码转成PlusCal描述,代码实现如下:

所谓正确性验证,用数学的语言描述就是保证不变性。本例的一个不变性就是要保证数据库的一致性,换句话说,如果有N个进程并发执行increment(id),其值应该增加N。用TLA+描述如下:

DBConsistent == (\A i \in 1..N: pc[i] = "Done") => database = N

运行可见不变量DBConsistent遭违反(如下图),也证明了此并发程序存在bug。而且在Error-Trace中给出了违例的详细步骤和原因:如果1个进程A已执行完(Done)时,另一个进程B执行到状态t3,此时B进程中的x为0,但实际上数据库(database)和cache中的值已经为1了。

TLA+和并发系统正确性验证的更多相关文章

  1. 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)

    课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普 ...

  2. LDA工程实践之算法篇之(一)算法实现正确性验证(转)

    研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiw ...

  3. 用于并发系统建模和验证的着色Petri网及其工具软件的CPN Tools(笔记整理)

    1.着色Petri网(CPNS)是一种建模和验证系统的语言,在这些熊中并发性,交互性和同步性扮演着主要的角色,着色Petri网是一种功能编程语言Standard ML结合起来的离散时间建模语言,Pet ...

  4. 2020重新出发,NOSQL,redis高并发系统的分析和设计

    高并发系统的分析和设计 任何系统都不是独立于业务进行开发的,真正的系统是为了实现业务而开发的,所以开发高并发网站抢购时,都应该先分析业务需求和实际的场景,在完善这些需求之后才能进入系统开发阶段. 没有 ...

  5. Java面试之高并发系统

    在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.

  6. 程序员修神之路--用NOSql给高并发系统加速(送书)

    随着互联网大潮的到来,越来越多网站,应用系统需要海量数据的支撑,高并发.低延迟.高可用.高扩展等要求在传统的关系型数据库中已经得不到满足,或者说关系型数据库应对这些需求已经显得力不从心了.关系型数据库 ...

  7. 3年Java开发6个点搞定高并发系统面试疑惑

    前言 其实所谓的高并发,如果你要理解这个问题呢,其实就得从高并发的根源出发,为啥会有高并发?为啥高并发就很牛逼? 说的浅显一点,很简单,就是因为刚开始系统都是连接数据库的,但是要知道数据库支撑到每秒并 ...

  8. Java并发编程之验证volatile不能保证原子性

    Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...

  9. LMAX高并发系统架构

    很早就看到过MF的这篇The LMAX Architecture,可是之前一来英文水平不够,二来确实看不懂- 今天有幸再次看到,一口气读完终于有所领悟. 1 Overall Architecture ...

随机推荐

  1. C++学习笔记第三天:类、虚函数、双冒号

    类 class Box { public: double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度 }; 类成 ...

  2. 【spring-boot】spring aop 面向切面编程初接触

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  3. SpringCloud @FeignClient的类注解@ReqestMapping无效报错:No message available","path":"/xxxx

    最近在使用Feign组合微服务的时候发现在@FeignClient接口类上使用@ReqestMapping无效. 像下面的这个代码: @FeignClient("xxx") @Re ...

  4. java异常处理、多态

    第一:GC是什么? 为什么要有GC?  第二:垃圾回收的优点和原理.并考虑2种回收机制.  第三:垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?  第 ...

  5. (转载)windows下mysql忘记密码

    Mysql版本:5.1 1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd窗口,切换到mysql的bin目录 ...

  6. ajax的缺点

    平时我们大多注意的都是ajax给我们所带来的好处诸如用户体验的提升.对ajax所带来的缺陷有所忽视. 下面所阐述的ajax的缺陷都是它先天所产生的. 1.ajax干掉了back按钮,即对浏览器后退机制 ...

  7. android DecorView深入理解

    开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局.页面都是依附在窗口之上的,而DecorView即是窗口最顶 ...

  8. Mongodb3.0.5副本集搭建及spring和java连接副本集配置

    这是去年写的一篇文档,最近突然发现并没有发不出来,因此现在补上,希望能对某些朋友有所帮助.因为当时记录时没有截图,因此这里看起来可能就比较单调. 一.基本环境: mongdb3.0.5数据库 spri ...

  9. apache配置,禁止ip访问web站点

    由于一台服务器上面部署了好几个应用,对应不同的域名,如果用户知道ip地址的话,直接用户ip地址访问,会显示第一个虚拟主机的页面(更改了虚拟主机的顺序,每次都是显示第一个).这样对用户造成不好的印象,所 ...

  10. (十九)java小练习

    练习1:计算13-23+33-43+--+993-1003的结果     package demo; /**  * 计算13-23+33-43+--+993-1003的结果  * @author tu ...