基于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+
到此为止的话,基本的动态数据竞争检测相关的方法都已经介绍完毕,想要详细了解的同学可以参考这些论文。
后序将介绍对之前介绍的动态数据竞争检测方法进行的实验测评。
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的基础上,继续精简,使用布尔变量来表示共享内存访问是否有锁保护。到此为止的话,基本的动态数据竞争检测相关的方法都已经介绍完毕,想要详细了解的同学可以参考这些论文。
后序将介绍对之前介绍的动态数据竞争检测方法进行的实验测评。
相关文章推荐
- Dapper-据说stackoverflow使用的orm
- android photoview 图片放大缩放功能 ImageView
- Android 关于inflate
- CocoaPods安装及错误问题
- 基于OpenGL的Android系统视频转换功能实现
- IOS在View上面调用push或者present方法。
- 2 微信开发者中心
- Android—简单的仿QQ聊天界面
- iOS -- CALayer之简单的使用
- Android 开发资源整合
- 讯飞语音听写开发入门之获取appid号
- Android高德地图使用
- 沉浸式状态栏颜色设置,对android4.4~6.0的总结
- Android 设置系统的返回键 和软键盘获取焦点问题
- iOS中获取系统通信录信息
- android TV盒子开发心得(一)
- iOS开发常用的小功能(持续更新)
- Ios中手势点击事件和tableView点击事件冲突
- android开发环境配置
- QuartzCore框架-- iOS中的动画