返回顶部
首页 > 资讯 > 前端开发 > node.js >多核编程中的线程随机竞争模式的概率分析
  • 882
分享到

多核编程中的线程随机竞争模式的概率分析

2024-04-02 19:04:59 882人浏览 安东尼
摘要

这篇文章主要讲解了“多核编程中的线程随机竞争模式的概率分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多核编程中的线程随机竞争模式的概率分析”吧!并 不是

这篇文章主要讲解了“多核编程中的线程随机竞争模式的概率分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多核编程中的线程随机竞争模式的概率分析”吧!

并 不是任意的共享数据都能够设计成进行分组竞争的模式,比如最常用的需要用于查找的数据结构,当数据结构分成多个子数据结构后,每次查找时,不能指定查找某 个特定的子数据结构,而必须进行二级查找,先在整个数据结构内找到对应的子数据结构(不加),然后再在子数据结构中查找(加锁)。如果同时多个线程进行 查找,有可能查找的数据分布在不同的子数据结构里,也可能分布在同一子数据结构中。当查找分布在同一子数据结构时,这时就有可能发生锁竞争现象,从而引起 CPU饥饿的发生。

在这种分布式数据结构的随机锁竞争中,需要知道的是在一个k个核的CPU上,需要的线程数m和划分的子数据结构个数n为多少时,才能保证至少有k个线程在同时运行的概率不低于给定的概率P。

首 先m必须大于等于k,否则无法保证至少有k个任务在运行。子数据结构个数N也必须大于K,否则出现竞争的任务组数将少于k个,从而无法保证至少有k个任务 在运行,当然n越大,任务出现竞争的概率就越小,同时运行的线程数量就越多,不妨设n大于等于m。在实际情况中,n并不是越大越好,当  n过大时,由于锁的数量和n相等,会导致锁占用过多的系统资源。

下面就来计算一下至少有k个线程在同时运行的概率,考虑一种最坏情况的假设:假设有两个线程在访问同一个子数据结构 ,那么它们一定会发生锁竞争。在这种最坏假设下,要保证至少有k个线程在同时运行 ,实际上相当于m个线程至少访问了k个不同的子数据结构。

假设访问每个子数据结构的线程数为Xi ( 0 <= Xi <= m, i&isin;{1,2,&hellip;n}),这样可以得到以下整数方程:

X1+X2+&hellip;+Xn = m                (方程1)

要保证至少有k组线程在竞争,实际上相当于X1,X2&hellip;Xn中必须至少有k个大于0,这样至少有k个线程在运行的概率相当于上述方程满足,X2&hellip;Xn中必须至少有k个大于0的解的个数和所有可能解的个数的比值。

多核编程中的线程随机竞争模式的概率分析

下面是对这个概率公式的一些实际计算结果:

当k=2(2核CPU), m=2(2个线程), P=(n-1) / (n+1)    当n=4时,P=0.6; 当n=8时,P=7/9 =0.7778; 当n=16时, P=15/17=0.882

当k=2(2核CPU), m=4(4个线程), P=(n-1) (n+3)/ ((n+1)(n+2)) + 9 (n-1)/((n+3)(n+2)(n+1))   当n=4时,P=0.83; 当n=8时,P=0.919; 当n=16时, P=0.954

当k=4(4核CPU), m=4(4个线程), P=(n-1) (n-2)(n-3)/ ((n+1)(n+2)(n+3))   当n=4时,P=0.0286; 当n=8时,P=0.212; 当n=16时, P=0.47; 当n=32时,P=0.687

当k=4(4核CPU), m=6(6个线程), P = [ 1+12(n+15)/((n+4)(n+5)) ] &times;[(n-1)(n-2)(n-3)]/ [(n+1)(n+2)(n+3)]   当n=8时,P=0.587; 当n=16时, P=0.886; 当n=32时,P=0.978

从上面计算可以看出,当CPU核数固定时,线程数m越多,则概率愈大 ,子数据结构个数n越大,概率愈大。一般来说线程数***比核数大一倍,这样得出的概率会大一些。

以上计算的是在最坏情况下的概率,实际情况中,由于两个线程在竞争同一个子数据结构时并不一定会发生竞争现象,因为可能发生线程A在进行锁操作时,线程B正在执行不需要加锁部分的代码,因此实际的概率会大于上面计算出的最坏情况下的概率。

分布式数据结构随机锁竞争和无锁编程的性能比较

在 使用了随机锁竞争的分布式数据结构中,并行化的加速比期望值等于前面所计算出的概率&times;CPU核数,因此只要将概率保持大于一定的值,那么加速比是可以得到 保证的,并且只要加大线程个数和子数据结构个数,那么加速比的期望值就会增加。另外分布式数据结构中相比于单线程的数据结构其操作要复杂一些,增加了一些 计算开销,另外加上锁的计算开销,因此加速比要打一个较大的折扣。但是分布式数据结构的好处在于它的加速比系数不会随CPU核数的增加而降低,程序的性能 是随着核数的增加而线形增加的(前提是在数据 结构中的元素个数足够多的情况下)。

在 无锁编程中,由于使用了原子操作,原子操作是串行化的,虽然原子操作占的比重很小,但是这种串行化反映到加速比计算上需要按照阿姆尔达定律来计算,因此其 性能同样不容乐观,会随着CPU核数的增加而降低。以一个无锁的FIFO队列为例,在进队操作时需要使用一条CAS原子操作,由于队列操作本身就很简单, 因此昂贵的CAS操作所占的比例也不容小觑,在这种队列操作中,CAS所占的比例估计要达到20%左右(具体的数据需要通过测试才能确定),按照阿姆尔达 定律,在一个8核的 CPU上的加速比系数将为3.33,  在一个64核CPU上,其加速比将小于5,当然这是只考虑队列操作没有考虑程序中其他并行操作的极端情况,但是不管怎么说,采用无锁编程的话,加速比系数 会随CPU核数的增加而降低。

另外无锁编程相比于单线程编程,其代码也变复杂了,也增加了额外的计算开销,加速比也需要另外打一个折扣。

如 果将分布式数据结构和单核时的多线程编程相比,则分布式数据结构中,仅仅增加了定位到子数据结构的开销,如果是查找类型的数据结构,子表的查找时间缩小 了,实际上增加的开销小于定位子数据结构的开销。因此分布式数据结构增加的开销所占的比例是非常小的,其性能近似(略低)于单核时的多线程编程。

在 CPU核数较少时,无锁编程的性能可能会优于分布式数据结构,并且优于单核多线程编程的性能,但是当CPU核数增加到一定程度时,分布式数据结构的性能优 势就体现出来了。采用分布式数据结构可以复用部分单线程时的数据结构代码,采用加锁机制容易被程序员理解,并且实现的功能不受限制。而无锁编程则难度非常 高,远非普通程序员所能掌握,并且实现的功能受到限制,比如实现一个无锁的队列,如果想要给队列加一个计数来掌握队列中有多少元素,采用无锁编程实现估计 就很难行得通了,而这在有锁编程中只是一个简单得不能再简单的东西。因此对程序员来说,分布式数据结构是多核时代必需掌握的技术,而无锁编程也许可以用在 某些无法使用分布式数据结构的特定场合。

需 要说明的是前面对概率的计算隐含了一个前提,就是每个线程在访问各个子数据结构时的概率是相同的,这要求各个子数据结构必须是负载均衡的,否则如果访问各 个子数据结构的概率不相同的话,计算出的结果会小于前面的计算结果,考虑一种最极端的情况,所有的数据都在一个子数据结构里,那么所有的线程都将竞争同一 个子数据结构,那么问题倒退回多核编程中的锁竞争难题一文中描述一样的情况,这是一种可能比阿姆尔达定律更糟糕的情况。100%的负载均衡是做不到的,所 幸可以通过一定的手段来使数据尽量变得均衡,使得数据能够相对较均匀地分布在各个子数据结构中,这样就不会对最终的概率产生较大影响。

感谢各位的阅读,以上就是“多核编程中的线程随机竞争模式的概率分析”的内容了,经过本文的学习后,相信大家对多核编程中的线程随机竞争模式的概率分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 多核编程中的线程随机竞争模式的概率分析

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

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

猜你喜欢
  • 多核编程中的线程随机竞争模式的概率分析
    这篇文章主要讲解了“多核编程中的线程随机竞争模式的概率分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多核编程中的线程随机竞争模式的概率分析”吧!并 不是...
    99+
    2024-04-02
  • 怎么理解多核编程中的线程分组竞争模式
    这篇文章主要介绍“怎么理解多核编程中的线程分组竞争模式”,在日常操作中,相信很多人在怎么理解多核编程中的线程分组竞争模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解...
    99+
    2024-04-02
  • 多核编程中的锁竞争现象分析
    这篇文章主要介绍“多核编程中的锁竞争现象分析”,在日常操作中,相信很多人在多核编程中的锁竞争现象分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”多核编程中的锁竞争现象分析”...
    99+
    2024-04-02
  • Java编程中的并发索引算法:解决多线程竞争的问题?
    在Java编程中,多线程并发是一个常见的问题。在多个线程同时访问共享资源时,由于访问的顺序和时间不确定,就会产生竞争的问题。这种竞争会导致程序出现意想不到的结果,甚至引发严重的错误。为了解决这个问题,Java提供了一些并发算法来帮助开发者...
    99+
    2023-06-30
    索引 编程算法 并发
  • 浅析Python中的随机采样和概率分布
    目录1. random.choice2. random.choices(有放回)3. numpy.sample(无放回)4.rng.choices 和 rng.sample5. nu...
    99+
    2024-04-02
  • Java中单例模式与多线程的示例分析
    这篇文章主要介绍了Java中单例模式与多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单例模式与多线程单例模式就是全局唯一但是所有程序都可以使用的对象写单例模式...
    99+
    2023-06-20
  • java多线程编程的示例分析
    这篇文章将为大家详细讲解有关java多线程编程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.相关知识:Java多线程程序设计到的知识:(一)对同一个数量进行操作(二)对同一个对象进行操作(三...
    99+
    2023-05-30
    java
  • Python中线程池模块之多线程的示例分析
    这篇文章将为大家详细讲解有关Python中线程池模块之多线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、线程池模块引入from concurrent.futures i...
    99+
    2023-06-15
  • 怎么理解多核编程中的条件同步模式
    本篇内容介绍了“怎么理解多核编程中的条件同步模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在多线程编程...
    99+
    2024-04-02
  • Android编程中关于单线程模型的理解与分析
    本文讲述了Android编程中关于单线程模型的理解与分析。分享给大家供大家参考,具体如下: 当一个Android程序启动时,Android系统会同时启动一个对应的主线程(Mai...
    99+
    2022-06-06
    模型 单线程 线程 Android
  • C#多线程中线程同步的示例分析
    这篇文章将为大家详细讲解有关C#多线程中线程同步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言我们先来看下面一个例子:using System;using Syste...
    99+
    2023-06-29
  • Java程序中多线程的示例分析
    这篇文章主要介绍了Java程序中多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  为什么会排队等待?  下面的这个简单的 Java 程序完成四项不相关的任务。...
    99+
    2023-06-03
  • Node.js中的多进程和多线程实例分析
    本篇内容主要讲解“Node.js中的多进程和多线程实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的多进程和多线程实例分析”吧!我们都知道...
    99+
    2024-04-02
  • java中多线程的示例分析
    这篇文章主要介绍了java中多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java多线程并发与并行:并行: 指两个或多个事件在同一时刻发生 ( 同时发生 ) ...
    99+
    2023-06-20
  • iOS中多线程的示例分析
    这篇文章给大家分享的是有关iOS中多线程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、iOS的三种多线程技术NSThread–优点:NSThread 比其他两个轻量级,使用简单–缺点:需要自己管理线...
    99+
    2023-06-21
  • Java中多线程Reactor模式的实现
    目录1、 主服务器2、IO请求handler+线程池3、客户端多线程Reactor模式旨在分配多个reactor每一个reactor独立拥有一个selector,在网络通信中大体设计...
    99+
    2024-04-02
  • Java多线程中的Balking模式详解
    目录1.场景2.详细说明3.Balking模式的本质:停止并返回源代码如下:总结1.场景 自动保存功能: 为防止电脑死机,而定期将数据内容保存到文件中的功能。 2.详细说明 当数据内...
    99+
    2024-04-02
  • 怎么解析Redis6中的单线程和多线程模型
    这篇文章的内容主要围绕怎么解析Redis6中的单线程和多线程模型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!1....
    99+
    2024-04-02
  • Python中多线程和多处理的分析
    本篇内容主要讲解“Python中多线程和多处理的分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中多线程和多处理的分析”吧!多线程简单地说,线程允许您并行地运行程序。花费大量时间等...
    99+
    2023-06-16
  • Java多线程之Interrupt中断线程的示例分析
    小编给大家分享一下Java多线程之Interrupt中断线程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、测试代码https://gitee.com/zture/spring-test/blob/master...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作