我们都知道磁盘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资源少的结论