Linux 的零拷贝技术

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Jmilk/article/details/98949655

目录

Linux I/O 缓存背景

当请求文件服务器的下载功能时,服务端程序所做的事情是:将服务器磁盘中的文件不做修改地从已连接的 Socket 发送到客户端,通常使用下面的代码完成:

while ((n = read(diskfd, buf, BUF_SIZE)) > 0)
    write(sockfd, buf , n);

该程序的基本操作就是循环的从磁盘读入文件内容到缓冲区,再将缓冲区的内容发送到 Socket。Linux I/O 操作默认是缓冲 I/O,主要使用了 read()write() 这两个系统调用。当应用程序访问某块数据时,操作系统首先会检查最近是否访问过此系统,文件内容是否缓存在了内核缓冲区。如果是,操作系统则直接根据 read() 传入的 buf 地址,将内核缓冲区中的内容拷贝到 buf 地址所指向的用户空间缓冲区中;如果不是,操作系统则首先将磁盘上的数据拷贝的内核缓冲区,这一步主要依靠 DMA(直接存储器存取)来传输,继而再把内核缓冲区上的内容拷贝到用户空间缓冲区。接下来,write() 再把用户缓冲区的内容拷贝到网络堆栈相关的内核缓冲区中,最后 Socket 再把内核缓冲区的内容发送到网卡上。

可见,上述简单的 I/O 操作,实际上发生了多次的数据拷贝。与此同时,在用户态、内核态运行模式的切换也会产生多次 CPU 上下文切换,无疑也加重了 CPU 的性能损耗。
在这里插入图片描述
问题的关键在于,在文件下载的过程中,我们并不需要对文件的内容做任何修改,那么这种缓存式的 I/O 操作就显得非常的无谓了。零拷贝技术主要就是为了解决这种低效性。

零拷贝技术(Zero-Copy)

零拷贝是一种数据传输的优化思想,主要任务是避免进行不必要的数据拷贝动作。主要的优化思路有两类:

  • 针对特定应用场景,去除完成不必要的拷贝。
  • 优化拷贝过程,例如:让别的组件来承接这一类简单的数据传输任务,继而释放 CPU,让系统资源的利用更加有效。

参考文章

https://mp.weixin.qq.com/s/3H26Yqa8pp5g3BYEGgaAXw
https://mp.weixin.qq.com/s/GtNrVAvqsnzYSoGiqoI-0A

猜你喜欢

转载自blog.csdn.net/Jmilk/article/details/98949655