我只看一点点关于这个主题,但它似乎是唯一的好处是让周围的竞争问题,但它不会有任何重要影响的僵局的问题为代码锁免费是如此之小和基本(fifo、lifos,hash),从来没有的僵局问题。

因此,它是所有关于性的-是这个吗?

有帮助吗?

解决方案

锁定自由编程是(据我可以看到)总是关于性能,否则使用锁是在大多数情况下要简单得多,因此优选。

不过请注意,与无锁编程,你可以为这样的活锁,这是一个困难得多,因为没有工具来诊断,我知道都是为了诊断它(虽然我可能是错在那里)交易僵局。

我说,只有往下走,如果你有到无锁的路径;也就是说,你有,你有一个严重争锁是伤害你的表现的场景。 (如果它没有坏,不修)。

其他提示

几个问题。

我们将很快面临的桌面系统与64、128和256个核心。Parallism在这一领域是不同于我们目前的经验,2,4,8个核;的算法,它成功运行,在这种小型系统就会运行 在高度平行的系统,由于竞争。

在这个意义上讲,无锁是重要的,因为它是有助于强烈,以解决可伸缩性。

还有一些非常具体的领域里无锁是非常方便,例如Windows的核心,那里有种模式执行在那里睡觉的任何种类(例如等待),都是被禁止的,这显然是非常限制性方面的数据结构,但是,在锁定的免费提供了一个很好的解决方案。

还有,锁定的免费数据的结构往往不具备的故障模式;他们无法实际失败,在基于锁定数据结构可以当然无法获得他们锁。不必担心失败简化了代码。

我已经写了一个图书馆的免费数据的结构,我会被释放。我认为,如果开发人员可以获得保持的一个良好的证明API,那么他就可以使用它-不要紧,如果它无锁或不,他不需要担心的复杂性,在潜在的实施-这就是要走的路。

这也是有关的可扩展性。为了获得性能提升,这些天,你必须parallelise你在工作中的问题,所以你可以在多个内核扩展他们 - 越多,越多越好

这样做的传统方式是通过锁定需要并行访问,但更多的线程可以运行真正并行数据结构中,更大的瓶颈这成为

所以,是的,它是关于性能...

有关抢占式线程,线程悬浮在保持一个锁可以阻止否则会使得向前进行线程。无锁不存在这样的问题,因为由赫利希的定义,一些其他线程总能向前进步。

对于非抢占式线程,它不管那么多了,因为即使基于自旋锁的解决方案,通过赫利希的定义是无锁的。

这是关于表演的-但也对能力采取多线程载荷:

  • 授予一个 独家访问的一部分代码:虽然一线已经锁,其他线纺(循环,同时试图获取锁)或阻止的,睡眠,直到的锁被释放(通常发生,如果纺持续太长);

  • 原子 操作授予一个 独享的资源 (通常是一种字型变或指针)通过使用不间断的内在CPU说明。

如锁阻止其他线'的执行,一个节目慢了下来。作为原子操作的执行串(之一),没有阻塞*.

(*)只要数量的 并发Cpu 试图访问的同样资源不创造一个瓶颈-但我们没有足够的CPU核尚未看到这样一个问题。

我曾就此事编写一个 等待-免费的 (锁定无需等待国)键值储存服务器我的工作。

库,如东京内阁(甚至TC-固定的,一个简单的阵列)的依赖锁,以保护的一个数据库:

"而编写线操作的数据库,其他线阅读和书写线被阻止" (东京内阁的文件)

的测试的结果无并发(一线测试):

SQLite   time: 56.4 ms (a B-tree)
TC       time: 10.7 ms (a hash table)
TC-FIXED time:  1.3 ms (an array)
G-WAN KV time:  0.4 ms (something new which works, but I am not sure a name is needed)

发(多线程的写作和阅读中相同的数据库),只有G-WAN KV幸存下来的相同的考试,因为(通过与其他人)它永远不会块。

所以,是的,这KV储存,使它更容易developpers使用它,因为他们不必关心线的问题。让它以这种方式工作是不是微不足道。

我相信我看到一篇文章,从数学上证明,任何算法可以在等待自由的方式被写入(这基本上意味着你可以放心,每个线程总是正在朝着这一目标取得进展的)。这意味着,它可以适用于任何大型的应用程序(毕竟,一个程序就是用很多很多参数的算法),也因为等待免费的保证,无论是死/活锁内它发生(只要它不”吨有哪些妨碍它被真正等待免费的)错误,它简化了程序的那一侧。在另一方面,数学证明是从实际执行的代码本身相去甚远(据我所知,竟然没有一个完全链接列表,可以在PC上运行的无锁的,我见过那些覆盖大部分地区,但它们通常或者不能处理某些常用功能,或某些功能需要被锁定的结构)。

在一个侧面说明,我还发现了另一种证明,表明任何无锁的算法实际上可以认为是无等待,由于概率以及其他各种因素的法律。

  1. 可扩展性 是一个非常重要的问题在有效的多/manicore编程。最大的限制因素实际上是代码部分,应该是执行在序(见 阿姆达尔定律).然而,竞争上锁也是很成问题。

  2. 锁定算法解决的可扩展性问题,其遗产锁。所以,我可以说无锁主要是为了 性能, ,而不是减少可能的僵局。

  3. 然而,牢记,目前的x86构、写作 一般 锁的算法 不可能的.这是因为我们不能自动交换意大小的数据在当前x86(也适用于其他体系结构,除了太阳的岩石)。因此,目前锁的免费数据的结构是非常有限和非常专用于特定用途。

  4. 我认为目前的锁定的免费数据的结构不会使用了在十年。我强烈期望硬件协助的一般锁的免费机构(是的,这是事务性的存储器,TM)将实现在十年。如果任何种类的TM是实现,虽然它不能完全解决的问题锁,许多问题(包括优先翻和僵局)将被消除。然而,执行TM在硬件仍然是非常具有挑战性的,并且在x86,只有 草案 只是已经提出了建议。

它仍然太长:2句摘要。

锁定的免费数据的结构不能锁定-基于多编程(即使是TM不是。如果你真的需要的可伸缩性和有麻烦上锁竞争,然后再考虑锁的免费数据的结构。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top