免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

如何让代码并发效率更高

  • 2013-08-13
  • 本文字数:2197 字

    阅读完需:约 7 分钟

随着计算硬件的快速发展,多核多处理器已经广泛应用于企业和个人环境中,开发人员利用多线程技术努力提高软件的计算速度,资深系统架构师 Gurudutt Kumar总结了如何让代码并发效率更高的实践经验。

Gurudutt 首先列举了几种影响软件可伸缩性的问题:

  • 效率低下的并行化:单片应用程序或软件无法有效使用可用的计算资源。您需要将应用程序组织成并行任务。在传统的不支持多线程的应用程序或软件中,我们会经常看到这个问题。这些应用程序在多核、多处理器、芯片多线程硬件上无法伸缩,并且无法实现更好的吞吐量。线程太多可能会和线程太少一样,都不会产生好的结果。
  • 串行瓶颈:在多个线程或进程之间共享数据结构的应用程序可能会有串行瓶颈。为了保持数据完整性,可能必须使用锁定和串行化技术(例如,读取锁、读写锁、写入锁、自旋锁、互斥等)将这些共享数据结构的访问串行化。设计得效率低下的锁可能会由于多个线程或进程之间的高度锁争用而导致串行瓶颈,从而尝试获取锁。这可能会潜在地降低应用程序或软件的性能。应用程序的性能可能会随着核心或处理器数量的增加而降低。
  • 对操作系统 (OS) 或运行时环境的过度依赖:您不能依赖操作系统、运行时环境或编译器来完成伸缩应用程序或软件所需的一切操作。但是,编译器和运行时环境可以帮助提供一定的优化,您不能依赖它们解决所有可伸缩性问题。例如,不能依赖 Java™ 虚拟机 (JVM) 通过自动并行来发现 Java 应用程序的最佳可伸缩的机会。
  • 工作负载的不平衡可能是一个瓶颈:工作负载的不均匀分布可能导致无法有效地利用计算资源。您可能必须将较大的任务划分成可以并行运行的较小的任务,还可能必须将串行算法更改为并行算法,以便提高性能和可伸缩性。
  • I/O 瓶颈:由于阻止磁盘输入 / 输出 (I/O) 或高网络延迟而导致的瓶颈可能会严重抑制应用程序的可伸缩性。
  • 无效的内存管理:在多核平台上,因为有很多处理单元,因此纯计算可能非常廉价,并且主要内存可能也不是问题,因为它正在变得越来越大。但是,内存带宽一直是一个瓶颈,因为所有处理器核心都贡献了一个通用的总线。无效的内存管理可能导致一些难以检测到的性能问题,比如伪共享。

以“避免内存争用”为例,Gurudut 做了解释:

在内存和缓存中,各种不同的核共享一个通用的数据区域,这需要在它们之间进行同步。当不同的核同时访问同一个数据区域时,会发生 _ 内存争用 _。在不同的核之间同步数据会因总线通信、锁定成本以及缓存缺失而有很大的性能损失。如果应用程序有多个线程,并且所有线程都更新或修改同一个内存地址,那么正如前面部分所讨论的那样,为了保持缓存一致性,可能会产生一次重大的乒乓效应。这会导致性能降低。

如何避免内存争用呢?Gurudut 认为“不要在核之间共享可写入的状态”:

  • 为了最大程度地减少内存总线通信,可以通过最小化共享位置 / 数据尽可能地减少核心交互,即使共享数据没有锁保护,而有一些硬件级别原子指令(如 Microsoft® Windows® 32 位平台上的 InterlockedExchangeAdd64)保护也是如此。
  • 减少线程之间的内存争用的一个方法是从多个线程中消除对共享内存区域的更新。例如,即便是在多个线程需要更新全局计数器或累计总数(如统计数据)时,各个线程也可以保持线程本地总数,并让全局总数仅在需要时通过一个通用的线程进行更新。因此,在共享内存区域上的争用会大大减少。
  • 趋向于减少锁争用的模式会减少内存通信,因为它是一个共享的可写入状态,该状态需要使用锁并产生争用。

对于锁争用,Gurudut 认为要从“避免”和“减少”两个方面来解决这个问题:

避免

  • 避免在数据结构中发生锁争用的方法之一是采用并发数据结构设计和无锁算法,这会消除锁以及传统的同步技巧(比如互斥)。有多种并发数据结构的设计并不需要利用同步机制,比如互斥。
  • 无锁算法的一些示例如下:
    • 使用 相对论编程 的可伸缩并发哈希表:该技巧的最简单示例是 Read Copy Update (RCU) ,它专用于 Linux 内核,大大提高了 Linux 内核的性能,并简化了 Linux 内核的代码。
    • 无锁可扩展有序分割的哈希列表:这个无锁递归可扩展哈希算法使用了无锁的链接列表,这些列表使用原子指令来修改链接的列表。
  • 在 Linux 内核中,广泛使用了每处理器变量,系统上的每个处理器都获得了自己的一个给定变量的副本。访问每处理器变量不需要使用锁,此外,因为在不同的处理器上,这些变量未在线程之间共享,因此没有伪共享或内存争用。这种技巧非常适合收集统计信息。

减少

  • 当使用传统锁或同步技巧(如自旋锁)时,必须注意的是,不要使用单片锁或全局锁,而是将这些锁分成更细小的部分。因此,锁会保护数据结构中的某个特定区域以及较小的区域。这样多个线程就能够通过获取保护这些成员的相应锁,在同一数据结构的不同成员上并发进行操作。这种方法可以实现更多并发。
  • 甚至当软件设计中的同步机制能够实现更好的并发和减少锁争用时,也可能会由于伪共享而导致发生性能问题。例如,考虑一个哈希数据结构。如果存在一个自旋锁数组,用于保护哈希中的每个哈希桶,那么在自旋锁数组中可能会出现伪共享。两个线程在两个不同的处理器上运行,每个线程都锁定哈希中的不同哈希桶,那么当它们所需的自旋锁位于同一个缓存行上时,可能会发生伪共享。因此,在设计此类算法时需要考虑采用避免发生伪共享的通用技巧。

作者的微信公众号“老崔瞎编”,关注 IT 趋势,承载前沿、深入、有温度的内容。感兴趣的读者可以搜索 ID:laocuixiabian,或者扫描下方二维码加关注。

2013-08-13 03:156080
用户头像

发布了 501 篇内容, 共 255.1 次阅读, 收获喜欢 59 次。

关注

评论

发布
暂无评论
发现更多内容

秒验 REST API 手机号码置换接口

MobTech袤博科技

前端 App 前端开发 前端开发工具

零代码Demo Day大赛热烈开启,迎接挑战,赢取万元大奖!

明道云

PoseiSwap:基于 Nautilus Chain ,构建全新价值体系

大瞿科技

erp企业管理系统软件哪个最好用?

优秀

ERP系统 ERP软件

NFTScan 团队发布升级版 NFT Portfolio 产品

NFT Research

NFT\

陕西玖富建设工程有限公司简介

新消费日报

Topaz Video AI for mac(视频增强和修复工具) 3.3.9中文版

mac

Topaz Video AI 苹果mac 视频增强修复软件

面试官:线程是如何通讯的?

王磊

java面试

vpay数字货币钱包系统开发(Imtoken、TP)

薇電13242772558

数字钱包

代码质量把控神器:Codigger, 助您项目高效开发

知者如C

解决大模型“开发难”,昇思MindSpore自动并行技术应用实践

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 8 月 PK 榜

云渲染:为你的设计作品增添细节与逼真感!

Finovy Cloud

3D渲染 渲染 云渲染 云渲染农场

代码随想录 Day37 - 贪心算法(六)

jjn0703

如何使用三台虚拟机搭建一个kubernetes集群?

数新网络官方账号

Kubernetes, 云原生, eBPF

山歌寥哉!生产制造系统需要新治理框架

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

唐刘:TiDB 研发工程实践及 TiDB 人才观丨CCF 中国数据库暑期学校

PingCAP

数据库 TiDB pingCAP

字节码增强常见问题系列(二)| 兼容性难题:如何让不同字节码增强框架和谐共存?

华为云开源

字节码增强 sermant

基于Vue3的数据可视化低代码平台

互联网工科生

Vue 低代码 vue3.0 JNPF

Amadeus Pro for mac(音频编辑软件) 2.8.13中文版

mac

苹果mac Amadeus Pro 音频编辑软件

文心一言 VS 讯飞星火 VS chatgpt (70)-- 算法导论6.5 9题

福大大架构师每日一题

福大大架构师每日一题

TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验

PingCAP

MySQL 云服务 TiDB pingCAP TiDB Serverless

10个学习JavaScript的理由

互联网工科生

JavaScript 学习 前端 编程语言

低代码平台,让应用开发更简单!

高端章鱼哥

低代码开发 应用开发

一篇聊聊JVM优化:堆

高端章鱼哥

Java JVM

百度飞桨助力高校培养AI大模型人才,2023年飞桨产学合作项目申报启动

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

基金公司最佳实践:如何用价值流分析,洞察研发效能瓶颈?

万事ONES

第五届宁波市卫生健康系统信息化技能竞赛暨赛前培训成功举办 平凯星辰受邀授课

PingCAP

数据库 TiDB 平凯星辰

QuickBI提供数据可视化分析功能的工具,企业免费使用

夜雨微澜

分布式流处理组件-生产实战:Broker副本与优化

谢先生F

kafka 架构 broker

如何让代码并发效率更高_语言 & 开发_崔康_InfoQ精选文章