本文为并发缺陷的确定性复现-以线程为研究中心的总结
以 Efficient transaction-based deterministic replay for multi-threaded programs 文章提出的TPLAY工具 和基于约束求解的并发程序错误预测方法研究 硕士论文ASVDetector工具 举例
专有名词定义在 【并发理论】事件、执行轨迹、可行性公理、最大因果模型
目标对象
多为针对原子违背(猜测是因为原子违背的线程交织种类好归纳,有规则)
探测技术分类
原子违背探测技术主要分为三类:主要分为静态探测技术、运行时监测技术、运行时预测技术等
- 静态分析技术从程序源码级别进行原子集合序列化违背的探测,由于缺少程序动态执行信息,因此会导致较高的误报率。
- 运行时监测技术是目前使用最广泛的原子集合序列化违背探测技术,运行时监测技术在程序执行过程中探测在程序实际执行序列中暴露出的原子集合序列化违背,误报率低,但只能探测出在实际执行轨迹中暴露出的错误,所以漏报率高。
- 运行时预测技术(Runtime Prediction)属于混合型探测技术,在程序执行过程中记录一个由事件序列组成的执行轨迹,在特定的约束条件下静态地产生关于这些执行事件的其他交织,以此来暴露出在执行轨迹中没有发现的并发错误。
基于约束求解的并发错误探测技术:在程序执行过程中收集一个程序的实际执行轨迹,针对执行轨迹中每个潜在的并发错误建立一组约束条件,然后调用约束求解器试图求解出一个能暴露出当前并发错误的事件执行序列,将并发错误的探测问题转换为约束求解问题。
技术方法
运行时预测:ASVDetector
运行时检测:TPLAY
1. 定义事件event
线程操作的类型,事件event的表达形式。例
操作op:read-write, fork-join, begin-end ,lock acquire-release, enter-exit进入方法, branch分支事件
表达形式:线程1对共享变量o进行读操作,读值为1,简写为read(t1,o,1)
执行轨迹 τ \tau τ :定义另见文章
操作op:主要分为r-w, acquire-release,fork-join
表达形式:event=(thread,op)
定义事务transaction(目的:用tr代替 τ \tau τ中安全的event序列,这样减少log大小,当遇到原子违背时再细化到event上的交织)
2. 定义执行轨迹的规范
具体定义可以看另一篇笔记,不是这篇的主要内容
-
序列化规范序:
序列化规范是事件顺序要求,是并发程序对并发对象访问产生的原子操作序列顺序。 -
顺序一致性执行轨迹:
当且仅当对每个并发对象o,事件序列τ|o 都满足序列化规范时,执行轨迹τ被称为顺序一致性执行轨迹。包含以下要求:
读写一致性
锁互斥
Happens-before关系 -
可行性公理(产生执行轨迹的规则):
顺序一致性轨迹太严格,需要放松要求。最后产生规则: 1.前缀封闭 2.分支 3.仅读值不同 4.仅写值不同 5.其他情况。以上要求产生的轨迹则是包含了原子集合不可序列化交织的轨迹。 -
根据可行性公理产生的执行轨迹构成的集合,就是最大因果模型。
目的:扩大探测空间,尽可能的产生多的合法执行轨迹。
- 定义Interleaving: r − r , r − w , w − w r-r ,r-w, w-w r−r,r−w,w−w
- 定义Transaction:(在每个线程的第一个write或read之后的任何write事件上创建一个新事务,事务结束在紧接write的read或线程的最后一个事件) t r = < b e g i n ( t , l ) . . . e i . . . e n d ( t , l ) > tr=<begin(t,l)...e_i...end(t,l)> tr=<begin(t,l)...ei...end(t,l)>
- 定义事务级交织TI: e i − > e j , e i ∈ t r 1 , e j ∈ t r 2 则 t r 1 − > t r 2 e_i -> e_j,e_i \in tr_1,e_j \in tr2 则 tr1->tr2 ei−>ej,ei∈tr1,ej∈tr2则tr1−>tr2
- 定义HB:1. program order 2.locking 3.fork-join
定义线程t1和t2分别创建两个事务tr1和tr2。假设tr1和tr2之间的所有交织形式为e e’,其中e∈tr1和e’∈tr2,可以减少为记录tr1 tr2的单个交织。
目的:这样可以减少记录日志,同时保持记录真实程度。
3. 建立约束
定义 3.1 给定事件a, b, c, d, op(a), op(b), op( c), op(d) ∈{read, write},
target(a) = target( c), target(b) = target(d)
thread(a)=thread(b), thread( c)=thread(d), thread(a)≠thread( c),且 a 和 b 访问的变量属于同一原子集合,a 和 b 属于同一工作单元,c 和 d 属于同一工作单元。当 a, b, c, d 的事件类型满足原子集合序列化违背错误模式的任意一种时, a, b, c, d 构成一个冲突访问序列,记为 COS(a, b, c, d)。
冲突访问 COS(a, b, c, d)是执行轨迹中潜在的原子集合序列化违背,需对每个 COS(a, b, c, d)探测是否存在一致性执行轨迹使得事件 a,b,c,d 的交织顺序满足表 3-1 中的原子集合不可序列化交织模式中的任意一种.
4~9的交织是希望读取 write之后的最新值。
TPLAY不用约束求解
在TPLAY中用来对比试验的Light工具使用约束求解, 约束是write-read interleaving { W t i d − e i d − R t i d − e i d } \{W_{tid}-e_{id}-R_{tid}-e_{id}\} {
W