首页 > 其他分享 >磁盘IO-为什么说IO密集型很少消耗CPU资源?

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

时间:2022-12-21 12:06:35浏览次数:94  
标签:DMA cpu 内核 IO 缓冲区 磁盘 数据 CPU


我们都知道磁盘io,网络io,是不会消耗cpu资源的,但是说原理,你说得清么?

今天我们就从底层原理,简单直白的说清楚,为什么磁盘io很少消耗CPU资源。

一、内核缓冲区与用户缓冲区

我们知道应用程序因为调用权限限制,分为用户态和内核态。

当我们需要把应用程序里面的数据写入到磁盘或者网络的时候,就需要将数据从用户空间,写入到内核空间,图示:

磁盘IO-为什么说IO密集型很少消耗CPU资源?_用户缓冲区

  1. 第一步cpu复制,是用户缓冲区,到内核缓冲区是cpu来操作的。
  2. 第二部从内核缓冲区到磁盘,是交给了DMA(Direct Memory Access)直接内存访问。
  3. outputStream.write方法,你可以任务数据写入到了用户数据缓冲区
  4. flush方法,你可以任务是刷新到内核缓冲区写入磁盘

二、为什么说IO密集cpu用的少?

从上图,我们知道,

  • 缓冲区的拷贝是cpu来做的
  • 将数据刷盘,是交给了DMA
  • 当DMA刷盘结束,会产生中断,通知cpu继续执行

因此就可断定io密集型消耗cpu少:

  • 如果我们把内存数据复制的速度(ns级别),比作高铁的速度,那么数据刷入磁盘的速度(ms级别),就是相当于步行,中间差了1000倍以上。
  • 写缓冲区的内存操作是cpu来做,刷盘是DMA来做
  • 通过速度对比,我们知道,就算磁盘IO达到极限,cpu消耗也就是千分之一不到(仅仅是说写数据哈,因此cpu还有很多与复制数据无关的计算逻辑,所以整体上cpu不会使用那么少,但肯定不会高)。

三、总结

这篇文章我们说了:

  • 应用程序写数据的时候会先写入到应用数据缓冲区
  • 应用数据缓冲区的数据要复制到内核缓冲区然后刷盘
  • 刷盘是交给DMA执行的,速度是ms级别
  • 内存数据复制由cpu来操作,速度是ns级别

由此我们得出了为什么IO密集型消耗cpu资源少的结论


标签:DMA,cpu,内核,IO,缓冲区,磁盘,数据,CPU
From: https://blog.51cto.com/u_11970680/5959687

相关文章

  • Visual Studio 2015从Gitee同步代码
    ​ 1.文件>打开> 在源代码管理中打开: 2.克隆>URL处填入Gitee项目的HTTPS的URL链接地址,以及本地库的路径:3.双击Git库: 4.在资源管理界面上进行想弄的......
  • What Is A Web Application Firewall?
    AnIntroductiontoaWebApplicationFirewallorWAFAwebapplicationfirewall(WAF)provides webapplicationsecurity foronlineservicesfrommalicio......
  • Android Studio中的神操作
    原文转载自:简书:柴泽建_jack网址:http://www.jianshu.com/p/bc8f6bfe12c6作为一个Android开发者,最常使用的就是AndroidStudio了,我在这里声明AndroidStudio比Eclipse好用......
  • 08【AIO编程】
    八、AIO编程8.1AIO编程简介8.1.1AIO编程概述AIO也叫异步非阻塞,JDK1.7之后的新特性,AIO引入异步通道的概念,采用了Proactor模式,简化了程序编写,有效的请求才启动线程,它的特......
  • 面试官:讲讲session的持久化
    一、session知识回顾1.1session何时创建?默认第一次访问时,使用到了HttpSession就会创建(request.getSession),访问JSP时由于会自备九大内置对象,因此也会创建session1.2session......
  • java.lang.ClassNotFoundException
    当你用Eclipse或者MyEclipse运行javaweb项目时,发现连接数据库失败,出现提示java.lang.ClassNotFoundException,你确定你的jar包添加了,那么很有可能是你项目的本地lib没有......
  • java.sql.SQLException: No value specified for parameter 12
    Stringsql="updatedishessetfoodName=?,foodPrice=?,foodWeight=?,cost_performance=?,address=?,date=?,firstCategoty=?,secondCategory=?,foods=?,......
  • 使用OptionMenu在屏幕中自定义自己的菜单
    菜单是用户界面最常用的,使用最频繁的元素之一,在Android中的菜单被分为3种,分别是选项菜单(OptionMenu),上下文菜单(ContextMenu)和子菜单(SubMenu),在本实例中使用了Optio......
  • java.sql.SQLSyntaxErrorException
    YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'right)values('wdq','wdq......
  • JSP application对象及其常用方法
    application对象及其常用方法<%@pageimport="java.util.Enumeration"%><%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DO......