对多线程程序,单核cpu与多核cpu如何工作相关的探讨

逻辑玄铁探
• 阅读 4592

对多线程程序,单核cpu与多核cpu如何工作相关的探讨

我们程序员在编码的时候,涉及到技术方案时,往往会忽略掉代码对性能方面的影响,或者没有足够的敏感度来帮助自己判断自己的技术方案对系统性能造成的影响。改进的方式之一是,我们需要对底层系统的原理更了解一点,这样心里才能有杆秤,知道选择什么样的技术去实现代码,可能带来什么样的问题。
这篇文章,通过收集一些论坛讨论问题,来帮助大家了解cpu对多线程的程序如何处理,性能会有什么影响和取舍,虽然内容有些基础,但往往我们最容易忽略的就是这些基础。


1. 多线程在单核和多核CPU上的执行效率问题的讨论

a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢)

多个cpu的话就可以在两个cpu中同时执行了..............

a2: 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑

效率不会有提高的
切换线程反倒会增加开销

a3: #3楼说的是对的。所以一般没有必要的话,尤其在单核CPU的时候,不推荐使用多线程。

单核CPU时使用多线程,通常是有线程要处于等待状态。
而对于普通的进度条更新类的,能够简单控制的(比如:在循环里面手动处理消息)就简单控制,一般不使用线程,这样可以提高程序的性能。并且避免掉不必要的线程同步问题。

a4: 你试一下双核三线程,保准效率反而比双线程低!

算法同样时,CPU占用率达到100%的最小线程数效率最高,如果是cpu占率率高的运算单核单线程,双核双线程,四核四线程是最适合的。
但为什么有时候线程数超过CPU内核数会更快呢?原因是这种程序的单个线程运算量不足以占满CPU一个内核(比如存在大量IO操作,IO比较慢,是程序瓶颈)。

a5: 多线程的用处在于,做某个耗时的操作时,需要等待返回结果,这时用多线程可以提高程序并发程度。如果一个不需要任何等待并且顺序执行能够完成的任务,用多线程简直是浪费。

讨论来源地址

2. 浅谈多核CPU、多线程与并行计算

a1: CPU发展趋势

核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16 核32线程),我们如何来面对这突如其来的核心数目的增加?编程也要与时俱进。笔者斗胆预测,CPU各个核心之间的片内总线将会采用4路组相连),因为全相连太过复杂,单总线又不够给力。而且应该是非对称多核处理器,可能其中会混杂几个DSP处理器或流处理器。

a2: 线程越多越好吗?什么时候才有必要用多线程?

线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。

Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。

什么时候该使用多线程呢?这要分四种情况讨论:

a.多核CPU——计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。

b.单核CPU——计算密集型任务。此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率了;相反,如果要做人机交互,最好还是要用多线程,避免用户没法对计算机进行操作。

c.单核CPU——IO密集型任务,使用多线程还是为了人机交互方便,

d.多核CPU——IO密集型任务,这就更不用说了,跟单核时候原因一样。

程序员需要掌握的技巧/技术

(1)减少串行化的代码用以提高效率。这是废话。

(2)单一的共享数据分布化:把一个数据复制很多份,让不同线程可以同时访问。

(3)负载均衡,分为静态的和动态的两种。具体的参见有关文献。

讨论来源地址

3. 请问:CPU的多核和应用程序的多线程的关系是怎么样的?

a1: 多核儿就是系统同时可以运行多个线程,比如双核可以同时执行两个线程。单核儿只能一次执行一个线程。

a2: 试了一个ping 从192.168.0.1 到192.169.0.255的程序

用多线程做的,发现在单核的机器上和多核的机器运行性能有两倍左右的差异。

a3: 多核对于用户,应该说对于程序员来说,是透明的,根本不用管它,当你是单核的编程就可以了,除非使用OpenMP进行编程,就用很多条条框框了,另外你上面的测试是不准确的,网络(主要是远程主机)会因为不同时候而有不同的响应速度,你应该在干净的本机同环境下进行测试.但是,对于多线程多核优于单核还是可以确定的. 总之,我们不用担心程序在单核或多核上会出现并发问题.

a4: 多核指的是CPU有多个核心,多线程是程序有多个线程在同时执行。
多核也要用多线程才能发挥优势。
同样,多线程要在多核上才能真正有优势。
这点来说,对程序员不是透明的。程序员可以控制程序/线程在哪个CPU(核)上运行。用户也可以控制程序在哪几个核上运行。所以多核,多线程对用户和程序员都不是透明的。程序员必须了解这方面的知识。才能让程序最大限度的发挥机器的性能。

讨论来源地址


原文引用

编辑by:
二月的狮子

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
李志宽 李志宽
4年前
一文讲透!Windows内核 & x86中断机制详解
搞内核研究的经常对中断这个概念肯定不陌生,经常我们会接触很多与中断相关的术语,按照软件和硬件进行分类:硬件CPU相关:IRQIDTcli&sti软件操作系统相关:APCDPCIRQL一直以来对中断这一部分内容弄的一知半解,操作系统和CPU之间如何协同工作也是很模糊。最近花了点时间认真把这块知识进行了梳理,不当之处,还请高手
Stella981 Stella981
4年前
Python实现多进程
Python可以实现多线程,但是因为GlobalInterpreterLock(GIL),Python的多线程只能使用一个CPU内核,即一个时间只有一个线程在运行,多线程只是不同线程之间的切换,对多核CPU来说,就是巨大的浪费。如4核CPU,实际上只利用了一个核,CPU利用率只有25%。要充分利用多核CPU,可以实现Python的多进程。首先,im
Stella981 Stella981
4年前
Redis 子进程开销监控和优化方式
Redis子进程负责AOF或者RDB文件的重写,它的运行过程主要涉及CPU、内存、硬盘三部分的消耗01 CPUCPU开销分析。子进程负责把进程内的数据分批写入文件,这个过程属于CPU密集操作,通常子进程对单核CPU利用率接近90%CPU消耗优化。Redis是CPU密集型服务,不要做绑定单核CPU操作。由于子进程非常消耗
Stella981 Stella981
4年前
Noark入门之线程模型
0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
Stella981 Stella981
4年前
Linux RPS RFS
随着单核CPU速度已经达到极限,CPU向多核方向发展,要持续提高网络处理带宽,传统的提升硬件设备、智能处理(如GSO、TSO、UFO)处理办法已不足够。如何充分利用多核优势来进行并行处理提高网络处理速度就是RPS解决的课题。以一个具有8核CPU和一个NIC的,连接在网络中的主机来说,对于由该主机产生并通过NIC发送到网络中的数据,CPU核的并行性是自热而然
绣鸾 绣鸾
2年前
Geekbench 6 for Mac(系统性能检测工具)
是一款跨平台的系统性能测试软件,可以对处理器和内存等硬件进行评测,并提供了单核和多核两种测试模式。该软件适用于Windows、macOS、Linux和iOS等多种操作系统平台。Geekbench6测试可以帮助用户快速准确地了解自己设备的性能表现,包括CPU
现代 CPU 技术发展 | 京东云技术团队
这篇文章主要是介绍CPU技术的发展,包括最近几十年CPU性能提升和半导体工艺发展,当前技术发展方向。希望可以帮助软件开发者理解CPU指令集和组成运行原理、CPU性能提升的现状和瓶颈、CPU技术发展方向会如何影响软件开发/设计的框架和编程思想。
JAVA应用CPU跳点自动DUMP工具 | 京东物流技术团队
背景在做系统监控时,CPU的使用率是一个关键的指标,它反映了系统的性能稳定性以及是否存在异常情况,能帮助我们了解系统的负载情况。通过监控CPU使用率,可以判断系统是否正常运行或者是否存在性能问题。如果CPU使用率过高,可能表示系统存在资源瓶颈,需要进行优化
JAVA应用CPU跳点自动DUMP工具
背景在做系统监控时,CPU的使用率是一个关键的指标,它反映了系统的性能稳定性以及是否存在异常情况,能帮助我们了解系统的负载情况。通过监控CPU使用率,可以判断系统是否正常运行或者是否存在性能问题。如果CPU使用率过高,可能表示系统存在资源瓶颈,需要进行优化
燕青 燕青
2年前
Geekbench 6 系统性能检测工具
是一款跨平台的系统性能测试软件,可以对处理器和内存等硬件进行评测,并提供了单核和多核两种测试模式。该软件适用于Windows、macOS、Linux和iOS等多种操作系统平台。Geekbench6测试可以帮助用户快速准确地了解自己设备的性能表现,包括CPU