OS中的零拷贝

本文最后更新于:3 个月前

==传统的I/O的方式:==

数据的读取和写入需要从内核空间和用户空间之间来回的复制,而内核空间的数据则是通过操作系统的I/O从磁盘读取。这个过程需要发生多次的上下文切换和数据拷贝。image-20221121144602045


==传统I/O方式的弊端:==

发生多次的上下文切换和内存拷贝,导致IO性能低。

4次上下文切换和4次数据拷贝


==解决方案:零拷贝技术==

零拷贝主要有两种实现方案,分别是:

  • mmap + write
  • sendfile

==零拷贝的方式1:mmap + write:==

mmap()系统调用函数,会直接将内核空间中数据的映射到用户空间,二者通过相同的内存地址访问同一份数据,因此也就不需要数据拷贝。(类似于共享内存)

4次上下文切换和3次数据拷贝

image-20221121145454211

==零拷贝的方式2:sendfile:==

Linux 内核版本 2.1 中,提供了一个专门发送文件的系统调用,为 sendfile() ,这个系统调用可以直接将从硬盘 IO 进来的数据在内核空间直接发送到 socket 缓冲区,省去了先拷贝到用户空间这一步。

因此这一个命令替代了原来的 read() 和 write() 这两个命令。

因此就只有 2 次上下⽂切换,和 3 次数据拷⻉。

image-20221121150146299

==该技术的应用:==

很多开源项目如Kafka、RocketMQ都采用了零拷贝技术来提升IO效率。


OS中的零拷贝
https://alec-97.github.io/posts/441628142/
作者
Shuai Zhao
发布于
2022年11月21日
许可协议