一、传统I/O数据传输过程
- 用户进程调用 read() 函数,发送上下文切换,用户进程由用户态切换成内核态,CPU向磁盘发起数据读取IO请求,然后返回;
- 磁盘控制器收到请求,就开始准备数据,把数据放入磁盘控制器的内存缓冲区中,然后产生一个中断;
- CPU收到中断信号,停下手头工作,开始把磁盘控制器缓冲区的数据一次一个字节地读入自己的内存缓冲区(磁盘高速缓存,PageCache),然后再把内核缓冲区中的数据拷贝到用户缓冲区,数据传输过程中CPU无法执行其他任务。
整个数据传输过程,都需要CPU参与,而且这个过程CPU是不能做其他事情的。如果只是少数几个字符传输是没问题,但是如果传输大量数据,就会异常繁忙,而且对其他程序而言,其长期占用CPU会导致其他程序无法正常运行。
二、DMA(Direct Memory Access,直接内存访问)技术
DMA技术:在进行I/O设备和内存的数据传输过程中,数据搬运工作全部交给DMA控制器,而CPU不再参与任何与数据搬运相关的工作,这样就可以让CPU去处理其他事务。
使用DMA技术IO数据传输过程
- 用户进程调用 read() 函数,向操作系统发起IO请求,请求读取数据到自己的内存缓冲区,进程进入阻塞状态;
- 操作系统受到请求后,进一步将IO请求发送给DMA,然后CPU可以执行其他任务;
- DMA进一步将IO请求发送给磁盘;
- 磁盘收到DMA的IO请求,把数据从磁盘读取到磁盘控制器缓冲区,当磁盘控制器缓冲区被写满后,向DMA发送中断信号,告知自己缓冲区已满;
- DMA收到磁盘中断信号,将磁盘控制器缓冲区数据拷贝到内核缓冲区;
- 当DMA读取到足够多的数据,就会向CPU发送中断信号,告知数据已读完;
- CPU收到DMA的信号,就知道数据已准备好,于是将数据从内核缓冲区拷贝到用户缓冲区,然后系统调用返回。
整个数据传输过程&#x