图解|零拷贝Zero-Copy技术大揭秘
1.前言像大白这种调包侠 , 深知不懂底层技术点就如同空中楼阁 , 再这样下去面阿里p10是没希望了 。
文章插图
想到这里 , 我开始慌了 , 所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy 。
Linux系统中一切皆文件 , 仔细想一下Linux系统的很多活动无外乎读操作和写操作 , 零拷贝就是为了提高读写性能而出现的 。
废话不多说 , 马上开大车 , 走起!
文章插图
2. 数据拷贝基础过程在Linux系统内部缓存和内存容量都是有限的 , 更多的数据都是存储在磁盘中 。 对于Web服务器来说 , 经常需要从磁盘中读取数据到内存 , 然后再通过网卡传输给用户:
文章插图
上述数据流转只是大框 , 接下来看看几种模式 。
2.1 仅CPU方式
- 当应用程序需要读取磁盘数据时 , 调用read()从用户态陷入内核态 , read()这个系统调用最终由CPU来完成;
- CPU向磁盘发起I/O请求 , 磁盘收到之后开始准备数据;
- 磁盘将数据放到磁盘缓冲区之后 , 向CPU发起I/O中断 , 报告CPU数据已经Ready了;
- CPU收到磁盘控制器的I/O中断之后 , 开始拷贝数据 , 完成之后read()返回 , 再从内核态切换到用户态;
文章插图
2.2 CPU --tt-darkmode-color: #A3A3A3;">CPU的时间宝贵 , 让它做杂活就是浪费资源 。
直接内存访问(Direct Memory Access) , 是一种硬件设备绕开CPU独立直接访问内存的机制 。 所以DMA在一定程度上解放了CPU , 把之前CPU的杂活让硬件直接自己做了 , 提高了CPU效率 。
目前支持DMA的硬件包括:网卡、声卡、显卡、磁盘控制器等 。
文章插图
有了DMA的参与之后的流程发生了一些变化:
文章插图
最主要的变化是 , CPU不再和磁盘直接交互 , 而是DMA和磁盘交互并且将数据从磁盘缓冲区拷贝到内核缓冲区 , 之后的过程类似 。
“
【敲黑板】无论从仅CPU方式和DMA --tt-darkmode-color: #F83929;">”
我们继续思考Web服务器读取本地磁盘文件数据再通过网络传输给用户的详细过程 。
3.普通模式数据交互一次完成的数据交互包括几个部分:系统调用syscall、CPU、DMA、网卡、磁盘等 。
文章插图
系统调用syscall是应用程序和内核交互的桥梁 , 每次进行调用/返回就会产生两次切换:
- 调用syscall 从用户态切换到内核态
- syscall返回 从内核态切换到用户态
文章插图
来看下完整的数据拷贝过程简图:
文章插图
读数据过程:
- 应用程序要读取磁盘数据 , 调用read()函数从而实现用户态切换内核态 , 这是第1次状态切换;
- DMA控制器将数据从磁盘拷贝到内核缓冲区 , 这是第1次DMA拷贝;
- CPU将数据从内核缓冲区复制到用户缓冲区 , 这是第1次CPU拷贝;
- 更新了!深入浅出图解Git,入门到精通(保姆级教程)第三篇
- 图解|什么是高并发利器NoSQL
- 理解JavaScript中的浅拷贝与深拷贝
- 图解3种常见的深度学习网络结构:FC、CNN、RNN
- 数据库|15张图解Redis为什么这么快