零拷贝技术

一、应用场景

  • 内核优化:快速上传/下载文件(fileChannel至socketChannel)
  • 内核优化:快速拷贝文件(fileChannel至fileChannel)

二、产生原因

  • 上传/下载文件:传统网络传输文件时,数据需要经过4次数据拷贝,分别为网卡到内核缓存、内核到用户缓存、用户到内核缓存、内核到磁盘,频繁切换用户态和内核态;
  • 拷贝文件:传统传输文件时,数据需要经过4次数据拷贝,分别为磁盘到内核缓存、内核到用户缓存、用户到内核缓存、内核到磁盘,频繁切换用户态和内核态;

三、解决方案

  • 零拷贝技术(初级版):解决内核和用户态间缓存数据拷贝和用户态切换

    // 解决内核和用户态间缓存数据拷贝和用户态切换
    import java.nio.channels.FileChannel;
    import java.nio.channels.SocketChannel;
    // 省略代码
    File file = new File("");
    FileChannel fileChannel = new FileInputStream(file).getChannel();
    SocketChannel socketChannel = socket.getChannel();
    // 数据经过3次数据拷贝、0用户态切换
    // 网卡到内核缓存、文件内核缓存到socket内核缓存、socket内核缓存到磁盘
    fileChannel.transferTo(0L, file.length(), socketChannel);
    
    
  • 零拷贝技术(升级版):scatter/gather解决初级班基础上,内核缓存间拷贝和内核发起的系统中断问题

    // 解决初级版基础上,内核缓存间拷贝问题
    ByteBuffer header = ByteBuffer.allocate(128);
    ByteBuffer body = ByteBuffer.allocate(1024);
    ByteBuffer[] byteBuffer = {header, body};
    // scatter分散数据
    fileChannel.read(byteBuffer);
    // gather重新聚集写入数据
    socketChannel.write(byteBuffer);
    
  • Kafka使用零拷贝技术(初级版)

    // 文件零拷贝
    // 数据经过3次数据拷贝、0用户态切换
    // 网卡到内核缓存、文件内核缓存到socket内核缓存、socket内核缓存到磁盘
    fileChannel.transferTo(0L, file.length(), socketChannel);
    

四、参数

参数 作用和优点 缺点
InputStream/OutputStream 数据流:磁盘、内核、用户、内核、磁盘
优点:实现简单
1、4次拷贝、4次内核切换
2、阻塞
fileChannel.transferFrom/transferTo 数据流:磁盘、内核、内核、磁盘
优点:减少拷贝、内核切换次数
1、3次拷贝、0次内核切换
2、伪零拷贝(内核到内核)
scatter/gather 数据流:磁盘、内核、磁盘
优点:减少拷贝、内核切换次数
1、2次拷贝、0次内核切换
2、传输时不能更改数据
3、真零拷贝
posted @   SArtOnline  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示