13.零拷贝

零拷贝:不需要将数据放入到java的缓存中。 

  • 更少的用户态与内核态的切换。
  • 不利用cpu计算,减少cpu缓存伪共享。
  • 零拷贝适合小文件传输。

需求

读取服务器的一个文件,通过socket的API发送到客户端。

伪代码

File f = new File("D:/data.txt");
RandomAccessFile file = new RandomAccessFile(file, "r");

byte[] buf = new byte[(int)f.length()];
file.read(buf);

Socket socket = ...;
socket.getOutputStream.write(buf);

工作流程

磁盘->内核缓冲区->用户缓冲区->socket缓冲区->网卡

有四次拷贝,用户态与内核态切换了三次。(java->操作系统->回到java->又调用操作系统)

NIO优化

通过ByteBuffer + channel实现

实现方案:从FileChannel读,向byteBuffer写,从byteBuffer读,向SocketChannel写。

优化一:

ByteBuffer分类
1

相关推荐

  1. 13.拷贝

    2024-06-16 04:56:04       31 阅读
  2. 拷贝技术

    2024-06-16 04:56:04       60 阅读
  3. 什么是拷贝

    2024-06-16 04:56:04       33 阅读
  4. 手写实现 nginx-10-sendfile 拷贝 zero-copy

    2024-06-16 04:56:04       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 04:56:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 04:56:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 04:56:04       82 阅读
  4. Python语言-面向对象

    2024-06-16 04:56:04       91 阅读

热门阅读

  1. 【定义通讯数据类型】LCM搭建系统通讯

    2024-06-16 04:56:04       38 阅读
  2. Cesium4Unreal - # 011 加载显示geojson

    2024-06-16 04:56:04       35 阅读
  3. Spring Boot 项目中的 GC Root

    2024-06-16 04:56:04       32 阅读
  4. Docker常用命令

    2024-06-16 04:56:04       30 阅读
  5. mysql 分组后每个取最新的一条记录

    2024-06-16 04:56:04       28 阅读
  6. 常用的工具:pdf转换器、流程图

    2024-06-16 04:56:04       32 阅读
  7. Linux系统学习——指令二

    2024-06-16 04:56:04       31 阅读
  8. Python中的函数

    2024-06-16 04:56:04       31 阅读
  9. LoRa模块如何实现智能灌溉系统的精准灌溉

    2024-06-16 04:56:04       36 阅读
  10. LeeCode 1987 DP / Trie

    2024-06-16 04:56:04       32 阅读
  11. 无人机技术的原理和发展

    2024-06-16 04:56:04       28 阅读
  12. oracle打补丁

    2024-06-16 04:56:04       35 阅读
  13. x86计算机的启动初期流程 Linux 启动流程

    2024-06-16 04:56:04       31 阅读