iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >多核编程中的锁竞争现象分析
  • 209
分享到

多核编程中的锁竞争现象分析

2024-04-02 19:04:59 209人浏览 薄情痞子
摘要

这篇文章主要介绍“多核编程中的锁竞争现象分析”,在日常操作中,相信很多人在多核编程中的锁竞争现象分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”多核编程中的锁竞争现象分析”

这篇文章主要介绍“多核编程中的竞争现象分析”,在日常操作中,相信很多人在多核编程中的锁竞争现象分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”多核编程中的锁竞争现象分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为了简化起见,我们先看一个简单的情况,假设有4个对等的任务同时启动运行,假设每个任务刚开始时有一个需要锁保护的操作,耗时为1,每个任务其他部分的耗时为25。这几个任务启动运行后的运行情况如下图所示:

多核编程中的锁竞争现象分析

图1:对等任务的锁竞争示意图

在上图中,可以看出第1个任务直接执行到结束,中间没有等待,第2个任务等待了1个时间单位,第3个任务等待了2个时间单位,第3个任务等待了3个时间单位。

这样有3个CPU总计等待了6个时间单位,如果这几个任务是采用OpenMP里的所有任务都在同一点上进行等待到全部任务执行完再向下执行时,那么总的运行时间将和第四个任务一样为29个时间单位,加速系数为:(1+4×25)/ 29 = 3.48

即使以4个任务的平均时间27.5来进行计算,加速系数=101/27.5 = 3.67

按 照阿姆尔达定律来计算加速系数的话,上述应用中,串行时间为1,并行处理的总时间转化为串行后为100个时间单位,如果放在4核CPU上运行的话,加速系 数=p / (1 + (p-1)*f) = 4/(1+(4-1)*1/101) = 404/104 = 3.88

这就产生了一个奇怪的问题,使用了锁之后,加速系数连阿姆尔达定律计算出来的加速系数都不如,更别说用Gustafson定律计算的加速系数了。

其实可以将上面4个任务的锁竞争情况推广到更一般的情况,假设有锁保护的串行化时间为1,可并行化部分在单核CPU上的运行时间为t,CPU核数为p,那么在p个对成任务同时运行情况下,锁竞争导致的总等待时间为:1+2+…+p = p*(p-1)/2

耗时最多的一个任务所用时间为: p + t/p

使用耗时最多的一个任务所用时间来当作并行运行时间的话,加速系数如下

S(p) = (t+1) / (p + t/p) = p*(t+1) / (p*p+t)       (锁竞争下的加速系数公式)

这个公式表明在有锁竞争情况下,如果核数固定情况下,可并行化部分越大,那么加速系数将越大。在并行化时间固定的情况下,如果CPU核数越多,那么加速系数将越小。

还是计算几个实际的例子来说明上面公式的效果:

令t=100, p=4, 加速系数=4×(100 +1)/ (4*4+100) = 3.48

令t=100, p=16, 加速系数=16×(100+1) / (16*16+100) = 4.54

令t=100, p=64, 加速系数=64×(100+1) / (64*64+100) = 1.54

令t=100, p=128, 加速系数=128×(100+1) / (128*128+100) = 0.78

从以上计算可以看出,当核数多到一定的时候,加速系数不仅不增加反而下降,核数增加到128时,加速系数只有0.78,还不如在单核CPU上运行的速度。

上面的例子中,锁保护导致的串行代码是在任务启动时调用的,其实对等任务中在其他地方调用的锁保护的串行代码也是一样的。

对等型任务的锁竞争现象在实际情况中是很常见的,比如服务器软件,通常各个客户端处理任务都是对等的,如果在里面使用了锁的话,那么很容易造成上面说的加速系数随CPU核数增多而下降的现象。

以前的服务器软件一般运行在双CPU或四CPU机器上,所以锁竞争导致的加速系数下降现象不明显,进入多核时代后,随着CPU核数的增多,这个问题将变得很严重,所以多核时代对程序设计提出了新的挑战。以前的多任务下的编程思想放到多核编程上不一定行得通。

所以简单地认为多核编程和以前的多任务编程或并行计算等同的话是不切实际的,在讲串行化难题的那篇文章中提出了一些解决方面的对策,但是那些对策还有待业界继续努力才能做得到。

到此,关于“多核编程中的锁竞争现象分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 多核编程中的锁竞争现象分析

本文链接: https://www.lsjlt.com/news/86408.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 多核编程中的锁竞争现象分析
    这篇文章主要介绍“多核编程中的锁竞争现象分析”,在日常操作中,相信很多人在多核编程中的锁竞争现象分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”多核编程中的锁竞争现象分析”...
    99+
    2024-04-02
  • 多核编程中的线程随机竞争模式的概率分析
    这篇文章主要讲解了“多核编程中的线程随机竞争模式的概率分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多核编程中的线程随机竞争模式的概率分析”吧!并 不是...
    99+
    2024-04-02
  • 怎么理解多核编程中的线程分组竞争模式
    这篇文章主要介绍“怎么理解多核编程中的线程分组竞争模式”,在日常操作中,相信很多人在怎么理解多核编程中的线程分组竞争模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解...
    99+
    2024-04-02
  • 解析Golang中的锁竞争问题
    当我们打印错误的时候使用锁可能会带来意想不到的结果。 我们看下面的例子: package main import ( "fmt" "sync" ) type Coursewa...
    99+
    2024-04-02
  • golang函数并发缓存的锁竞争分析
    go 中函数并发缓存存在锁竞争问题,导致性能下降,甚至程序崩溃。可以使用 pprof 或 go tool trace 分析锁竞争。一种解决方法是在缓存函数中加锁,确保一次只有一个 gor...
    99+
    2024-05-01
    锁竞争 并发缓存 golang
  • Java编程中的并发索引算法:解决多线程竞争的问题?
    在Java编程中,多线程并发是一个常见的问题。在多个线程同时访问共享资源时,由于访问的顺序和时间不确定,就会产生竞争的问题。这种竞争会导致程序出现意想不到的结果,甚至引发严重的错误。为了解决这个问题,Java提供了一些并发算法来帮助开发者...
    99+
    2023-06-30
    索引 编程算法 并发
  • Java编程之Synchronized锁住对象的示例分析
    这篇文章主要为大家展示了“Java编程之Synchronized锁住对象的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java编程之Synchronized锁住对象的示例分析”这篇文章...
    99+
    2023-05-30
    java synchronized
  • 如何避免Golang函数并发编程中的数据竞争
    在 go 中避免数据竞争的方法包括:使用同步原语(如互斥锁、读写锁)控制对共享数据的访问;使用原子操作保证操作的原子性;使用并发安全的数据结构(如 sync.map、sync.waitg...
    99+
    2024-04-17
    并发编程 数据竞争 golang
  • Linux文件执行中的锁定怪现象分析
    这篇文章将为大家详细讲解有关Linux文件执行中的锁定怪现象分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。linux下,一个可执行文件exe1正在执行中,rm –f可以将其删除,m...
    99+
    2023-06-13
  • python多线程中互斥锁与死锁的示例分析
    小编给大家分享一下python多线程中互斥锁与死锁的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、多线程间的资源竞争以下列task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环(...
    99+
    2023-06-29
  • Java并发编程算法中,如何避免关键字的竞争条件?
    随着多核处理器的普及,Java并发编程已经成为了现代软件开发中不可或缺的一部分。然而,并发编程也带来了一系列新的问题,其中最常见的问题之一就是关键字的竞争条件。本文将深入探讨Java并发编程算法中如何避免关键字的竞争条件。 什么是关键字的...
    99+
    2023-10-22
    并发 关键字 编程算法
  • Golang函数的无锁编程和锁编程的比较和效率分析
    近年来,Golang正变得越来越流行,成为了很多程序员使用的编程语言之一。在Golang中,涉及到并发编程的时候,我们不可避免地会面临锁和无锁两种编程模式。那么,它们各自的优劣和适用场景是什么呢?一、无锁编程的定义和优劣无锁编程是指在多线程...
    99+
    2023-05-16
    Golang 无锁编程 锁编程
  • Golang函数的并发编程和竞态条件分析
    一、Golang函数的并发编程Golang是一门支持并发编程的语言,它提供了丰富的并发编程的基础库,例如goroutine、channel等。在Golang中使用并发编程可以充分利用多核处理器能力,提升程序的执行效率。在Golang中要使用...
    99+
    2023-05-17
    Golang 并发编程 竞态条件
  • Go语言并发编程中的存储问题:如何避免数据竞争?
    Go语言是一门强大的编程语言,它的并发编程能力为开发人员提供了更高效的解决方案。然而,随着并发编程的复杂性增加,存储问题也变得越来越复杂。在这篇文章中,我们将探讨Go语言并发编程中的存储问题,以及如何避免数据竞争。 一、Go语言的并发编程 ...
    99+
    2023-10-17
    并发 教程 存储
  • Java多线程之死锁的示例分析
    小编给大家分享一下Java多线程之死锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全...
    99+
    2023-05-30
    java
  • php编程必备:继承与多态深度解析,解锁面向对象编程之道
    在 PHP 中,继承和多态是面向对象编程的两大核心概念。继承是指一个类从另一个类派生,并继承后者的数据和方法。多态是指子类可以覆盖父类的方法,并且在调用时,根据具体的对象类型执行不同的操作。理解并掌握这些概念对于编写可扩展、可维护的代码...
    99+
    2024-02-04
    PHP 继承 多态 面向对象编程 抽象类 接口
  • java多线程编程的示例分析
    这篇文章将为大家详细讲解有关java多线程编程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.相关知识:Java多线程程序设计到的知识:(一)对同一个数量进行操作(二)对同一个对象进行操作(三...
    99+
    2023-05-30
    java
  • Go并发编程之死锁与活锁的案例分析
    目录什么是死锁、活锁发生死锁的案例分析发生活锁的案例分析什么是死锁、活锁 什么是死锁:就是在并发程序中,两个或多个线程彼此等待对方完成操作,从而导致它们都被阻塞,并无限期地等待对方完...
    99+
    2023-05-18
    Go死锁 活锁分析 Go 死锁 活锁 Go死锁 Go活锁
  • 多核中的并行前缀和计算分析
    本篇内容介绍了“多核中的并行前缀和计算分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、串行前缀和的计...
    99+
    2024-04-02
  • Python 中的并发编程难题:与死锁和竞态条件作战
    死锁 死锁是指多个线程相互等待资源,从而形成一个循环,最终导致所有线程都阻塞。在 Python 中,死锁通常发生在对多个锁或互斥量按错误顺序进行锁定时。 示例: import threading # 两个线程共享两个锁 lock1 =...
    99+
    2024-02-18
    Python 并发编程 死锁 竞态条件 信号量 事件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作