标签:DMA cpu 内核 IO 缓冲区 磁盘 数据 CPU
我们都知道磁盘io,网络io,是不会消耗cpu资源的,但是说原理,你说得清么?
今天我们就从底层原理,简单直白的说清楚,为什么磁盘io很少消耗CPU资源。
一、内核缓冲区与用户缓冲区
我们知道应用程序因为调用权限限制,分为用户态和内核态。
当我们需要把应用程序里面的数据写入到磁盘或者网络的时候,就需要将数据从用户空间,写入到内核空间,图示:
- 第一步cpu复制,是用户缓冲区,到内核缓冲区是cpu来操作的。
- 第二部从内核缓冲区到磁盘,是交给了DMA(Direct Memory Access)直接内存访问。
- outputStream.write方法,你可以任务数据写入到了用户数据缓冲区
- 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 来源: https://blog.csdn.net/lz710117239/article/details/123610632
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。