无等待是不够的

原文地址译文链接,译者:许巧辉,校对:周可人

无等待是不够的

以目前针对演进条件(progress condition,注:参考[1])的算法和数据结构的分类来看,是不足以区分不同演进条件的能力和每一个演进条件的性能/延迟。

我们提出了一种新的“大O”记号来表示无等待的算法和数据结构。下面是它的工作原理:

一个算法或功能被称为“Wait-Free O(x)“,表示需要最多O(x)操作完成。

一些示例:

  • a)”Wait-Free O(NThreads)“表示:一个算法,扫描每个活动线程的状态
  • b)”Wait-Free O(ln NThreads)“表示:一个算法,需要自身插入到活动的线程(使用二分法)的排序列表
  • c)”Wait-Free O(NThreads^2)“表示:一个算法,扫描活动线程的每个状态平方次数
  • d)”Wait-Free O(1)“表示:一个算法,做3次操作,不论活动线程和其他变量数目
  • e)”Wait-Free O(N)“表示:一个算法,获取确定数值N,比如一个数列当前元素的数量N,并且做了O(N)操作
  • f)”Wait-Free O(N^2)“表示:一个算法,获取确定数值N,并且做了O(N^2)操作

根据当前表示法,示例a)、b)和c)都是”Wait-Free Bounded”,但示例b)显然比c)或a)更好。

根据当前表示法,示例d)、e)和f)都是”Wait-Free Population Oblivious”,崦示例d)显然比e)或f)更好

也许更有意思的是,示例b)可能比示例f)更好。特别地,如果N > NThreads,即使b)是”Bounded”而f)是”Population Oblivious”,它只是用来显示”Wait-Free Population Oblivious”未必比”Wait-Free Bounded”更好。

无锁如何?

那么,在这个新的表示法中,无锁也可以写成”Wait-Free O(infinity)”形式,但要注意的是,尽管所有的无锁算法都有一个最坏情况O(infinity),它们大多数都有一个预计的操作数O(1)或O(N),并且不依赖于线程的数量。

再比方说:

一个链表,对于contains()方法是无等待(Wait-Free)的,但这永远不会比”Wait-Free O(N_elements)”更好(N_elements是在某个时刻contains()操作时,链表中元素的数量)

匹配新旧之间的分类:

  • Wait-Free Bounded:O(ln NThreads), O(NThreads), O(NThreads^2),  …
  • Wait-Free Population Oblivious:O(1), O(ln N), O(N), O(N^2), …

在我们自己的数据结构中,我们正试图遵循这一惯例,并指出每个函数的演进条件的顺序是什么。

http://sourceforge.net/projects/ccfreaks/files/

时间: 2024-09-04 12:20:42

无等待是不够的的相关文章

为什么无等待如此重要

原文地址 ,译文链接,译者:张军,校对:梁海舰 无锁(完全同步) 想象一下,一个无锁算法或数据结构有一个方法,这个方法所有执行过程都需要同步.假设在单线程模式下这个方法每次调用需要10ns,而每增加一个线程调用这个方法,将在同步状态(变量)上产生争用. 很显然,如果只有一个线程,每次调用该方法到返回平均时间都为10ns,我们称之为:每10ns完成的任务数:如果你增加更多的线程,他们将会增加其他线程执行完成的时间,这是因为同一时刻只有一个线程能获得锁: 记住,无锁(Lock-Free)保证一个线程

无锁和无等待的定义和例子

原文链接,译文连接,译者:周可人,校对:梁海舰 在查阅google之后,我发现没有一处对并发算法或是数据结构规定的演进条件(progress condition,注:参考[1],译者认为翻译为演进状态更为合适)做合理的解释.甚至在"The Art of Multiprocessor Programming"中也只有围绕书本的一小段定义,大部分定义是单行的句子,因而造成了我们普通人含义模糊的理解,所以在这里我把我对这些概念的理解整理在一起,并且在每一种概念后面给出相应的例子. 我们先将演

无锁并发和无等待并发的对比分析

原文地址:作者:rethinkdb  译者:sooerr 校对:方腾飞 有两种非阻塞线程同步算法,即无锁和无等待,这两种算法经常会产生混淆. 在无锁系统中,当任何特定的运算被阻塞的时候,所有CPU可以继续处理其他的运算.换种方式说,在无锁系统中,当给定线程被其他线程阻塞的时候,所有CPU可以不停的继续处理其他工作.无锁算法大大增加系统整体的吞吐量,因为它只偶尔会增加一定的交易延迟.大部分高端数据库系统是基于无锁算法而构造的,以满足不同级别. 相反,无等待算法保证了所有CPU在连续处理有效工作的时

【翻译】软文:ZooKeeper:无等待的互联网扩容协调系统

翻译自:Paper: ZooKeeper: Wait-Free Coordination For Internet-Scale Systems 你依然需要自己滚动么?ZooKeeper: Wait-free coordination for Internet-scale systems: 在这篇文章里,我描述ZooKeeper,一个协调分布式系统进程的服务.当ZooKeeper是临界基础设施的一部分,ZooKeeper目标在客户端提供一个简单高效的内核建立一个更复杂的协调原语.它包含群信息的基础

如何实现115网盘看视频无等待

  工具/原料 火狐浏览器; 云共撸软件; 火狐浏览器安装greasemonkey插件 1首先需要在计算机上安装火狐浏览器(如果希望快速安装可以下载火狐浏览器离线安装包进行安装),安装完成后启动火狐浏览器,在火狐浏览器右上角处单击"菜单"按钮,在打开的下拉菜单中选择"附件组件",在打开的附件组件页面的搜索框中输入"greasemonkey"(该插件也称为油猴子),在搜索结果中选择greasemonkey3.0单击"安装"; 2

无锁并不像人们所说的那么好

原文链接,译文连接,译者:梁海舰,校对:李任 注意,我将在这篇文章中说一些关于"无锁"和"无等待"算法的坏话.在我们开始之前,让我来问你一个问题: 你之前有过需要无锁算法来解决问题吗?为什么必须使用无锁算法来解决? 这是一个意味深长的问题,在某种意义上,我们尝试区分哪些问题需要"无锁"或者受益于"无锁"提供的保证,哪些问题使用阻塞解决方案就已经足够了.那么,什么样的问题可以利用无锁算法解决呢? 你会说高竞争下的扩展性?是的,听

Java并发中正确使用volatile

作者:一粟   整理和翻译自Twitter实时搜索的PPT 前几天并发编程群里有同学对volatile的用法提出了疑问,刚好我记得Twitter有关实时搜索的这个PPT对这个问题解释的很清晰并有一个实际的应用场景,于是周末把这个问题摘录了一些和并发相关的内容如下: 并发 – 定义 悲观锁 – Pressimistic locking 一个线性在执行一个操作时持有对一个资源的独占锁.(互斥) 一般用在冲突比较可能发生的场景下 乐观锁 – Optimistic locking 尝试采用原子操作,而不

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失

从零开始学.net多线程系列(三)——同步

本文将涉及如下内容 Wait Handles EventWaitHandle Seamphores Mutex Critical Sections Miscellaneous Objects 这篇文章重点说明多个不同的线程之间的同步问题. WaitHandles 首先,我们必须认识到,当你尝试着理解怎么才能使多个线程在一起协调地很好,最关键的问题是怎样排序这些操作.例如,我们有如下的这些问题: 1. 我们需要创建一个订单 2. 我们需要保存订单,但是除非我们获得了订单号,否则我们无法进行保存操作