原文链接,译文链接,译者:俞升兵,校对:周可人

1.1.1 性能

一个运行在P个处理上的应用程序的加速度是它在单个处理器上的执行时间和在P个处理器的执行时间的比值。这是一种评价应用程序对于机器资源利用程度的衡量。理想情况下,我们想要的结果是线性加速度:当我们使用P个处理器的时候,我们希望可以获得P的加速度(译者注:例如一个应用程序在单处理器的执行时间是10秒,那么在双处理的执行时间理想情况下是5秒)。加速度随着P一起增加的数据结构我们称之为可扩展的数据结构。在设计可扩展的数据结构的时候,我们必须注意:为了同步使用简单的方法会严重破坏扩展性。

回到基于锁的计数器,我们会发现锁会带来顺序性的瓶颈:在任何时间点,最多只有一个fetch-and-inc操作是有用的,例如:递增变量X。这种顺序性的瓶颈会对本来能够到达的加速度造成令人惊讶的影响。顺序执行部分代码对性能带来的影响已经在基于Amdahl’s law的一个简单公式中阐明了。假设b是一个程序中顺序性瓶颈所占的百分比。假设在单处理器中运行这个程序需要1个时间单位,那么在P个处理器的环境中,执行顺序运行部分的代码需要b个时间单位,同时在最好的情况下,并发部分的代码消耗(1-b)/p个时间单位,那么加速度最多等于 1/(b+(1-b)/p) 。这意味中如果程序中只有10%是属于顺序性瓶颈的部分,那么在一个10个处理器的环境中,程序能达到的加速度最多只有5.3:我们的应用只利用了机器的一半性能。减少顺序性执行代码块的数量和长度对性能是至关重要的。在基于锁的上下文中,这意味着减少申请锁的次数,降低锁的粒度:一种用来表示在持有锁时,执行指令数目的衡量。

我们的简单计数器实现碰到的第二个问题是内存竞争:这是底层硬件为了多线程并发尝试访问相同的内存地址所造成的流量的开销。只有当你理解普通的共享内存多处理器架构一些方面,你才能意识到内存竞争。如果保护着我们计数器的锁就像很多简单锁一样,是使用单一地址实现的话,那么为了请求锁,线程必须重复尝试修改这个地址。以缓存一致性多处理器为例,包含着锁的cache line的独占所有权必须重复的从一个处理器传输到别的处理器上,这会导致每次尝试修改内存地址的操作都需要长时间的等待,失败的尝试获取锁的操作会进一步加重相应的内存流量。在1.1.7中我们会讨论针对不同类型的共享内存架构实现相应的锁,避免类似这样的问题.

基于锁的实现的计数器的第三个问题是:当持有锁的线程被延期了,那么所有尝试获取锁的线程都会被延期。这种现象称为阻塞,阻塞是多道程序设计(multiprogrammed)中特有的问题,每个处理器都有多个线程,操作系统会给拥有锁的线程优先权。对于很多的数据结构来说,这个问题可以通过设计非阻塞的算法来解决,在非阻塞算法中一个线程的延期不会导致其他线程的延期。根据定义而言,这些算法不能使用锁。

下面我们继续讨论我们的共享计数器的例子,分别讨论阻塞和非阻塞技术;我们会引入更多和性能相关的话题.

文章转自 并发编程网-ifeve.com

并发数据结构- 1.1.1 性能相关推荐

  1. 并发编程 — 并发数据结构--转载

    并发编程系列文章:        初解线程池:http://ray-yui.iteye.com/blog/2072463        详解线程池:http://ray-yui.iteye.com/b ...

  2. 并发数据结构-1.1.2 阻塞技术

    原文链接,译文链接,译者:周可人,校对:梁海舰 1.1.2 阻塞技术 在很多数据结构中,内存竞争所带来的不良现象和前文所说的顺序瓶颈带来的影响都可以通过使用细粒度锁机制来减小.在细粒度锁机制中,我们用 ...

  3. 并发数据结构 : SpinWait

    老实说,没有哪个开发人员愿意在其编码时还要考虑线程同步.更糟糕的情况是,编写线程同步代码一点也不好玩.稍一不慎,就会导致共享资源状态不一致,从而引发程序未预期行为.此外,当我们添加线程同步代码时还会导 ...

  4. 并发数据结构-1.1 并发的数据结构的设计

    原文链接,译文链接,译者:董明鑫,校对:周可人 随着多个处理器共享同一内存的机器在商业上的广泛使用,并发编程的艺术也产生了巨大的变化.当前的趋势向着低功耗芯片级多线程(CMT)发展,所以这样的机器一定 ...

  5. qt 5编程入门(第2版)_《C++并发编程实战第2版》第六章:设计基于锁的并发数据结构(1/3)...

    本章主要内容 设计并发数据结构的含义 设计指南 并发数据结构的示例实现 在上一章中我们了解了底层原子操作和内存模型.本章我们先把底层的细节放一放(尽管在第7章我们将需要它们),探讨一下数据结构. 为编 ...

  6. 基于Java实现的火车票抢票并发数据结构处理

    资源下载地址:https://download.csdn.net/download/sheziqiong/87473207 资源下载地址:https://download.csdn.net/downl ...

  7. Java 并发数据结构

    java 并发数据结构 并发数据结构在数据添加和删除时: 阻塞式集合:当集合为空或满时:等待: 非阻塞式集合:当集合为空或在满时:不等待,返回null或异常. 1. List 不安全: ArrayLi ...

  8. 打通 Java 任督二脉 —— 并发数据结构的基石

    老大难的 Java ClassLoader,到了该彻底理解它的时候了 每一个 Java 的高级程序员在体验过多线程程序开发之后,都需要问自己一个问题,Java 内置的锁是如何实现的?最常用的最简单的锁 ...

  9. 如何快速获得高并发编程经验?PCC性能挑战赛作品简介及源代码

    PCC 是 Performance Challenge Championship (性能挑战杯)的缩写,是高可用架构后花园会员在线上组织的一个活动,由于反响热烈,考虑到线下进行可以更好的加深对高并发编 ...

最新文章

  1. 每个人都应该有一个梦想
  2. getdate函数_SQL日期函数和GETDATE解释为带有语法示例
  3. Redis总结(四)Redis 的持久化
  4. 老工业基地调整改造与振兴
  5. element-UI组件el-button样式覆写 - 生效篇
  6. 面试官系统精讲Java源码及大厂真题 - 10 Map源码会问哪些面试题
  7. Altium net has no driving source问题
  8. 数字藏品以虚强实,赋能实体经济发展
  9. Robocup场地信息
  10. jQuery 引入和使用
  11. android热敏打印机图片乱码,微信小程序小票打印功能(以及中文乱码的解决)...
  12. SQL Server 2000管理专家系列课程之二:如何让数据库中的数据更有条理性? – 规范SQL Server 2000数据...
  13. Dapp区块链 | wireshark抓包2
  14. Http协议和抓包工具
  15. 洛谷P2585[ZJOI2006]三色二叉树(树形DP)
  16. 什么是软件测试(功能、接口、性能、自动化)详解
  17. java中如何定义接口_java中如何定义一个接口
  18. Ubuntu 触摸板(touchpad) 右键失效
  19. -source 1.5 中不支持 diamond 运算符 [ERROR] (请使用 -source 7 或更高版本以启用 diamond 运算符)
  20. java 比例 分配_JAVA 按比例分配

热门文章

  1. JS 日期对象常用函数(时间常用函数、日期格式化)
  2. Linux Epoll ET模式EPOLLOUT和EPOLLIN触发时刻
  3. liteide无法自动补全代码问题解决【go: cannot find GOROOT directory: c:\go】
  4. Spring计划列表
  5. Entity Framework(二)
  6. 网络采集库NCrawler
  7. 报表服务扩展:基于WCF技术的报表服务扩展
  8. 无刷新判断用户名是否存在
  9. FreeModbus移植到STM32F107(以太网传输方式)
  10. 还在手写 Getter/Setter 方法吗?Lombok 让你的代码更简洁!