按关键词阅读:
本文图片
作者 | 小林coding
来源 | 小林coding(ID:CodingLin)
头图 |CSDN 下载自视觉中国
前言
磁盘可以说是计算机系统最慢的硬件之一 , 读写速度相差内存 10 倍以上 , 所以针对优化磁盘的技术非常的多 , 比如零拷贝、直接 I/O、异步 I/O 等等 , 这些优化的目的就是为了提高系统的吞吐量 , 另外操作系统内核中的磁盘高速缓存区 , 可以有效的减少磁盘的访问次数 。
这次 , 我们就以「文件传输」作为切入点 , 来分析 I/O 工作方式 , 以及如何优化传输文件的性能 。
本文图片
为什么要有 DMA 技术?
在没有 DMA 技术前 , I/O 的过程是这样的:
CPU 发出对应的指令给磁盘控制器 , 然后返回;
磁盘控制器收到指令后 , 于是就开始准备数据 , 会把数据放入到磁盘控制器的内部缓冲区中 , 然后产生一个中断;
CPU 收到中断信号后 , 停下手头的工作 , 接着把磁盘控制器的缓冲区的数据一次一个字节地读进自己的寄存器 , 然后再把寄存器里的数据写入到内存 , 而在数据传输的期间 CPU 是无法执行其他任务的 。
为了方便你理解 , 我画了一副图:
本文图片
可以看到 , 整个数据的传输过程 , 都要需要 CPU 亲自参与搬运数据的过程 , 而且这个过程 , CPU 是不能做其他事情的 。
简单的搬运几个字符数据那没问题 , 但是如果我们用千兆网卡或者硬盘传输大量数据的时候 , 都用 CPU 来搬运的话 , 肯定忙不过来 。
计算机科学家们发现了事情的严重性后 , 于是就发明了 DMA 技术 , 也就是直接内存访问(Direct Memory Access)技术 。
什么是 DMA 技术?简单理解就是 , 在进行 I/O 设备和内存的数据传输的时候 , 数据搬运的工作全部交给 DMA 控制器 , 而 CPU 不再参与任何与数据搬运相关的事情 , 这样 CPU 就可以去处理别的事务 。
那使用 DMA 控制器进行数据传输的过程究竟是什么样的呢?下面我们来具体看看 。
本文图片
具体过程:
用户进程调用 read 方法 , 向操作系统发出 I/O 请求 , 请求读取数据到自己的内存缓冲区中 , 进程进入阻塞状态;
操作系统收到请求后 , 进一步将 I/O 请求发送 DMA , 然后让 CPU 执行其他任务;
DMA 进一步将 I/O 请求发送给磁盘;
磁盘收到 DMA 的 I/O 请求 , 把数据从磁盘读取到磁盘控制器的缓冲区中 , 当磁盘控制器的缓冲区被读满后 , 向 DMA 发起中断信号 , 告知自己缓冲区已满;
DMA 收到磁盘的信号 , 将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中 , 此时不占用 CPU , CPU 可以执行其他任务;
当 DMA 读取了足够多的数据 , 就会发送中断信号给 CPU;
CPU 收到 DMA 的信号 , 知道数据已经准备好 , 于是将数据从内核拷贝到用户空间 , 系统调用返回;
可以看到 ,整个数据传输的过程 , CPU 不再参与数据搬运的工作 , 而是全程由 DMA 完成 , 但是 CPU 在这个过程中也是必不可少的 , 因为传输什么数据 , 从哪里传输到哪里 , 都需要 CPU 来告诉 DMA 控制器 。
早期 DMA 只存在在主板上 , 如今由于 I/O 设备越来越多 , 数据传输的需求也不尽相同 , 所以每个 I/O 设备里面都有自己的 DMA 控制器 。
稿源:(CSDN)
【】网址:http://www.shadafang.com/c/hn10049531C2020.html
标题:coding|原来 8 张图,就可以搞懂“零拷贝”了!