分析|零拷贝Zero-Copy技术大公开
应用程序要读取磁盘数据,调用read()函数从而实现用户态切换内核态,这是第1次状态切换; DMA控制器将数据从磁盘拷贝到内核缓冲区,这是第1次DMA拷贝; CPU将数据从内核缓冲区复制到用户缓冲区,这是第1次CPU拷贝; CPU完成拷贝之后,read()函数返回实现用户态切换用户态,这是第2次状态切换; 写数据过程: 应用程序要向网卡写数据,调用write()函数实现用户态切换内核态,这是第1次切换; CPU将用户缓冲区数据拷贝到内核缓冲区,这是第1次CPU拷贝; DMA控制器将数据从内核缓冲区复制到socket缓冲区,这是第1次DMA拷贝; 完成拷贝之后,write()函数返回实现内核态切换用户态,这是第2次切换; 综上所述: 读过程涉及2次空间切换、1次DMA拷贝、1次CPU拷贝; 写过程涉及2次空间切换、1次DMA拷贝、1次CPU拷贝; 可见传统模式下,涉及多次空间切换和数据冗余拷贝,效率并不高,接下来就该零拷贝技术出场了。 零拷贝技术 出现原因 我们可以看到,如果应用程序不对数据做修改,从内核缓冲区到用户缓冲区,再从用户缓冲区到内核缓冲区。两次数据拷贝都需要CPU的参与,并且涉及用户态与内核态的多次切换,加重了CPU负担。 我们需要降低冗余数据拷贝、解放CPU,这也就是零拷贝Zero-Copy技术。 解决思路 目前来看,零拷贝技术的几个实现手段包括:mmap+write、sendfile、sendfile+DMA收集、splice等。 mmap是Linux提供的一种内存映射文件的机制,它实现了将内核中读缓冲区地址与用户空间缓冲区地址进行映射,从而实现内核缓冲区与用户缓冲区的共享。 这样就减少了一次用户态和内核态的CPU拷贝,但是在内核空间内仍然有一次CPU拷贝。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- linux – 使用BlueZ堆栈作为外设时错误的有效负载
- 魅族路由器app怎么设置 怎么使用 魅族路由器app评测
- install keepalived on RedHat/CentOS to provide IP failo
- AlphaGo为什么这么厉害 谷歌AlphaGo厉害之处分析解疑
- 红米note3怎么root 红米note3怎么获取root权限
- OPPO F1 Plus功能介绍 OPPO F1 Plus配置怎样
- 贱驴612蹄子怎么样?贱驴612蹄子机械键盘使用评测
- Linux如何查出22端口现在运作什么程序
- 手机qq购物号怎么删除 手机qq购物号怎么取消
- 手心输入法怎么样 手心输入法和搜狗输入法哪个好