跳表与并行

Jun XU
3 min readFeb 26, 2015

--

跳表这个数据结构之前的时候听上交的钟乐提过,起初也没在意,就当做一个新的数据结构看了看。这次回家前不久的时候组会上,Ooi教授跟来访的另一位教授谈及跳表的并行价值,于是陡然产生了兴趣,于是就开始研读资料,想要搞明白原因,于是便有了此文。

什么是跳表,skip list?

搞明白跳表这个数据结构之后呢,我们注意到它可以用来模拟大多数的“树”,包括常用的平衡树。

什么样的数据结构是并发友好的呢?Concurrency-Friendly Data Structure?

这里面提到并发友好的数据结构需要具备两个特点:首先,它需要使得不同的线程可以同时访问它;其次,它需要尽可能的减少线程操作对其他线程的影响,这主要是因为修改数据的内容需要“广播”给所有的线程以确保正确性。举个例子,链表就可以很好的满足这连个条件,因为不同的线程可以访问它,且修改链表只会影响局部(如插入操作只会影响插入点前后两个点而已);而红黑树这一类的平衡树就不一样了,它当然可以让多个线程同时访问,但是修改红黑树的影响就大了,因为有个“重新平衡”的操作。

到此,为什么跳表有助于并行就可以有个直观的概念了。

这时候看看这篇文章,介绍为什么要在MemSQL中使用跳表建立索引。

这里面有两个概念我想记录一下:数据存在内存而不是磁盘意味着它可以直接用指针寻址,而不必使用“间接”索引(通常这种间接索引为了照顾效率是在页这个层面执行的,也就是说为了一个数据很可能会将其所在的整个页的数据,从磁盘加载进来内存);lock-free确保线程越多运行越快,也就是多增加一个线程总是会带来收益的。至于什么是lock-free,看看下方这个图吧。该图来自于这里

好了,大概就这么多了,至于细节就先不研究了,工作中具体用到了再说,这里只要有个知识面在这里就可以了。

--

--