Happens-before方法中最基础的方法Djit+,Djit+使用向量时钟VC进行数据竞争分析。下面这篇文章介绍的是FastTrack算法,在Djit+基础上进行的改进,将Djit+的时间复杂度从O(n)降到接近于O(1)。首次看的同学还是建议先看我之前写的有关介绍Djit+的相关基础内容。
Reference
Djit+方法每次进行数据竞争分析,都会遍历历史读VC或是历史写VC,这个过程的复杂度是O(n)的,FastTrack(FT)正是在这个点上进行了算法的改进。首先需要明确的一点就是,在一个没有数据竞争的程序中,每一次的写都是有明确先后顺序的;读就不一样,不一定要是顺序读,也可以是并发的。因此的话,对于每一个共享内存单元来说,我们不必像Djit+中那样保存一个历史写VC。保存一个历史写VC无非就是想找到所有竞争的写操作,但是其中有些已经早就被检测出来了,但是线程对应的entry还是存在于VC中,造成时间和空间上的冗余。因此,对于写历史,我们不保留VC,二是直接保留最近访问的线程时间戳就行,也就是epoch形式(timestamp@thread),这样的话,每次进行数据竞争分析的时候,就不需要像Djit+那样进行VC的遍历,而是常量级别的比较。具体来说:
论文中给出的例子:
其中C0表示第一个线程的VC,C1表示的是第二个线程的VC,Lm表示的是锁m上的VC,Wx表示就是epoch形式的逻辑时钟。我们可以很直观的看出Wx变化以及两个线程VC的变化以及锁m上的VC的变化。
这个例子详细的说明了Wx的epoch变化以及Rx在epoch和VC之间转换的变化的情景。
从上面的两个例子也可以发现,我们只是针对共享内存单元使用了epoch形式的逻辑时钟,但是对于同步对象,我们依然要保留VC形式的逻辑时钟,毕竟线程之间通过同步对象来进行VC的合并。根据论文中的调查,程序中96.8%的操作都是读写操作,剩下很少一部分是同步操作,因此尽管我们在同步对象上保留了VC形式的时钟,但是从整体上来说,时间复杂度接近于O(1),对比Djit+算法,复杂度是大大降低了。
不知道看完FastTrack,大家是否能够更深入的理解这么设计的道理,以及和Djit+之间的本质区别,好好体会一下的话,应该是不难的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。