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] = xx = x + 1database.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了。

转载于:https://www.cnblogs.com/wahaha02/p/7240337.html

TLA+和并发系统正确性验证相关推荐

  1. 看了这个高并发系统架构,才知道我对秒杀的误解有多深

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取推荐书籍 来源:33h.co/dCNy 很多小伙伴反馈说,高并发学了那么久, ...

  2. 高并发系统之降级特技

    2019独角兽企业重金招聘Python工程师标准>>> 高并发系统之降级特技 博客分类: 架构 在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.之前已经有一些文章介绍过缓 ...

  3. 全数字实时仿真平台SkyEye和同步数据流语义与翻译正确性验证

    全数字实时仿真平台 SkyEye,中文全称天目全数字实时仿真软件,应用软件仿真技术,逼真地模拟出被测软件的物理环境.用图形化方式构建虚拟目标系统,有效降低了硬件工程师和软件工程师之间的沟通成本,软件工 ...

  4. 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统

    亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统 1.高并发原则 1.1 无状态 1.2 拆分 1.3 服务化 1.4 消息队列 1.5 数据异构 1.6 缓存银弹 1.7 并发化 2 高可用原 ...

  5. 阿里巴巴内部不传之秘「十亿级并发系统顶级教程」GitHub一夜封神

    何为超大流量? 超大流量是一个很容易理解的意思!举个例子:现在国内疫情反弹,每个小区都要做核酸那么如果同一时间下来一大批人一起做核酸,那么这就是大流量,然后志愿者将人员进行分配排队让医务人员处理的过来 ...

  6. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模

    " 架设一个亿级高并发系统,是多数程序员.架构师的工作目标. 许多的技术从业人员甚至有时会降薪去寻找这样的机会.但并不是所有人都有机会主导,甚至参与这样一个系统.今天我们用12306火车票购 ...

  7. 高性能高并发系统的稳定性保障

    高性能高并发系统的稳定性保障 原创 2016-12-21 肖飞 开涛的博客 作者:肖飞,于2011年8月份加入京东,曾亲身参与到京东的应用性能监控.统一日志.流式计算.内存缓存.四层防攻击等一些基础技 ...

  8. 要实现秒杀还得看这个高并发系统架构的表演

    一.前言 很多小伙伴反馈说,高并发学了那么久,但是在真正做项目时,仍然不知道如何下手处理高并发业务场景!甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段,不知道学习的并发知识如何运用到实际项 ...

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

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

最新文章

  1. 在python中排序元组
  2. 神经网络(补充)(第五章)
  3. c++ -- union介绍
  4. TortoiseSVN2IDE.pas源代码
  5. 基于维纳滤波的语音增强算法 matlab,基于维纳滤波语音增强算法的改进实现
  6. home assistant gpio 温度计_Calsys 500BB辐射温度计
  7. Go 切片使用绕坑指南
  8. WHAT IS PYTORCH
  9. linux centos7 cuda安装
  10. (9) tomcat中实现同一虚拟机中所有应用程序单点登录SSO
  11. SpringMVC 理论与有用技术(一) 简单、有用、易懂的几个实例
  12. SpringBoot 2.0.0 注入SpingCloud 有bug(目前只有SpringBoot 1.5+ 版本的支持)
  13. 大话数据结构系列之快速排序算法
  14. e语言做爱奇艺视频采集_现有的15种奇异(和疯狂)编程语言
  15. Hibernate使用原生SQL查询
  16. 电信物联网平台ctwing对接开发-平台概述
  17. 解决上传SFTPorg.apache.commons.net.MalformedServerReplyException: Could not parse respon
  18. It was possible to detect the usage of the deprecated TLSv1.0 and/or TLSv1.1 protocol on this system
  19. iPhone X 适配(全)
  20. win10下设置超清晰壁纸

热门文章

  1. 『C/C++养成计划』Visual Studio Code编辑器配置(外观通用型扩展Minmal)
  2. WZOI-306找第一个只出现一次的字符
  3. P2P网贷平台改造规划希望各位给点意见
  4. 【深度学习】YOLO-Pose 人体关键点估计 人体姿态估计
  5. java unicode转韩文_Java 使用hutool工具类代替commons-text进行Json 中文 Unicode转换
  6. 《水经注地图服务》快速发布MBTiles数据
  7. php调用layer alert弹窗
  8. 转-谈谈我自己(创业四个多月)
  9. 为什么铝电解电容滤低频信号而瓷片电容滤高频信号?
  10. OpenGL学习笔记一之PBR篇一 理论