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

并行化的动态数据竞争验证和检测方法

原创
作者头像
chain
修改于 2018-06-12 14:42:17
修改于 2018-06-12 14:42:17
9610
举报

之前系列提到的动态数据竞争验证和检测方法是结合了验证和检测两部分。这篇文章主要介绍一下并行化的动态数据竞争验证和检测方法。

首先我们来谈谈有关利用Pin编写Pintool来检测数据竞争。由于动态二进制插桩就是在原始程序指令前后加入跳转指令,而跳转的目的地就是所谓的分析函数,分析函数中包含了相关的检测逻辑。因此,从这个角度也能发现,我们变现的分析函数和应用程序线程是绑定在一起的。由于应用程序许本身是多线程的程序,因此我们自己编写的Pintool也是多线程的。数据竞争检测用到的相关公共的数据结构包括向量时钟以及锁集等都有可能被多线程访问。为了保证一致性,我们在分析函数中都会加入锁来保护共享的访问操作,并且大部分的操作都可能会涉及到锁保护,尤其是针对读写指令的分析函数中会涉及到比较复杂的验证过程和检测过程分析。因此,频繁使用加锁可能会导致程序在执行过程中不能够有效利用多核的硬件优势。

最近有一篇文章提到了一种并行化的动态数据竞争检测方法。这种方法扩展性非常好而且不用修改之前已经提出的动态数据竞争检测方法,如下图所示。

并行数据竞争检测方法
并行数据竞争检测方法

该方法的核心就是将动态数据竞争检测逻辑从分析函数中分离出来,让单独的检测线程执行相关的逻辑,检测线程之间相互不干扰,因此就不用再使用锁来保护。这里对共享内存空间进行分块,不同的块映射到不同的检测线程上。而原始的应用程序线程则是将程序的行为以事件的形式发送到队列中,对于内存读写事件先缓存到线程TLS中,当缓存慢了之后再发送到队列中,而其他事件则是复制并且发送到各个检测线程队列中。这样的话,唯一需要加锁保护就是针对事件队列的相关访问。

同时我们也能够证明,每个检测线程看到的都是完整程序执行的行为,除了访问的内存块有所不同。

  • 如果两个有明确先后关系的访问,来自不同的线程并且访问相同的共享内存空间,那么针对每一个共享内存块的访问的事件都会被发送到同一个检测线程中,并且发送的顺序也是有先后顺序的。
  • 如果两个访问没有明确的先后关系,那么这两个访问事件被发送到队列时谁在前面和谁在后面都无所谓。

上述方法提出时主要利用FastTrack来进行实验对比分析,我们实现该方法后发现能够应用在基于Lockset算法、基于Happens-before以及基于hybrid上的动态数据竞争检测工具上。之前文章中提到的动态数据竞争检测方法我们全部实验了一下,发现并发的动态数据竞争检测方法和原始的动态数据竞争检测方法检测结果一致。

在该方法的启发下,我们又对之前我们提出的动态数据竞争验证和检测方法进行了并行化的处理,方法框架如下图所示:

并行数据竞争验证检测框架
并行数据竞争验证检测框架

Application Threads

应用线程中我们同样也是在分析函数中进行相关读写内存事件的分发,而其他同步时间则是继续在原始应用线程中处理。

当应用线程处理非读写内存事件时,之前的方法中我们都是用共享的内存结果保存同步对象信息、向量时钟信息以及锁集锁集信息,而这里我们将会把每个线程相关的信息都保存在自己的TLS中。

当应用线程处理读写内存事件时,分析函数中会将这些事件发送到验证线程队列中,而应用线程随即就被延时阻塞中止执行。

Verification Thread

验证线程主要的作用就是从队列中获取验证请求事件,即应用线程中的读写内存事件,然后处理相关的验证逻辑,和之前的访问类似。

我们只选择了一个验证线程用来处理所有的验证请求,主要是由于验证线程需要和应用线程和检测线程互相沟通,为确保一致性,只是用一个验证线程。验证线程每处理一个验证请求之后,都会根据处理的结果看是否需要唤醒相关的应用线程。同时会根据不同的共享内存块,分发检测请求到不同的检测线程队列中。

Detection Threads

这里检测线程做的工作就是从检测队列中读取检测请求,然后寻找被验证过程中遗漏的数据竞争。

由于验证线程和应用线程是并发进行的,因此验证请求也有可能在验证线程执行过程中失效,一旦请求失效,那么该验证请求就不会再被处理。同时,为了减少向量时钟以及锁集的副本,我们构造的验证请求和检测请求都只包含一个相关的副本以及若干个引用。

我们的并行数据竞争验证和检测方法在充分利用硬件的条件下,每个线程都将会负责好自己的职责。

后序将会介绍ad-hoc类型同步相关的分析。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文搞懂程序、进程、线程、并发、并行、高并发的概念
。在计算机领域,程序通常以特定的编程语言编写,并被编译或解释成计算机可以执行的形式。程序可以是简单的脚本,也可以是复杂的应用程序,用于执行各种计算、处理数据、管理系统资源、或者执行其他特定的任务。程序是计算机软件的基本组成部分之一,它使计算机能够进行各种有用的操作和任务。
Lion 莱恩呀
2025/05/08
2210
一文搞懂程序、进程、线程、并发、并行、高并发的概念
基于Happens-before的数据竞争方法汇总 (三)
在上一篇文章中提到了基于happens-before关系的FastTrack动态数据竞争检测方法,这篇文章中介绍的Loft方法是在FastTrack方法上进行了进一步地改进。
chain
2018/06/12
6360
基于Lockset的数据竞争检测方法汇总(四)
     今天讲的这篇文论中提到的Lockset方法同样也是和Happens-Before结合来进行动态数据竞争检测,这篇论文中使用的Happens-Before方法不是上一篇文章中提出的Djit+方法,而是使用Threadset方法,同时这篇论文提出的自适应检测方法能够在Threadset和Lockset自由切换,并且在检测共享对象的粒度上也是自适应的(这里的话不会提如何自适应的,将会在以后的文章中提到)。
chain
2018/06/05
4922
基于Lockset和Happens-before的数据竞争方法汇总
之前的文章介绍都是单独使用lockset或是单独使用happens-before关系进行动态数据竞争检测的方法。单纯使用lockset算法,由于不考虑其他的一些同步原语,会导致很多的误报,但是该方法对线程交错不太敏感。单纯使用happens-before关系,该方法对线程交错比较敏感,因此会导致出现很多漏报。因此结合lockset算法和happens-before关系的混合(hybrid)算法由此而生。
chain
2018/06/05
9870
构建动态数据竞争检测平台
之前的文章分别介绍了基于Lockset算法、基于happens-before关系以及基于两者混合的方法。对于这些方法,已有的一些论文中提到的有关实验对比可能都比较片面或是不太客观,因此实现这些方法做一个比较全面的实验对比分析是很有必要的,不仅可以对这些已有的方法有一个更深入的理解,同时也能够发现他们存在的一些共性问题,方便后续的研究。
chain
2018/06/12
7970
基于Lockset的数据竞争检测方法汇总(一)
对于搞数据竞争检测方向的人来说,Lockset方法大家肯定不陌生,作为一个刚入门数据竞争检测方向的我来说,就和大家总结一下我近期有关Lockset方法的一些研究和心得。
chain
2018/06/05
1.5K3
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
8430
Uber 如何实现 Go 代码中的动态数据竞争检测
动态数据竞争验证方法(一)
动态数据竞争检测算法可以在不知道程序中是否存在数据竞争前提下执行,而动态数据竞争验证方法则是在知道程序中可能存在的数据竞争前提下,对这部分可疑的数据竞争进行验证,看这些数据竞争是否真的发生,同时也可以验证这些数据竞争是否对程序造成有害的影响。
chain
2018/06/12
7750
动态数据竞争检测方法实验分析(一)
之前的文章大致介绍了一下我们的动态数据竞争检测平台如何构建,这篇文章主要是在动态数据竞争检测平台上实现了之前介绍的数据竞争检测方法,我们扩展了其中的一些方法使得这些方法能够识别所有的Pthread库中的同步原语。
chain
2018/06/12
1.2K0
动态数据竞争验证方法(二)
之前提到的动态数据竞争验证方法尽管相比RaceFuzzer提高了验证的效率,但是仍然存在一个比较致命的问题就是执行程序一次只能够验证很少的一部分数据竞争。
chain
2018/06/12
4890
基于Lockset的数据竞争检测方法汇总(三)
        上一篇文章中我们看到了有关共享对象状态变迁在Eraser基础上进行的改进,但是改进的不是特别明显,下面这篇论文不是单纯的用Lockset作为数据竞争检测方法,而是采用的Djit+以及改进的Lockset方法结合来进行动态数据竞争检测。
chain
2018/06/05
4540
动态数据竞争检测方法实验分析(二)
上一篇文章主要分析了各个检测方法在检测能力上的优劣。这篇文章主要分析一下各个检测方法对程序造成的影响以及可扩展性。
chain
2018/06/12
7190
Actor模型
传统的游戏服务器要么是单线程要么是多线程,过去几十年里CPU一直遵循摩尔定律发展,带来的结果是单核频率越来越高。而近几年摩尔定义在CPU上已然失效,为什么呢?
spilledyear
2022/05/13
8930
Actor模型
基于Happens-before的数据竞争方法汇总 (二)
Happens-before方法中最基础的方法Djit+,Djit+使用向量时钟VC进行数据竞争分析。下面这篇文章介绍的是FastTrack算法,在Djit+基础上进行的改进,将Djit+的时间复杂度从O(n)降到接近于O(1)。首次看的同学还是建议先看我之前写的有关介绍Djit+的相关基础内容。
chain
2018/06/12
7080
基于Lockset的数据竞争检测方法汇总(二)
前一篇文章提到的是使用Lockset最经典的方法,但是存在很多误报,针对这些误报产生的原因,有很多分析并改进了原始的Lockset方法,今天主要和大家谈的就是有关Lockset中状态ownership transition的一种改进。
chain
2018/06/05
6580
服务端开发必备:9大性能优化秘技
笔者最近对负责项目做了一些服务性能优化的工作,主要优化了项目中的一些不合理设计,例如:服务间使用 json 传输数据;监控上报处理逻辑在主流程中;重复数据每次都请求下游服务;多个耗时操作串行请求等。取得了 A 服务平均耗时跟 p99 耗时均下降 80% 、事件底层服务平均耗时下降 50% 的业务收益。 本文总结了在服务架构设计时,提升服务性能的 9 大常用办法,相信可以有效帮到你的日常工作。期待你的点赞转发收藏一键三连!
腾讯云开发者
2024/08/06
8700
服务端开发必备:9大性能优化秘技
腾讯云 Elasticsearch 新篇章 - 存算分离+读写分离+查询/IO并行化, 助力日志/搜索领域降本增效
在海量数据的背景下,数据的写入、存储、分析、搜索都会遇到不小的挑战(存储成本大,写入查询慢等),Elasticsearch技术栈一直是日志、安全、搜索的首选。随着数据规模的海量增长,降本增效的诉求也越来越高。本次分享将解析腾讯云全新技术栈下的系统架构,基于腾讯云ES自研存算分离、读写分离、查询/IO并行化等一套完整的降本增效解决方案。主要内容包括:
腾讯QQ大数据
2023/10/28
9780
腾讯云 Elasticsearch 新篇章 - 存算分离+读写分离+查询/IO并行化, 助力日志/搜索领域降本增效
【地铁上的面试题】--基础部分--操作系统--程同步与通信
进程同步和通信是操作系统中的关键概念,它们在多进程或多线程环境中起着至关重要的作用。进程同步是指多个进程或线程之间按照一定的顺序执行,以避免竞争条件和不一致的结果。而进程通信则是指进程之间交换信息和共享资源的机制,使它们能够相互协作和协调工作。 进程同步和通信的重要性体现在以下几个方面:关面试中的应对能力和问题解决能力。
喵叔
2023/07/21
3000
轻松搞定云下虚拟化网络流量
虚拟交换机是在虚拟化场景下提供报文交换的虚拟网络设备,它可以提供像物理交换机一样的报文交换及流量镜像功能。在虚拟化环境下,需要同时支持IDS和IPS时,这种旁路的流量镜像的方式则无法达到要求。因此,该发明方法用来解决非旁路(阻断式)处理虚拟交换机报文的问题,该方法可以完成对进入虚拟交换机的报文进行劫持,支持分析模块多线程并行处理报文,并支持再次送回虚拟交换机继续交换流程,或直接将报文丢弃,达到阻断网络通信的目的。
thomasCH
2020/03/03
1.5K0
轻松搞定云下虚拟化网络流量
Polardb 核心存储 polarfs 是怎么进行数据存储的之核心构造(4)--译
关于POLARDB 的数据存储部分的论文翻译还在继续,此为第四部分,与IO 的实现有关_________________________________________________________________
AustinDatabases
2022/12/13
7790
Polardb 核心存储 polarfs 是怎么进行数据存储的之核心构造(4)--译
推荐阅读
相关推荐
一文搞懂程序、进程、线程、并发、并行、高并发的概念
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档