提前说明有些操作系统的相关概念自行百度,但是个人认为,很多面试官可能对于操作系统也懂的不多,当然不排除一些真正的大佬,往往面试的面试官也就那样,废话不多说,开始讲解普通IO的底层原理
- 早期的数据IO,由用户进程向CPU发起,应用程序与磁盘之间的 I/O 操作都是通过 CPU 的中断完成的,如下图
- 用户发起读取数据请求到CPU.
- CPU把请求转发到磁盘控制器中
- 磁盘控制器读取数据到磁盘缓冲区
- 磁盘寄存器发送中断信号给cpu
- CPU读取磁盘缓冲区的数据到寄存器中
- CPU再把寄存器中的数据读取到内存中
- 最后用户进程再把内存的数据读取,然后系统调用返回
我们再看一张图如下
从这种图中,我清晰可以看到由于CPU把数据从磁盘读取到寄存器中,然后放入到内存,中间CPU是不能干其他事情的,为了解放cpu的占用,所以出现了DMA技术
DMA技术
DMA 的全称叫直接内存存取(Direct Memory Access),是一种允许外围设备(硬件子系统)直接访问系统主内存的机制,之后数据的拷贝都有DMA进行处理,如下图
- CPU把IO请求发送给DMA,CPU可以干其他事情去了,同时用户进程阻塞
- DMA收到请求,将数据放到磁盘控制器的缓冲区中
- 当磁盘控制器缓冲区满了以后,通知DMA
- DMA接收到通知,把磁盘缓冲区的数据拷贝到内核缓冲区
- DMA再通知CPU已经读取完了
- CPU此时再把内核缓冲区拷贝到用户缓冲区中
- 最后系统调用返回
传统的IO底层原理
比如我们正常从磁盘中读取一张图片,返回给前端,首先会调用read进行读取,然后在write进行输出,整体流程如下
- 用户进程调用read进行第一次用户态到内核态的切换
- 磁盘收到请求,DMA会把磁盘缓冲区的数据拷贝到内存缓冲区完成第一次拷贝DMA拷贝
- 然后进行第二次内核态用户态的转换
- 把内核缓冲区的数据cpu拷贝到用户缓冲区,完成第二次CPU拷贝
- 用户进程调用write,进行第三次用户态到内核态的切换
- CPU再次把用户缓冲区的数据拷贝到socket缓冲区
- DMA再次把socket缓冲区的数据拷贝到网卡完成第四次DMA拷贝
- 最后从内核态切换到用户态,系统调用完成
总共四次拷贝,四次切换,代价属实有点点大,并且在数据传输的场景中,用户并不会对数据进行再加工,所以没必要将数据拷贝到用户缓冲区,因此有了零拷贝,这个我们下次再说