您的位置:首页 > 移动开发

基于Lockset和Happens-before的数据竞争方法汇总

2016-06-02 16:58 459 查看
之前的文章介绍都是单独使用lockset或是单独使用happens-before关系进行动态数据竞争检测的方法。单纯使用lockset算法,由于不考虑其他的一些同步原语,会导致很多的误报,但是该方法对线程交错不太敏感。单纯使用happens-before关系,该方法对线程交错比较敏感,因此会导致出现很多漏报。因此结合lockset算法和happens-before关系的混合(hybrid)算法由此而生。

Hybrid混合算法的思想主要有两种:

首先利用happens-before关系找到所有潜在的并发的访问,然后利用lockset算法验证这些并发访问是否受到公共的锁集保护。

首先利用lockset算法找到不受公共锁保护的潜在的并发访问,然后利用happens-before关系推导哪些访问之间没有确定性先后关系。

这篇文章中主要介绍的是第一种混合算法,主要相关的方法包括如下:

Helgrind+

ThreadSanitizer

Acculock

MultiLock-HB

SimpleLock

SimpleLock+

Helgind+

Helgrind+中提出了一种线程段(thread segment)用来分割一个线程的执行序列。通过线程段来进行happens-before关系的推导。同时结合lockset算法中的共享内存状态机在某些状态下判断是否构成数据竞争。该方法中每个共享内存单元只只能够保留最近的一个线程段,并且该方法中涉及到大量的状态 切换。



ThreadSanitizer

ThreadSanitizer中同样也是使用线程段这个概念来分割一个线程的执行序列。和Hengrind+不同的是,该方法通过分析happens-before关系来保存所所有潜在的并发写segment集合,以及保存所有潜在的并发读segment集合并且在任意写segment之后发生。然后通过锁集算法验证是否并发的两个segment有公共的锁集保护其中至少一个是写segment。



Acculock

Acculock中使用FastTrack中提到的基于epoch的轻量级逻辑时钟来进行happens-before分析,同时对解锁操作增加时间戳,根据锁集的时间戳来去掉一些冗余的分析。由于该方法中使用保留的都是共享内存最后一次的读和写相关的epoch和锁集,因此混存在一定的误报和漏报。



MultiLock-HB

MultiLock-HB方法是在Acculock方法上的改进,主要针对Acculock中固有的缺陷,因此采用类似ThreadSanitizer中保留一定长度的完整的历史读写访问信息,包括锁集和epoch,同时根据锁集的集合的包含关系,去掉一些冗余的分析。



SimpleLock

SimpleLock方法使用的假设是程序中一般不会发生使用两个不同锁的情况,一般都是由于没有加锁或是少加锁。因此该方法中不需要使用锁集来进行分析,而是直接统计共享内存有多少个锁保护。

SimpleLock+

SimpleLock+方法在SimpleLock的基础上,继续精简,使用布尔变量来表示共享内存访问是否有锁保护。

到此为止的话,基本的动态数据竞争检测相关的方法都已经介绍完毕,想要详细了解的同学可以参考这些论文。

后序将介绍对之前介绍的动态数据竞争检测方法进行的实验测评。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: