IO会一直占用CPU吗?一个很好的关于并发/并行系统的问题

IO任务与CPU调度艺术 本文探讨了操作系统线程调度的核心问题,分析了多线程并发IO任务的高效原理和CPU调度机制。主要内容包括:1)多线程处理并发IO任务的优势;2)CPU在IO阻塞时的任务切换机制;3)线程调度的优先级策略;4)线程休眠的作用和实际应用。通过服务端-客户端的网络通信实例,深入解析了网络数据包接收过程中CPU的中断处理和任务调度流程,揭示了操作系统如何高效管理线程状态(运行、等待、就绪)以避免CPU资源浪费。文章还解答了Thread.sleep(0)的特殊用途等常见问题。 阅读详情

转载,有少部分个人理解和修改,红字标出

这是一个很好的关于并发/并行系统的问题。简单回答就是:IO所需要的CPU资源非常少。大部分工作是分派给DMA(Direct Memory Access)直接内存存取  完成的。

先不谈传统的5大IO模型,先说说并发(Concurrencey)。一个非常不严谨的解释就是同时做A和B两件事。先做一会儿进程A,然后上下文切换,再做一会儿B。过一会儿在切回来继续做A。因此给我们造成一个假象,我们同时在做A和B两件事。这就是著名的进程模型。

这看上去很炫酷,但实际上并没有任何卵用。因为A,B两件事你都得做完不是?不论你是做完A再做B还是来回切换,花得时间应该是一样的。甚至还要更多,因为还要考虑到上下文切换的开销。所以我第一次学到并发进程模型的时候,心里是一万个白眼。(深有同感)

但是,如果计算机内部不止CPU一个部件在工作呢?如果A这件事CPU可以分派给其他部件帮它完成呢?情况是不是就完全不一样了?系统IO正好是这样一个完美的例子。

对于磁盘IO,真实发生的场景可能是这样的:

CPU说:硬盘兄帮我把我要看的小电影拷贝一份到主存,谢谢,亲。
硬盘说:好的!我考完了叫你。
CPU说:么么哒!那我打游戏去啦!
...
CPU打撸啊撸 (100纳秒过去了)
...
硬盘说:小C我考完了。
CPU说:苍老师我来啦!

当然我们也可以到网上下载苍老师的作品,这就是网络IO。但情况基本是一样的,CPU童鞋在等小电影的过程中,打了一局撸啊撸。

所以,正因为这样派发任务,通讯,等待的过程,并发系统才彰显出它的意义。当然实际过程可能比这个复杂一万倍。比如CPU是不会直接和硬盘对话的,他们之间有个中间人,叫DMA(Direct Memory Access)芯片

CPU计算文件地址 ——> 委派DMA读取文件 ——> DMA接管总线 ——> CPU的A进程阻塞,挂起——> CPU切换到B进程 ——> 
DMA读完文件后通知CPU(一个中断异常)——> CPU切换回A进程操作文件

这个过程,对应下图(图源:《UNIX网络编程》),看到application这一列时间线了吗?aio_read操作之后,都是空白,CPU就不管了,可以做其他事去了。

假设原先读取文件CPU需要傻等50纳秒。现在尽管两次上下文切换要各消耗5纳秒。CPU还是赚了40纳秒时间片。一看上面这张图就知道,刚才讲的是传统5大IO模型中的“异步IO”的大致过程。想进一步了解,推荐直接读《UNIX网络编程》第一册套接字,经典哦!

计算机硬件上使用DMA来访问磁盘等IO,也就是请求发出后,CPU就不再管了,直到DMA处理器完成任务,再通过中断告诉CPU完成了。所以,单独的一个IO时间,对CPU的占用是很少的,阻塞了就更不会占用CPU了,单线程环境下会导致程序都不继续运行了,在多线程环境下,CPU会把时间交给其它线程和进程了。

那么问题来了,这个IO操作会阻塞多久?CPU什么时候会切回到原线程并继续执行?这里涉及到上文提到的IO通信模型,可以参考另外一篇文章。

以上是基于单核并发讨论的,双核并行下其实也是同理,只是我多想了个问题,双核下,每个CPU之间是如何通信的,也有所谓的上下文吗?由于委实对这些没有丝毫了解,也不太需要深入,所以就放弃了。

虽然IO不会占用大量的CPU时间,但是非常频繁的IO还是会非常浪费CPU时间的,所以面对大量IO的任务,有时候是需要算法来合并IO,或者通过cache来缓解IO压力的。

 

IDEA的CPU占用率高问题解决方法 前言:这段时间发现 IDEA 的 CPU 占用率猛涨,时不时就飙升到百分之7、80,使得敲代码的体验感十分不佳,在经过一番查找之后终于解决了问题,在此记录一下 IDEA的CPU占用率高问题解决方法 问题定位 我们先定位一下为什么IDEA的CPU占用率会变高。 电脑内存不足? 这个问题我在19年也遇到过,那时候的 8G 内存属实不太能带的动 IDEA ,开了IDEA 后 CPU 基本上都是在疯狂跑,然后我换了内存条之后才好转了,但是这次明显不是,因为我换成 32G 的内存之后还是没有好转… 安装的插件. 阅读详情

相关推荐

jbd2/dm-0-8占用CPU的问题分析与解决

jbd2/dm-0-8占用CPU的问题分析与解决 0x00 问题的发现 有一台流媒体服务器,运行的是VOD服务,在并发上升时服务器的CPU load average 持续上升。在查找原因的过程中发现,top 里的 wa 也比较高,问题的原因可能是IO效率降低; 0x01 iotop 查找占用IO的进程 [root@ubuntu ~]# iotop Total DISK READ : 0.00 B/s | Total DISK WRITE : 7.74 M/s A

小瑞的专栏 3985

I/O会一直占用CPU吗?

为什么80%的码农都做不了架构师?>>> ...

weixin_34185364的博客 950

我的老款Intel MacBook Pro,如何用OpenVINO把本地大模型推理速度提升10倍?

本文详细介绍了如何在老款Intel MacBook Pro上使用OpenVINO工具包将本地大模型推理速度提升10倍。通过对比Ollama CPU原生、Transformers原生和OpenVINO优化三种方案,展示了OpenVINO在性能优化上的显著优势,并提供了从环境配置到模型转换、性能调优的完整实战指南。

weixin_28694295的博客 297

io等待为什么引发cpu过高_一文搞懂,网络IO模型

IO(input output)主要指:文件IO,网络IO。今天我们重点讨论的是网络IO首先我们要对这两种IO操作有个宏观上的认识:上图描述的是文件IO的大致耗时,查阅资料可知:网络IO的耗时也是在微秒级别,跟磁盘IO差不多。从中我们能得出一些结论:CPU处理数据的速度远远大于IO准备数据的速度。因此网络IO性能优化是工程师们一直在努力的方向。Socket是什么呢?可能很多人对socket的认识是...

weixin_42511396的博客 3997

ubuntu20.04安装UE4+Airsim环境

版本UE4.27+Airsim1.81

玖茸的博客 3380

RISC-V IP中的ITCM/DTCM与Slave-AHB接口设计解析

本文深入解析RISC-V IP中ITCM/DTCM与Slave-AHB接口的设计要点,涵盖TCM架构原理、总线协议实现及性能优化策略。通过实际案例展示如何实现单周期访问延迟,解决跨时钟域同步等关键问题,为嵌入式系统提供确定性内存访问方案。特别探讨了AHB总线仲裁机制和RTL实现技巧,助力开发者构建高效可靠的RISC-V处理器子系统。

weixin_28419039的博客 529

操作系统:为什么IO操作不占用CPU却会导致进程阻塞?Web服务器每接收一个请求都会创建一个新的线程吗?Tomcat服务器工作原理?

操作系统:为什么IO操作不占用CPU却会导致进程阻塞?Web服务器每接收一个请求都会创建一个新的线程吗?Tomcat服务器工作原理?

天行健 君子以自强不息,地势坤 君子以厚德载物。 5801

高德地图轨迹回放,消息框内展示车辆速度且随车辆移动-升级支持调整速度、回放进度

使用高德地图回放车辆GPS轨迹,并添加速度和回放进度条,并支持调整,效果如下: 新增的功能: 在基础版本,有如下升级 速度条:可以拖动以调整车辆回放速度,且从当前位置继续回放 进度条:进度条表示车辆已回放的百分比,且拖动进度条车辆定位到相应的位置并继续回放 ###思路分析 高德和marker回放相关的API //主要靠他回放 moveAlong(path:Array,speed:Number,f:Function,circlable:Boolean) //点移动到另一个位置,移动进度条车辆跟随移动

博客 1万+

磁盘IO-为什么说IO密集型很少消耗CPU资源?

我们都知道磁盘io,网络io,是不会消耗cpu资源的,但是说原理,你说得清么? 今天我们就从底层原理,简单直白的说清楚,为什么磁盘io很少消耗CPU资源。 一、内核缓冲区与用户缓冲区 我们知道应用程序因为调用权限限制,分为用户态和内核态。 当我们需要把应用程序里面的数据写入到磁盘或者网络的时候,就需要将数据从用户空间,写入到内核空间,图示: 第一步cpu复制,是用户缓冲区,到内核缓冲区是cpu来操作的。 第二部从内核缓冲区到磁盘,是交给了DMA(Direct Memory Access)直接内存访问。

lz710117239的博客 3376

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 604

华为OD机试真题-查找单入口空闲区域(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【查找单入口空闲区域】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 查找单入口空闲区域。

qq_45776114的博客 1268

IO会一直占用CPU吗?一个很好的关于并发/并行系统的问题(转)

IO会一直占用CPU吗?一个很好的关于并发/并行系统的问题

weixin_45743816的博客 1346

麒麟操作系统安装教程(保姆级)

本文介绍了如何在VM中安装麒麟操作系统,文章详细的介绍了麒麟操作系统按钻过步骤。

啊渊的专栏 1万+

IO频繁读取占用CPU资源?

IO频繁读取占用CPU资源? 参考链接: https://blog.youkuaiyun.com/qq_29454347/article/details/84997053 https://www.zhihu.com/question/27734728 场景:因为最近在做python与mysql数据传递,通过多线程多进程等加快读取速度,减小消耗的问题。因其中计算量很少,多为数据的写入与读取,认为可视为IO密集型操作。 IO密集型定义:CPU消耗很少,任务的大部分时间都是在等待IO操作完成。(IO的速度远远低于CPU和内存

weixin_40065538的博客 5843

华为OD机试 - 城市聚集度(Python/JS/C/C++ 2025 A卷 200分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1129

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux的CPU占用脚本、内存占用脚本和硬盘IO测试代码

文章目录说明【必看】CPU占用代码测试内存占用代码测试硬盘IO测试hdparm命令dd命令硬盘IO写速度测试硬盘IO读速度测试创建一个自定义大小的文件 说明【必看】 下面占用代码,虽然已经很详细了,但没有一定linux基础 要谨慎操作,操作前最起码要熟悉每行代码功能,知道自己在干嘛!!!【如果占用出现意外不释放等情况不会解决就是个大麻烦】 CPU占用 代码 这个脚本功能如下【这个脚本不难,代码就不做解释了】 1、想占用多少颗CPU【被占用的cpu使用率会是100%】 2、占用多长时间【单位是秒】 3、占

崔崇鑫的博客,你linux/云运维工作中的百科全书。 9912

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

CPU内存磁盘IO过高问题处理

CPU占用过高分析 可以用top命令查看哪一个进程占用cpu高 或者哪一个占用内存大 top - 13:55:32 up 59 days, 19:18, 2 users, load average: 0.00, 0.04, 0.09 Tasks: 161 total, 1 running, 160 sleeping, 0 stopped, 0 zombie %Cpu(s): ...

@峰的博客 8982

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

并发问题的根源:CPU/内存/IO设备的速度差异

CPU、内存、IO设备的速度差异 程序整体的性能取决于最慢的操作 — 读写IO设备 为了合理利用CPU的高性能,平衡三者的速度差异,计算机体系结构、操作系统、编译程序做了以下优化: CPU增加了缓存,以均衡与内存的速度差异; 操作系统增加了进程、线程,以分时复用CPU,进而均衡CPU与I/O设备的速度差异; 编译程序优化指令执行顺序,使得缓存能够更加合理的利用。 并发程序的问题根源 1.缓存导致的可见性问题 单核时代:所有的线程都是在一颗CPU上执行,一个线程对缓存的写,另一个线程一定是.

码上一元 2606

IO是否会一直占用CPU?(转)

原文来自知乎:https://www.zhihu.com/question/27734728 这是一个很好的关于并发/并行系统的问题。简单回答就是:IO所需要的CPU资源非常少。大部分工作是分派给DMA(Direct Memory Access)直接内存存取 完成的。 先不谈传统的5大IO模型,先说说并发(Concurrencey)。一个非常不严谨的解释就是同时做A和B两件事...

weixin_30364325的博客 416

asyncio + 线程池:Python 混合并发模型解决 CPU/IO 绑定交错难题

Python 的混合并发模型是解决 CPU/IO 交错负载的务实方案。asyncio 处理 IO 协程调度,ThreadPoolExecutor 处理阻塞 IO,ProcessPoolExecutor 处理 CPU 密集计算,三者通过统一编排。核心工程要点:进程池只传小对象以减少序列化开销,子进程函数内部做异常兜底,线程池和进程池的大小需要根据实际负载动态调整。混合模型适合 CPU 任务耗时较长、请求并发较高的场景,轻量场景下简单的更经济。改写总结:删除填充短语。

2401_87746054的博客 5219

IO密集型操作是否占用CPU资源?从线程阻塞到DMA的全面剖析

IO密集型操作中,线程因阻塞等待IO(如网络/磁盘操作)时,现代操作系统会将其挂起,不占用CPU资源,主要依赖DMA技术实现硬件级数据传输。但高并发场景下,大量线程的切换与调度仍会带来间接性能损耗。异步非阻塞IO模型(如epoll、Netty)通过事件驱动机制进一步优化,减少线程数量,提升吞吐。结论:IO阻塞本身不消耗CPU,但需合理控制线程规模,并优先选择支持DMA的硬件和异步IO模型以提升效率。

qq_46371374的博客 1343

CPU占用过高问题的排查及解决

CPU占用过高问题的排查及解决 排查步骤 1.使用top 定位到占用CPU高的进程PID 然后按shift+p按照CPU排序 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 第一行,任务队列信息,同 uptime 命令的执行结果 系统时间:07:27:05 ...

weixin_41563161的博客 1万+

cpu占不上去问题总结

背景 近期,在12服务器上测试时发现,多线程工具开满核后,cpu只能占到50%,占不上去。故今天花了一天的时间,专门解决cpu占不上去的问题。 说明:查看系统CPU负载及使用率的命令为:top vmstat top 命令:查看进程级别的cpu使用情况。 vmstat 命令:查看系统级别的cpu使用情况。 说明: r: 表示系统中 CPU 等待处理的线程。由于 CPU 每次只能处理一个线程,所以,该数值越大,通常表示系统运行越慢。 us:用户模式消耗的CPU时间百分比。该值较高...

zhou961413764的博客 1万+

JVM内存、CPU占用过高问题定位

JVM内存、CPU占用过高问题排查

weixin_44102162的博客 4805

CPU密集型与IO密集型

一、CPU密集型(CPU bound) CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存), I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。 在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。 例如,一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属

Jak的博客 5941
上一篇: 1024
下一篇: 并发和并行的区别?一个很容易混淆,被忽略的问题
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值