什么是零拷贝?零拷贝的实现方式和原理

1. 什么是零拷贝?

是一种高效的数据传输技术,它可以将数据从内核空间直接传输到应用程序的内存空间中。
零拷贝是为了避免类似传统数据传输中不必要的数据拷贝,将数据直接传输到目标内存区域,以提高数据传输的效率。但是并不是真正的零次拷贝,而是以减少拷贝次数的方式进行数据传输。

优点:大幅度提升数据传输效率,减少了CPU和内存的开销,加速了数据传输过程。

2. 传统的数据传输方式

在这里插入图片描述
1.用户进程发出read()系统调用,触发上下文切换,从用户态转换到内核态。
2.CPU发起IO请求,通过直接内存访问(DMA)从磁盘读取文件内容,复制到内核缓冲区PageCache。
3.将内核缓冲区数据,拷贝到用户空间缓冲区,触发上下文切换,从内核态转换到用户态。
4.用户进程发起write系统调用,触发上下文切换,从用户态切换到内核态。
5.将数据从用户缓冲区拷贝到内核中与目的地Socket关联的缓冲区。
6.数据最终经由Socket通过DMA传送到网卡缓冲区,write()系统调用返回,并从内核态切换回用户态。

3. 实现方式和原理

3.1 Sendfile

原理:这是一种在网络传输中实现零拷贝的方式。sendfile() 是一种特殊的系统调用,它允许在内核空间和用户空间之间直接传输数据,避免了数据在内核和用户空间之间的额外拷贝。这在高性能的网络传输中非常有效。
特点:只需要两次拷贝,减少了从内核区->用户缓冲区->socket缓冲区的两次拷贝。
在这里插入图片描述
实现方式
1.用户进程发起 sendfile() 系统调用, 上下文(切换1)从用户态转向内核态。
2.DMA 控制器,把数据从硬盘中拷贝到内核缓冲区。
3.CPU 把内核缓冲区中的 文件描述符信息( 包括内核缓冲区的内存地址和偏移量)发送到 socket 缓冲区。
4.DMA 控制器根据文件描述符信息,直接把数据从内核缓冲区拷贝到网卡。
5.上下文(切换2)从内核态切换回用户态,sendfile() 调用返回。

3.2 Mmap

原理:是Linux提供的一种内存映射文件的机制,它实现了将内核缓冲区地址与用户空间缓冲区地址进行映射,从而实现内核缓冲区与用户缓冲区的共享。这样就减少了一次用户态和内核态的CPU拷贝,但是在内核空间内仍然有一次CPU拷贝。
特点:需要三次拷贝,mmap对大文件传输有一定优势,但是小文件可能出现碎片,并且在多个进程同时操作文件时可能产生引发coredump的signal。
在这里插入图片描述

3.3 Direct I/O

原理:Direct I/O 即直接 IO。其名字中的”直接”二字用于区分使用 page cache 机制的缓存 I/O,其他所有技术中,数据至少需要在内核空间存储一份,但是在 Direct I/O 技术中,数据直接存储在用户空间中,绕过了内核。如下图所示:
特点:只需要两次拷贝。
在这里插入图片描述

3.4 Splice

定义:splice() 调用通常用于管道(pipe)和套接字(socket)之间的数据传输,可以大幅提高数据传输的效率和性能。主要涉及两个文件描述符(file descriptor)之间的数据传输,其中一个是源文件描述符(source file descriptor),另一个是目标文件描述符(target file descriptor)。数据将从源文件描述符传输到目标文件描述符,或者反过来,而且在传输过程中数据不需要经过用户空间。如下图:
特点:它的两个文件描述符参数中有一个必须是管道设备。
在这里插入图片描述

4. 零拷贝技术的框架/中间件

  1. Kafka框架 – sendfIle
  2. RocketMQ中间件 – Mmap
  3. Netty框架 – Splice
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值