限制无锁集合吗?


10

大卫·罗德里格斯(DavidRodríguez)-dribeas 在StackOverflow的评论中写道:“并非没有锁就可以实现所有集合”。我不确定这是否是正确的,而且我也找不到任何证据。

该语句不是很精确,但是让我尝试以一种更为正式的方式来重新表述:对于每种集合类型C,都有一个无锁集合类型CLF,它提供相同的操作集,并且在CLF上的每个操作都在哪里与上的相应操作具有相同的big-O复杂度C

顺便说一句,我不希望有一个转变。


1
作为非专家,我想知道是否可以严格定义“无锁”。
伊藤刚(Tsuyoshi Ito)

1
@Suresh:也许是“数据结构”的同义词?
伊藤刚(Tsuyoshi Ito)

2
如果您仅采用STM(软件事务性存储器)的无锁实现,并在此之上实现任何数据结构怎么办?
Jukka Suomela 2011年

5
@Tsuyoshi:我认为没有关于无锁的正式定义。非正式地,这意味着您不使用CPU的LOCK指令,因为它很慢,并且坚持使用比较快的比较和交换。由于可以使用比较交换来模拟LOCK,因此很难在“您本质上在这里使用Compare-swap来模拟锁定(或与此相关的事务)”与“哦,这是真正巧妙地使用了“比较和交换”功能,而且看起来完全像在模拟我们所知道的更高级别的操作。”
Radu GRIGore

1
据我了解,无锁在这里被理解为是非阻塞的。这不涉及CPU的LOCK指令,而是通过互斥体/信号量/等的线程调度程序。
MSalters 2011年

Answers:


11

由于我本人有些困惑,因此我先澄清问题中的一些概念。

集合。我认为没有理由花时间严格定义“集合”的含义,因为我们可以简单地询问一般情况下数据结构会发生什么。一种数据结构占据一块内存,并有一些操作可以访问该存储器以及可以由被调用的用户。这些用户可能是不同的处理器或只是不同的线程,这与我们无关。重要的是它们可以并行执行操作。

无锁Herlihy和Boss说,当崩溃的用户没有阻止进一步使用该数据结构时,该数据结构是无锁的。例如,假设有人在将节点插入排序集中的过程中将水倒在处理器上。好吧,如果其他处理器稍后尝试插入该排序集中,则它们应该会成功。(编辑:根据此定义,情况是,如果数据结构使用锁,则它不是无锁的,但情况并非如此,如果数据结构不使用锁,则它是无锁的。)

有了这些定义,我认为Herlihy和Boss基本上说答案是将关键地区转变为交易。

但是,您可能会问,这是否具有相同的复杂性?我不确定这个问题是否有意义。考虑一下push(x) { lock(); stack[size++] = x; unlock(); }。这是恒定时间的操作吗?如果您忽略锁定操作并因此忽略其他用户,则可以回答“是”。如果您不希望忽略其他用户,那么实际上没有办法说是否推送将在恒定时间内运行。如果您上一级查看某个特定算法如何使用堆栈,那么您也许可以说推入将始终花费恒定的时间(根据并行算法输入的当前值来衡量)。但这确实是算法的一个属性,因此说推入 恒定时间的操作没有意义的。

总之,如果您忽略执行某个操作的用户等待其他用户的数量,那么使用事务而不是关键区域肯定会回答您的问题。如果您不忽略等待时间,那么您需要查看如何使用数据结构。


我不太确定您是否可以真正认为上述push操作不是恒定时间操作。对于固定数量的处理器,并且该处理器的通用实现lock不会造成饥饿,上述操作(在最坏的情况下,对于任何给定的处理器都需要N_proc * O(1),它可以简单地假定为O(1)(隐藏的常量中包含的处理器数量)
大卫·罗德里格斯(DavidRodríguez)-dribeas 2011年

nf(n)f

好吧,内存访问是一种常见的情况。大多数算法分析都假定内存访问是O(1),与所使用的内存无关;真正的内存体系结构(带有缓存等)可以通过O(log N)更好地近似,其中N是使用的内存。
MSalters 2011年

尽管处理器数量是常数的假设是很实际的,但我会避免这种情况。然后的问题是,复杂性无法以一维的方式进行分析,因为问题的大小必然会在输入大小和处理器数量上都增加,而这两者都是正交维度。假设C ++标准库中有一个特定的容器(我显然是在挑一个硬容器),其中一项要求是所有元素都保存在连续的内存块中。
大卫·罗德里格斯(DavidRodríguez)-dribeas 2011年

现在,将元素添加到向量是一个摊销的恒定时间操作(如果它不适合先前分配的块,则调用将对容器中元素的数量花费线性时间,但是如果保留的内存块是根据指数序列获得的费用,摊销成本为常数)。如果实现了线程安全的容器,则将锁定然后执行更改,操作成本与锁定成本成正比,这我并不是很清楚...但是,首先可以大致考虑一下不变
大卫·罗德里格斯(DavidRodríguez)-dribeas 2011年

3

我认为“ COLLECTIONS”代表“队列,堆栈,链表,树……”

http://www.cl.cam.ac.uk/research/srg/netos/lock-free/

通过精心的设计和实现,可以构建可安全并发使用的数据结构,而无需管理锁或块线程。这些无阻塞的数据结构可以通过允许额外的并发来提高性能,并且可以避免由于本地设置中的优先级倒置或分布式系统中的机器和链接故障而引起的一些问题,从而提高鲁棒性。

关于非阻塞算法的最佳整体介绍是目前正在提交的无锁并行编程论文,其中涵盖了我们针对多字比较和交换,基于字的软件事务存储和基于对象的软件事务存储的设计。

如果“无锁”的意思是“不要使用操作系统的信号量,互斥体,监视器等”,那么我认为(但我不是专家)可以使用原子读写来使每个集合都无锁。修改硬件必须支持的原语。

O()

可以在网上找到有关该主题的详尽文档:

http://www.google.it/search?q=lock+free+algorithm+filetype%3Apdf

(...以及每个文档末尾的更多参考文献)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.