前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >动态数据竞争验证方法(一)

动态数据竞争验证方法(一)

原创
作者头像
chain
修改于 2018-06-12 14:28:14
修改于 2018-06-12 14:28:14
7730
举报

动态数据竞争检测算法可以在不知道程序中是否存在数据竞争前提下执行,而动态数据竞争验证方法则是在知道程序中可能存在的数据竞争前提下,对这部分可疑的数据竞争进行验证,看这些数据竞争是否真的发生,同时也可以验证这些数据竞争是否对程序造成有害的影响。

Reference http://web2.cs.columbia.edu/~junfeng/09fa-e6998/papers/racefuzz.pdf 这篇文章提出的RaceFuzzer采取随机调度的方式来验证数据竞争是否是有害的,主要分为如下几个阶段:

Phase1 首先利用hybrid的动态数据竞争检测方法找到程序中所有的数据竞争,这些数据竞争将会构成一个数据竞争语句对集合。之前的文章已经分析很多hybrid的动态数据竞争检测方法,这里就不再重复。

Phase2 根据Phase1中得到的数据竞争语句对,在动态的时候调度线程尽量让这些数据竞争语句对能够临时地相遇(同时发生)。相关的算法如下所示,为了方便描述,这里给出相关的一些定义: • s:程序在执行过程中的状态 • Enabled(s):当前状态s下可用的线程集合,线程不可用表明当先线程阻塞在一些同步操作上 • Alive(s):当前状态s下还没有结束的线程集合 • Execute(s,t):返回线程t在当前状态s下执行语句之后的状态 • NextStmt(s,t):返回线程t在当前状态s下即将要执行的语句

首先输入RaceSet为Phase1中的竞争语句对集合,并且程序当前状态为s为初始状态s0。其中postponed集合用来保存认为干预中止的线程,初始的时候同样是空集。

从while循环也可以发现,只要当前有可用的线程,那么就会一直执行下去。否则的话,一旦当前状态存在没有结束的线程就表明程序陷入了死锁(L30)。

该算法调度线程的核心就是每次只让一个线程执行,并且是随机的挑选可用的线程(L5)。

当被选择的线程即将执行的语句在RaceSet中,也就是数据竞争语句。 • 如果此时postponed中存在其他的线程即将访问的操作和当前线程t即将访问的操作构成数据竞争,那么此时机会随机是否当当前的线程继续执行还是让postponed中的线程继续执行(如果有多个阻塞的线程那么会让所有参与数据竞争的被阻塞的线程都继续执行)。 • 否则的话,当前线程就会被阻塞中止执行。 下图展示的是一个数据竞争的例子:

其中存在两个数据竞争[5,7]和[1,10]。对于数据竞争[1,10]来说,如果线程1先到达1,那么此时会被阻塞等待线程2到达10,线程1被加入到postponed中,但是由于y初始为0,因此线程2会一直执行到结束,此时线程1就会从postponed中被移除。对于数据竞争[5,7]来说,如果线程1先到达5,此时就会被阻塞,当线程到达7时,此时就会被验证为一个数据竞争。而一旦随机挑选线程1继续执行,那么此时就会执行6导致程序出现错误,此时,数据竞争[5,7]就是一个有害的数据竞争。

上述数据竞争验证方法每次只能够允许一个线程执行,使得数据竞争验证较慢。并且由于其使用确定性阻塞来中止线程的执行,因此可能会引入新的死锁。同时该方法每次执行程序能够验证的数据竞争很少。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态数据竞争验证方法(二)
之前提到的动态数据竞争验证方法尽管相比RaceFuzzer提高了验证的效率,但是仍然存在一个比较致命的问题就是执行程序一次只能够验证很少的一部分数据竞争。
chain
2018/06/12
4880
并发设计模式实战系列(16):屏障(Barrier)
今天为大家带来的是并发设计模式实战系列,第十六章屏障(Barrier),废话不多说直接开始~
摘星.
2025/05/20
1240
并行化的动态数据竞争验证和检测方法
之前系列提到的动态数据竞争验证和检测方法是结合了验证和检测两部分。这篇文章主要介绍一下并行化的动态数据竞争验证和检测方法。
chain
2018/06/12
9580
动态数据竞争检测方法实验分析(一)
之前的文章大致介绍了一下我们的动态数据竞争检测平台如何构建,这篇文章主要是在动态数据竞争检测平台上实现了之前介绍的数据竞争检测方法,我们扩展了其中的一些方法使得这些方法能够识别所有的Pthread库中的同步原语。
chain
2018/06/12
1.2K0
基于Lockset的数据竞争检测方法汇总(一)
对于搞数据竞争检测方向的人来说,Lockset方法大家肯定不陌生,作为一个刚入门数据竞争检测方向的我来说,就和大家总结一下我近期有关Lockset方法的一些研究和心得。
chain
2018/06/05
1.5K3
基于Lockset和Happens-before的数据竞争方法汇总
之前的文章介绍都是单独使用lockset或是单独使用happens-before关系进行动态数据竞争检测的方法。单纯使用lockset算法,由于不考虑其他的一些同步原语,会导致很多的误报,但是该方法对线程交错不太敏感。单纯使用happens-before关系,该方法对线程交错比较敏感,因此会导致出现很多漏报。因此结合lockset算法和happens-before关系的混合(hybrid)算法由此而生。
chain
2018/06/05
9860
《Elasticsearch 源码解析与优化实战》第10章:索引恢复流程分析
索引恢复(index.recovery)是ES数据恢复过程。待恢复的数据是客户端写入成功,但未执行刷盘(flush)的Lucene分段。例如,当节点异常重启时,写入磁盘的数据先到文件系统的缓冲,未必来得及刷盘,如果不通过某种方式将未刷盘的数据找回来,则会丢失一些数据,这是保持数据完整性的体现;另一方面,由于写入操作在多个分片副本上没有来得及全部执行,副分片需要同步成和主分片完全一致,这是数据副本一致性的体现。
HLee
2021/05/27
2.4K0
《Elasticsearch 源码解析与优化实战》第10章:索引恢复流程分析
基于Lockset的数据竞争检测方法汇总(四)
     今天讲的这篇文论中提到的Lockset方法同样也是和Happens-Before结合来进行动态数据竞争检测,这篇论文中使用的Happens-Before方法不是上一篇文章中提出的Djit+方法,而是使用Threadset方法,同时这篇论文提出的自适应检测方法能够在Threadset和Lockset自由切换,并且在检测共享对象的粒度上也是自适应的(这里的话不会提如何自适应的,将会在以后的文章中提到)。
chain
2018/06/05
4912
基于Happens-before的数据竞争方法汇总 (三)
在上一篇文章中提到了基于happens-before关系的FastTrack动态数据竞争检测方法,这篇文章中介绍的Loft方法是在FastTrack方法上进行了进一步地改进。
chain
2018/06/12
6350
Uber 如何实现 Go 代码中的动态数据竞争检测
作者 | Uber Engineering 译者 | Sambodhi 策划 | 赵钰莹 本文是 Uber 在 Go 代码中数据竞争经验两篇文章中的第一篇。详细版本将在 2022 年 ACM SIGPLAN 编程语言设计与实现(Programming Languages Design and Implementation,PLDI)中发表。在本文系列的第二部分,我们将介绍关于 Go 中竞争模式的学习。 Uber 已将 Go 作为主要编程语言,广泛用于开发微服务。我们的 Go 单体仓库由大约 5
深度学习与Python
2023/03/29
8420
Uber 如何实现 Go 代码中的动态数据竞争检测
动态数据竞争检测方法实验分析(二)
上一篇文章主要分析了各个检测方法在检测能力上的优劣。这篇文章主要分析一下各个检测方法对程序造成的影响以及可扩展性。
chain
2018/06/12
7190
构建动态数据竞争检测平台
之前的文章分别介绍了基于Lockset算法、基于happens-before关系以及基于两者混合的方法。对于这些方法,已有的一些论文中提到的有关实验对比可能都比较片面或是不太客观,因此实现这些方法做一个比较全面的实验对比分析是很有必要的,不仅可以对这些已有的方法有一个更深入的理解,同时也能够发现他们存在的一些共性问题,方便后续的研究。
chain
2018/06/12
7920
基于Lockset的数据竞争检测方法汇总(三)
        上一篇文章中我们看到了有关共享对象状态变迁在Eraser基础上进行的改进,但是改进的不是特别明显,下面这篇论文不是单纯的用Lockset作为数据竞争检测方法,而是采用的Djit+以及改进的Lockset方法结合来进行动态数据竞争检测。
chain
2018/06/05
4540
Go 运行时面试题
在 Go 语言中,goroutine 是一种非常轻量级的执行线程。goroutine 是 Go 语言并发模型的核心,允许同时执行多个函数调用。goroutines 在 Go 运行时环境中被多路复用到少量的操作系统(OS)线程上,以实现高效并发。
Lemon黄
2023/12/13
4150
Go 运行时面试题
面试最全面经总结
OSI 的 七层网络模型,主要有 物理层,数据链路层,网络层,传输层,会话层,表示层以及应用层;
Tim在路上
2020/08/05
5730
CMU 15-445 -- Timestamp Ordering Concurrency Control - 15
本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。
大忽悠爱学习
2023/10/11
2880
CMU 15-445 -- Timestamp Ordering Concurrency Control - 15
21.1 Java 多线程编程基础
进程: 一个正在执行的程序。每个进程执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。一个进程至少有一个线程。
acc8226
2022/05/17
3040
21.1 Java 多线程编程基础
一文打通java线程
是为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码,静态对象。
一个风轻云淡
2023/10/15
2630
一文打通java线程
Ad-hoc类型同步识别
尽管之前的我们提出的动态数据竞争验证和检测方法能够比较精确地找到数据竞争,但是该方法还是会存在一部分误检,误检主要就是由于ad-hoc类型的同步引起的,下图展示了两个例子。
chain
2018/06/12
1.2K0
你要的Java并发面试题都在这里,20000字答案解析
任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。
程序员追风
2019/07/31
4730
你要的Java并发面试题都在这里,20000字答案解析
相关推荐
动态数据竞争验证方法(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档