之前的文章分别介绍了基于Lockset算法、基于happens-before关系以及基于两者混合的方法。对于这些方法,已有的一些论文中提到的有关实验对比可能都比较片面或是不太客观,因此实现这些方法做一个比较全面的实验对比分析是很有必要的,不仅可以对这些已有的方法有一个更深入的理解,同时也能够发现他们存在的一些共性问题,方便后续的研究。
在实现之前文章提出的动态数据竞争检测方法之前,有以下几个人问题需要思考。
1. 如何动态监视程序的行为?
一般情况下都会采取插桩来进行对程序行为的监视,插桩又分为静态源码插桩,静态二进制插桩,动态二进制插桩等。静态插桩的话,会改变原始程序的结构,因此这里我们采取动态二进制插桩。比较经典的动态二进制插桩平台包括Intel Pin,DynamoRIO以及Valgrind。Pin的话由于其良好的兼容性,丰富的API接口使得其使用更加广泛。这里的话,我们使用Pin来帮助我们对程序进行动态二进制插桩,从而监视程序运行过程中的行为。
我们可以通过编写Pintool来实现我们自己想要的一些逻辑,通过API来从Pin中获取程序相关的信息。这里有关Pin以及如何编写Pintool将会在后面的文章中陆续介绍。
2. 动态监视程序的哪些行为?
对于之前文章中提到的动态数据竞争检测方法,我们可以发现的一个共同的特点就是这些方法都需要监视线程同步原语。
序号 函数名
1 pthread_mutex_lock
2 pthread_mutex_trylock
4 pthread_mutex_unlock
5 pthread_mutex_timedlock
6 pthread_rwlock_wrlock
7 pthread_rwlock_trywrlock
8 pthread_rwlock_rdlock
9 pthread_rwlock_tryrdlock
10 pthread_rwlock_unlock
11 pthread_cond_signal
12 pthread_cond_wait
13 pthread_cond_broadcast
14 pthread_barrier_wait
15 sem_post
16 sem_wait
17 pthread_create
18 pthread_join
同时还包括内存读写访问,动态内存申请等系统调用。
3. 如何构建动态数据竞争检测平台
对于上述提到需要动态插桩并且监视的读写指令或是Pthread库函数,系统库函数等,这些行为发生的时候,可以将这些行为以事件的形式发送到检测器中,检测器根据不同的检测算法执行相关的数据竞争检测。因此,我们以一种事件驱动模式来构建我们的动态数据竞争检测平台。
该平台有着非常良好的扩展性,基本的动态数据竞争检测器Detector包含公共的一些实现通过继承这个Detector就可以实现其他不同的动态数据竞争检测方法,为后续我们对这些数据竞争检测方法进行实验分析提供比较便利的途径。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。