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

2023-10-31

这是一个很好的关于并发/并行系统的问题。简单回答就是: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网络编程》第一册套接字,经典哦!
虽然IO不会占用大量的CPU时间,但是非常频繁的IO还是会非常浪费CPU时间的,所以面对大量IO的任务,有时候是需要算法来合并IO,或者通过cache来缓解IO压力的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • python之路-untitest单元测试框架组件使用详细介绍

    文章目录 unittest xmind思维导图 UnitTest介绍 TestCase TestSuite TextTestRunner TestLoader TestSuite和TestLoader的使用区别 小结 Fixture 方法级
  • 北京政府占股扶持机构

    1 北京中关村发展集团股份有限公司 2 北京中海投资管理有限公司 http www zhtzgl cn 3 北京首都科技集团有限责任公司 4 亦庄国际 http www etowncapital com zjtz columnsId 40
  • Linux线程知识总结

    1 编程头文件
  • react-实现页面跳转

    Link a标签 需设置path属性 值为路径 点击后会跳转到指定的路径 Router 用来包裹整个组件 Route 指定对应路径所展示的组件 Route写在哪里组件就展示在哪里 路由会给组件提供history属性 在this props里
  • Transformers训练预处理datasets出现Socket Timeout

    原因 ddp的时候默认等待时间是1800s 如果超出这个时间程序就会退出 解决方法 更新transformers库 低版本不支持如下方式 并添加参数 ddp timeout 3600 这里3600s只是demo 具体根据自身程序来设置
  • 手把手前端入门笔记之vue-element-admin-01

    前言 本文主要为vue element admin框架的入门教程 本人2年后端开发经验 想自学前端转全栈工程师 听着就好酷 直接上手实战应该是入门前端最快的方式了 在此记录下学习过程 希望可以对初学者有所帮助 如有错误或未考虑完全的地方 望
  • 以太坊使用puppeth工具

    puppeth源于官方的项目编译后 https github com ethereum go ethereum即可得到要得到的内容 只想用工具 不想自己编译 博主编译了一份所有的工具都有 下载 https download csdn net
  • LeetCode题目笔记——面试题 01.03. URL化

    文章目录 题目描述 题目难度 简单 方法一 替换空格 代码 Python 方法二 构造新字符串 代码 Python C 方法三 将 20插入到原字符串中 总结 题目描述 URL化 编写一种方法 将字符串中的空格全部替换为 20 假定该字符串
  • Weblogic 12c 集群环境搭建

    本文是在windows7操作系统下配置的 jdk版本1 7 weblogic版本12 1 3 0 0 搭建集群前的规划 其中AdminServer是总控制端 server1 server2 server3是集群中的三个服务节点 其中Admi
  • vue2 new Date() 转换为年月日时分秒以及星期几(padStart补零) - 附完整示例

    new Date 效果 2022年07月12日 星期二 17 19 29 一 new Date 在vue2中使用new Date 转换为年月日时分秒以及星期几 padStart补零 二 使用步骤 1 data中声明定时器以及在methods
  • Sketch装机必备!10款Sketch 插件使用率超高!

    本文给大家推荐和整理了 10款 使用率超高的 Sketch 插件 Sketch 是一款深受 UI 设计师欢迎的 UI 设计工具 由于其轻便的格式 简洁的 UI 界面操作 很快风靡 UI 设计行业 其 Sketch 的插件尤为强大 可谓是让
  • matlab练习程序(线性分类器<最小二乘>)

    clear all close all clc num 4 元素数量 k 180 迭代次数 step 0 1 迭代步长 w 1 0 5 1 1 权值 x 1 0 0 输入的值 每行为一组 1 1 0 1 0 1 1 1 1 d 1 0 1
  • 两种产生随机数的方式之间的对比(Math.random()方法 和 Random类)

    在实际开发中 产生随机数的使用很普遍 而在JAVA中主要提供了两种方式产生随机数 其一 调用Math类中的random 方法 其二 使用Random类 一 Math random 方法 基本概述 这个方法能够产生在 0 0 1 0 之间的随
  • VueCli3+vue2.6兼容ie11

    一 首先确定babel polyfill版本号 babel polyfill 7 4 0以前使用babel polyfill 之后使用core js stable 和 regenerator runtime 可参考官方文档babel pol
  • Redis报错 Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

    cmd窗口输入 redis server exe redis windows conf 报错 Creating Server TCP listening socket 127 0 0 1 6379 bind No error 解决方法 cm
  • 【毕业设计】图像处理-毕业设计-相关题目-含matlab源代码

    毕业设计 0001 基于图像处理的一维条形码识别 含MATLAB源码 毕业设计 0002 一种图像中值滤波 边缘检测 hough变换检测直线的用户界面开发 含matlab源代码 如有疑问 可私信博主 持续更新中
  • java文档注释的基本认识

    Java 程序员都应该知道 JDK 开发最好的帮助信息就来自 SUN 发布的 Java 文档 它分包分类地提供了各方法 属性的帮助信息 具有详细的类树信息 索引信息等 并提供了许多相关类之间的关系 如继承 实现接口 引用等 Java 文档全
  • 【JUC】浅析ConcurrentLinkedQueue

    JUC 浅析ConcurrentLinkedQueue 文章目录 JUC 浅析ConcurrentLinkedQueue 一 前言 二 ConcurrentLinkedQueue的结构 三 入队列 3 1 入队列的过程 3 2 定位尾节点
  • 联想笔记本使用linux时不能连接WiFi

    1 每次开机不能使用无线网 输入 rfkill list 发现ideapad laptop处于blocked yes状态 使用以下命令解除锁定便可以使用wifi sudo modprobe r ideapad laptop 2 将ideap
  • IO会一直占用CPU吗?一个很好的关于并发/并行系统的问题(转)

    这是一个很好的关于并发 并行系统的问题 简单回答就是 IO所需要的CPU资源非常少 大部分工作是分派给DMA Direct Memory Access 直接内存存取 完成的 先不谈传统的5大IO模型 先说说并发 Concurrencey 一