关于多线程在多核cpu上执行效率的问题

IEC103协议实战指南:报文解析与传输优化策略 本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。 阅读详情

前言:博主最近在比较python和go语言写的web服务器的执行效率问题,在看了google搜索结果后,产生了疑问

1.为什么python的异步执行框架tornado效率可以和go语言媲美?

2.为什么随着线程的增加,并发数的增长呈现逐步缓慢的趋势?

带着这些问题,博主探究了下原因,如果有错误,欢迎大家指出。

 

注意:为简化推理过程和理解,以下只考虑执行任务的线程,系统中其他所有(包括系统线程)均不考虑,即cpu只执行我们的任务线程。

 

一、单核cpu

首先,我们要知道在单核时,只能进行并发执行某个线程(操作系统的时间片轮转法是分配时间片给线程而不是进程,博主有文章提到过),而不能并行执行。

1.当线程为cpu密集型时(  比如一个  while( true ){ i++;}  )

(图中横坐标是时间,从0s到1s,方块是线程每次时间片的执行)

由于时间片轮转,虽然cpu中只有这一个线程在执行,可它还是每执行一个时间片后就被调度出cpu,再调度回来,这样在1s内时间被用来执行线程+调度线程,cpu一直在执行线程和调度,利用率为100%(看吧,我们单线程就把cpu跑满了),此时如果增加线程,执行效率不会得到提升,反而可能因为调度变复杂、内存等资源争夺而降低效率!

2.当线程为IO密集型时(比如一个从磁盘拷贝数据到另一个磁盘的拷贝进程)

(图中横轴为时间,从0s到1s,方块为线程占用cpu执行,波浪线为线程正在IO(此时cpu为空),该线程只有IO结束才能继续执行,波浪线与方块之间的时间为调度时间)

从图中可以发现,cpu利用率极低,1s内时间被用来执行线程+IO+调度,此时如果对当前任务用多线程,只要磁盘足够快,那理论上1s内cpu利用率越高,效率越高,但是实际上磁盘读写速度有限,如果增加过多线程,cpu利用率是上去了,但是磁盘因为要切换多个线程的读写(由于线程被调度),导致效率降低,木桶效应,影响整个任务效率。

3.当执行线程为计算多,IO少(其实本质就是计算密集型比如一个web服务器,执行各种数学运算并返回结果)

此时若采用单线程,那图和2中类似,只不过方块变大,波浪变小;

此时若采用多线程,比如两个线程时

(如图,方块间为cpu调度时间,波浪线为IO时间)

从图中,因为IO少,我们考虑此时磁盘肯定后于cpu满载,所以随着线程的增加,cpu利用率变高,理想状态下,1s时间被用来执行线程+调度,此时IO和执行并行了,极大提高了CPU利用率,因而可知,cpu密集而IO少的线程合理使用多线程可以增加cpu使用率和任务执行效率,至于多少个线程合适,则应在实际的硬件和系统下进行测试。

4.当线程为cpu执行少,IO多时(其实本质就是IO密集型,比如一个从磁盘拷贝数据到另一个磁盘的拷贝进程)

参考2,方块变更小了,波浪更长了,此时执行效率同样受制于磁盘,若磁盘未满载,则继续增加线程可以增加cpu使用率和磁盘使用率,加快任务效率,但若磁盘满载,则继续增加线程整体执行效率反而降低。

二、多核CPU

以八核为例,

1)若只跑一个线程,那同一时间只有某一核被利用,其他七核都空闲;

2)若同时跑八个计算密集型,则理论上整个任务执行效率会提高八倍,若超过八个线程,则效率可能反而下降;

3)若同时跑八个IO密集型,若没超过磁盘负载,则还可以继续增加线程,同时执行效率得到提高,若超过了,则执行效率会急剧下降;

 

注意:以上IO密集和cpu密集只是举例子,密不密集不是靠个人感觉,计算量大不大也不是靠个人感觉,实际上,例子中IO密集线程代表的情况是:使在cpu满载前,磁盘先满载的线程;cpu密集线程代表的情况是:使磁盘满载前,cpu先满载的线程;

举个例子:一个线程要就算圆周率后一百亿亿位,由于内存只有1g,所以要不断把中间结果写回磁盘在某台cpu差,硬盘读写速度超级高的设备上(外星人的科技,读写速度为无穷大),是cpu密集型;在另一台运算超级厉害的cpu(也是外星人科技,计算圆周率后一百亿亿位只要1ms的那种),然而磁盘却很慢(1kb/s),那它反而变成了IO密集型

现在大家说的IO密集型和cpu密集型是针对21世纪的大众硬件来说的,虽然没那么极端,但是还是想让大家知道,要具体问题具体分析,IO密集和cpu密集也只是相对的,而且要判断多线程能否提高执行效率,首先要知道这个线程在执行任务的机器上是io密集型还是cpu密集型

从TM1到TM9:手把手教你用Wireshark抓包分析LTE下行调度与传输模式切换 本文详细解析了如何使用Wireshark抓包分析LTE下行调度中的传输模式切换,从TM1到TM9的动态调整过程。通过实战案例,包括小区边缘移动、高速场景和多用户调度,揭示eNodeB如何基于信道质量指标(如RSRP、SINR)动态切换传输模式,并提供关键信令解析和优化建议,助力网络工程师提升LTE网络性能。 阅读详情

相关推荐

LM1875官方电路图元件作用解释说明以及电路调校

R1是为C1提供充放电回路用的电阻,这是老外工作严谨的地方,其实接好电位器之后直流通路就已经存在了,这个加上只能防止最恶劣情况时也能把C1的电能放掉,尽管只有一点点 C1是输入电容,主要作用是隔离前后级的直流信号,但是这个电容对音质的影响很大,可以换用不同的品牌和容量来部分修改音质和音色 R2提供LM1875正输入端的直流电平控制点,接地就表示在理想情况下Lm1875的输出直流电平是0V;还有一个作用就是确定放大器的交流输入阻抗为电阻值。 R3、R4是反馈电阻,这个电路的放大倍数为R4/R3+1=21倍。.

m0_50862404的博客 1万+

一种提高多核CPU并行效率的构想

 一种提高多核CPU并行效率的构想 Cpu多核技术,最初由蓝色巨人IBM在1999年10月微处理器论坛中提出来,在那个别论坛上它披露了双核心Power4的研发计划,并于2000年以180纳米铜导线搭绝缘硅(SOI)制程打造Power4处理器工程样本开机成功,随即成为业界对双/多核心处理器发展的关注焦点。到今天为止,至少已经发展了17年,由当初的两核发展数十核的规模。从专业人员的眼光

zcpxieqing的专栏 1594

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1636

进程、线程,多核、多CPU,同步、异步,阻塞、非阻塞

一、cpu架构和工作原理 计算机有5大基本组成部分,运算器,控制器,存储器,输入和输出。运算器和控制器封装到一起,加上寄存器组和cpu内部总线构成中央处理器(CPU)。cpu的根本任务,就是执行指令,对计算机来说,都是0,1组成的序列,cpu从逻辑上可以划分为3个模块:控制单元、运算单元和存储单元。这三个部分由cpu总线连接起来。 CPU的运行原理就是:控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。对

weixin_44783002的博客 2429

ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错?

本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。

weixin_28396629的博客 741

【STM32+K210项目】基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

随着时代的进步和科技的迅猛发展,人们对居住安全的重视程度不断提升,对安全防范系统的需求也日益增强。在安防系统中,门禁系统占据着重要的位置。传统的门禁控制方式主要依靠钥匙、密码和门禁卡等,这些方式易于被破解和复制,安全性较低。然而,近年来,生物识别技术的迅速发展和成熟,为解决这一问题提供了新的方案。生物识别技术具备便携性、非易失性、不易遗忘以及难以盗用等优点,逐渐被引入到门禁系统中。传统的小区门禁系统往往依赖人工管理,存在一定的局限性,难以满足用户多样化的需求,也浪费了人力资源。

嵌入式技术开发 1万+

java线程可以在运行在多个cpu核上吗?

我是一直都以为这个问题的答案是肯定的,也就是说可以运行在多核上。 但是有一天见到这样的一个理论,我就顿时毁三观了。 JVM在操作系统中是作为一个进程的,java所有的线程都运行自这个JVM进程中, 所以说java线程某个时间只可能运行在一个核上。 这个说法对我的打击太大了,我不能接受。于是就开始多方求证。网上搜索 和朋友一起讨论, 最终证实了java线程是可以运行在多核上的,为什么呢? 下面一句话将惊醒梦中人: 现代os都将线程作为最小调度单位,进程作为资源分配的最小单位。 在windows中进程是不活动的

lonelyVM的博客 1924

Windows11安装配置openclaw+deepseek(大龙虾)

密码可以随便设置(注意wsl系统本质上是linux系统,设置密码系统是不会像windows一样显示*点位符的),输入密码后敲回车再次输入密码,输入后敲回车。如果不小心关闭这个界面,可以再次进入powershell,输入wsl进行系统。在powershell中输入:curl -fssL https://openclaw.ai/install.sh | bash。下面是否通过第3方平台和openclaw交互,我选择j最后一项:skip for now。到下面这一步,可以通过键盘的左箭头选择Yes.

mahailiang的专栏 344

单线程与多核

在自己没有动手测试之前,一直以为一个单线程程序在多核处理器中只会在一个内核中运算。然而经过测试,其结果与我之前的理解并不一致,以下po出我的测试过程与结果。仅作为学习笔记,如遇大神,求指导讲解。 首先写个死循环如下: while(1) { } 执行、打开任务管理器、点击性能、点击资源监视器如下图: 这里我们的测试程序名为:Thread.exe,线程数显示为1,cpu 参数为25(即

_卡拉不是考拉Kala的博客 2866

179、运动控制中的行业标准:机器人安全标准ISO 10218

今天这篇笔记,就把我踩过的坑和标准里的硬骨头掰开揉碎讲清楚。

m0_50546716的博客 169

记录Android Studio连接华为(nova)手机鸿蒙系统踩过的坑

鸿蒙系统的华为老机子比较麻烦,坑有点多,兄弟们加油!

沉迷单车的追风少年 7922

c语言多线程运行在多核上,python下多核,单核CPU对于并行,并发执行效率的对比-Go语言中文社区...

****这篇博客主要内容为python 中多线程以及多进程的效率对比,以及记录自己在做这个实验中遇到的一些问题以及心得背景引入:CPU制造商为了追求CPU效率放弃了在CPU频率上的追求(CPU频率即CPU单位时间内可以完成任务的多少),反而开始把方向转向了多核CPU上。那么如何在多核CPU上充分发挥出多核的优势就成了一个问题。首先是简单介绍下多线程与多进程:线程:是程序执行流的最小单元,是系统独立...

weixin_33182922的博客 696

低代码组件开发——OpenClaw智能助手的组件设计与开发(2026技术版)

OpenClaw智能助手的低代码组件开发平台采用分层架构设计,包含组件定义、注册、配置、渲染和生命周期管理等核心模块。该系统支持UI、功能、数据和集成四种组件类型,强调可重用性、可配置性和可扩展性。组件定义通过TypeScript、React等技术实现组件结构和行为的描述,组件注册中心基于Node.js和MongoDB管理组件版本。该平台通过React、Redux等技术实现组件渲染和状态管理,并提供完整的生命周期管理机制。这种架构设计显著提升了智能助手应用的开发效率和质量。

一键难忘的博客 407

C++多线程-多核CPU下的多线程

多核CPU下的多线程 没有出现多核之前,我们的CPU实际上是按照某种规则对线程依次进行调度的。在某一个特定的时刻,CPU执行的还是某一个特定的线程。然而,现在有了多核CPU,一切变得不一样了,因为在某一时刻很有可能确实是n个任务在n个核上运行。我们可以编写一个简单的open mp测试一下,如果还是一个核,运行的时间就应该是一样的。 #include <omp.h> #define ...

逍遥云恋 3728

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

对于多线程程序,单核cpu与多核cpu是怎么工作的

原贴:https://blog.youkuaiyun.com/alinshen/article/details/80801303 先总结:一定要明白多线程是为了让业务流程并发执行,因为IO阻塞问题,所以执行效率自然提高。 此文中的大部分资料来自于网络上,我只是觉得把有道理的整理一下,方便以后查阅。 1.多线程在单核和多核CPU上的执行效率问题的讨论 a1:多线程在单cpu中其实也是顺序执行的,不过系统......

Turn X7 1914

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

浅谈Python中多线程的效率问题

关于多进程开发可以使用多核CPU而单进程多线程开发不能使用多核CPU的问题? 解读:本质上是官方提供的Cpython解释器的问题,原因是上世纪90年代,当时是单核CPU的大背景下,龟叔为了解决多线程之间恶意竞争资源而出现的诸多问题,特别设计了GIL锁。但是由于科技的发展,以及计算机硬件条件的改变,如今在多核CPU的大背景下,这个问题也是越来越突出,但是龟叔在社区反馈:考虑到GIL锁,已经植入到Cpython解释器多年,并与解释器产生千丝万缕的联系,所以强行调整可能会牵一发而动全身,导致Cpython解释器

吉米_王 735

“并行”(Parallel)和“串行”(Serial)的执行方式介绍

“并行”(Parallel)和“串行”(Serial)的执行方式介绍

weixin_45428910的博客 1190

单多核&线程&进程问题

核、线程、进程是在汽车电子控制中不可或缺的一些概念,谨以此文拓展个人在汽车电子领域的知识

Beyondyouzy的博客 1922

Python爬虫的多线程与多进程的使用场景,以及使用实例代码

本文主要综合三篇文章的内容,分为三个方面理解进程与线程。 前言 python可以实现多线程的方法有 thread(低版本使用的),threading Queue multiprocessing 其中threading客户以通过实例方法或者类方法来创建 多线程。 multiprocessing方法可以创建多线程池,用起来比较简洁、方便。 两者的比较 multiproces...

NeverLate_gogogo的博客 2606

python 多线程写文件 gil_python多线程GIL的问题记录

为什么会有GIL由于物理上得限制,各CPU厂商在核心频率上的比赛已经被多核所取代。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。即使在CPU内部的Cache也不例外,为了有效解决多份缓存之间的数据同步时各厂商花费了不少心思,也不可避免的带来了一定的性能损失。Python当然也逃不开,为了利用多核,Python开始支持多线程。而解决多线...

weixin_39968823的博客 219

关于python的多线程和多进程_Python的多线程和多进程

(1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高。单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进程及线程的切换开销,(2)实际上,多线程的出现主要为了解决IO设备的读写速度往往比CPU的处理速度慢造成的单线程程序运行阻塞问题,一个极端的例子就是如果你需要用户在键盘上输入一个数据,当用户没有输入前...

weixin_39738152的博客 85

为什么python推荐多进程 而不是多线程_为什么在python里推荐使用多进程而不是多线程?--转同事的一篇文章...

...的,第一行是我自己试的,教程没讲.两种输出都一样,为什么教程讲 用 第2种呢?是出于安全考虑,还是别的因素?谢谢了...为什么在python里推荐使用多进程而不是多线程?--转同事的一篇文章最近在看Python的多线程,经常我们会听到老手说:“python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢?要知其然,更要知其所以然。所以有了下面的深入研究:首先强调背景:1、GIL是什么?...

weixin_39974811的博客 226

python gil 解决_Python的GIL问题

python GIL问题的解释(global interpreter lock)早期cpython(python最主要的解释器)为了实现多线程的功能,提高CPU利用率,暴力无脑使用了GIL机制(全局锁)来解决线程之间数据同步问题。也就是因为历史问题埋了大坑。In CPython, the global interpreter lock, or GIL, is a mutex that preven...

weixin_39628864的博客 240

python的多线程

“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢? 首先强调背景: 1、GIL是什么? GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。 2、每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请...

fengxiaolu311的博客 165

python中多线程是真的还是假的_Python中的鸡肋多线程

在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全局解释器锁(GIL)。Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时刻,只有一个程序在CPU中运行。同样地,虽然Python解释...

weixin_34692565的博客 4344

单核 CPU 支持 Java 多线程吗?我们来一起看看吧

单核 CPU 支持 Java 多线程吗?我们来一起看看吧

吴名氏的博客 10万+
上一篇: 线程数究竟设多少合理
下一篇: 图形自动化测试脚本库sikuli
THMAIL
博客等级 码龄10年 2435粉丝 432原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值