【并发理论】事件、执行轨迹、可行性公理、最大因果模型

本文深入探讨并发理论,从事件、执行轨迹、可行性公理到最大因果模型,阐述并发程序的序列化规范,特别是共享内存和不可重入锁的规则。通过对事件的定义和执行轨迹的分析,解释了顺序一致性执行轨迹的要求,如读写一致性、锁互斥和Happens-before关系。同时,介绍了可行性公理及其演变,强调在保证顺序一致性的同时,如何推导出相关执行轨迹。最后,讲解最大因果模型的概念,它是建立在顺序一致性轨迹上的最小可行集合,有助于理解和检测并发程序中的错误模式。
摘要由CSDN通过智能技术生成


原内容来自 基于约束求解的并发程序错误预测方法研究
— 背景 —
任意线程都能通过执行一组原子操作来访问并发对象;若对某些并发对象进行访问的原子操作序列能由并发程序的执行产生,则表明这些原子操作序列满足了规定的顺序要求。这些顺序要求被称为并发对象的 序列化规范(serial specification)

序列化规范是顺序要求,是并发程序对并发对象访问产生的原子操作序列顺序。

并发对象多为两种:

  1. 共享内存地址:对共享内存地址有read和write操作,序列化规范定义了每一个read值=最近前一个write的值
  2. 不可重入锁:对每一个不可重入锁有acquire获得锁、release释放锁操作,序列化规范定义了acquire和release 数量差为0或1,且所有连续的获得锁、释放锁操作是对同一个线程进行的操作。

事件

事件(Event)是线程在并发对象上执行的原子操作,表示为“属性-值”元组
属性有:访问当前并发对象的线程thread、 对该并发对象进行的操作类型op、该事件访问的并发对象target、对并发对象进行的操作值data(thread=t1,op=read,target=o,data=1)意为线程1对共享变量o进行读操作,读值为1,简写为read(t1,o,1)
对于两个事件e1,e2,当且仅当所有属性都相等,才称为这俩个事件相等。

在这里插入图片描述

执行轨迹

执行轨迹抽象为一组事件序列 τ = < e 1 , e 2 , . . . e n > \tau=<e_1,e_2,...e_n> τ=<e1,e2,...en>

τ ∣ o : 执 行 轨 迹 τ 对 并 发 对 象 o 的 事 件 序 列 τ|o :执行轨迹τ对并发对象o的事件序列 τoτo
τ ∣ t : 执 行 轨 迹 τ 中 属 于 线 程 t 的 事 件 序 列 τ|t :执行轨迹τ中属于线程t的事件序列 τtτ线t
τ ∣ t , o : 执 行 轨 迹 τ 中 线 程 t 访 问 并 发 对 象 o 的 事 件 序 列 τ|t,o:执行轨迹τ中线程t访问并发对象o的事件序列 τt,oτ线t访o
τ e : 执 行 轨 迹 τ 中 包 含 事 件 e 在 内 的 前 缀 事 件 序 列 , 例 τ = τ 1 e τ 2 , 则 τ e = τ 1 e τ_e:执行轨迹τ中包含事件e在内的前缀事件序列,例τ=τ_1eτ_2,则τ_e=τ_1e τeτeτ=τ1eτ2τe=τ1e
l a s t o p ( τ ) : 执 行 轨 迹 τ 最 后 一 个 o p 操 作 的 事 件 last_{op}(\tau): 执行轨迹\tau 最后一个op操作的事件 lastop(τ):τop

顺序一致性执行轨迹:当且仅当对每个并发对象o,事件序列τ|o 都满足序列化规范时,执行轨迹τ被称为顺序一致性执行轨迹包含以下要求:

  • 读写一致性: read读的值是执行轨迹在read之前且距离该read事件最近且和read访问同一个共享内存地址的write值。设e为该read事件 读写一致性可形式化表示为 d a t a ( e ) = d a t a ( l a s t w r i t e ( τ e ∣ t a r g e t ( e ) ) ) data(e)=data(last_{write}(\tau_e|target(e))) data(e)=data(lastwrite(τetarget(e)))
  • 锁互斥:每个release事件之前都有同一个线程且同一个锁变量的acquire事件与之匹配,且对每一个acquire-release锁对 都不可与其他访问同一锁变量的锁对产生交织。 τ ∣ l = e 1 , e 2 , . . . e n , 若 有 l ≤ k < n , o p ( e k ) = a c q u i r e 则 o p ( e k + 1 ) = r e l e a s e , t h r e a d ( e k ) = t h r e a d ( e k + 1 ) \tau|l=e_1,e_2,...e_n ,若有l≤k<n , op(e_k)=acquire则op(e_{k+1})=release,thread(e_k)=thread(e_{k+1}) τl=e1,e2,...en,lkn,op(ek)=acquireop(ek+1)=releasethread(ek)=thread(ek+1)
  • Happens-before关系:begin事件是线程执行的第一个事件,且发生在父线程fork(t,t’)之后,e=begin(t’)为τ中事件。 τ ∣ t ′
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值