当前位置: 首页 > news >正文

linux支持的零拷贝类型以及java对应的支持

在之前整理的零拷贝文章基础上

https://blog.csdn.net/zlpzlpzyd/article/details/135321197

https://blog.csdn.net/zlpzlpzyd/article/details/135317834

得出如下

因为开发的程序很多运行在 linux 操作系统上,所以用 linux 进行讲解

linux 调用方式

dma复制次数

cpu复制次数

用户态切换次数

内核态切换次数

系统调用次数

对应 java 实现

备注

传统io(read+write)

2

2

2

2

2

InputStream 和OutputStream 的实现类

Writer 和 Reader 的实现类

数据需要通过 cpu 从内核态复制到用户态

mmap+write

2

1

2

2

2

MappedByteBuffer

采用虚拟内存,多个虚拟内存可以指向同一个物理地址。利用这个特性,可以把内核空间和用户空间的虚拟地址映射到同一个物理地址,这样在I/O操作时就不需要来回复制。将内核中的读缓冲区与用户空间的缓冲区进行映射,所有的IO都在内核中完成。
通过类似指针的方式操作 page cache,cpu 的复制在内核执行,不需要复制到应用程序。

sendfile

2

1

1

1

1

FileChannel 的 transferFrom() 和 transferTo()

替代前面的 read() 和 write() 这两个系统调用

sendfile+DMA scatter/gather

2

0

1

1

1

将 cpu 的复制操作交给网卡去做,需要网卡支持并且提供对应的驱动程序。

direct io

20111

在 java 10 中提供了 api

splice

2

0

1

1

1

splice函数用于在两个文件描述符之间移动数据,而不需要数据在内核空间和用户空间中来回拷贝。

使用splice函数时输入和输出至少有一个是管道文件描述符。

只适用于将数据从文件拷贝到套接字上,限定了它的使用范围。

tee

2

0

1

1

1

在两个管道文件描述符之间复制数据,并且它是直接复制,不会将数据读出。

如上述表格,在传统 io 的基础上,mmap 方式少了一次 cpu 复制,sendfile 相比  mmap 少了1次用户态切换,1次内核态切换,系统调用少了1次,sendfile+DMA scatter/gather 在单纯的 sendfile 调用基础上少了1次cpu复制,后面的 direct io、splice、tee 在资源消耗上类似。

由此可见,对于 io 的问题无论怎么优化,dma复制的次数、用户态和内核态切换的次数、调用操作系统 api 的次数都是无法避免的,因为开发的程序运行在用户态,调用操作系统 api 就要进行用户态和内核态切换。

针对 splice 功能在 openjdk 的 bug 里提出了,但是还没解决

https://bugs.openjdk.org/browse/JDK-8303934

tee 的功能还不支持

参考链接

https://www.toutiao.com/article/7100795589604033059

https://juejin.cn/post/6862877857258045453

https://www.jianshu.com/p/fad3339e3448

https://zhuanlan.zhihu.com/p/78869158

https://zhuanlan.zhihu.com/p/592397046

https://zhuanlan.zhihu.com/p/573893175

https://zhuanlan.zhihu.com/p/608726921

http://www.lryc.cn/news/275363.html

相关文章:

  • 【TypeScript】声明文件
  • 基于Flutter构建小型新闻App
  • 利用python将excel文件转成txt文件,再将txt文件上传hdfs,最后传入hive中
  • 【自学笔记】01Java基础-07面向对象基础-02继承
  • 二分查找(一)
  • 【华为OD真题 Python】精准核酸检测
  • Springboot使用logback
  • 【REST2SQL】03 GO读取JSON文件
  • 数据库-MySQL 启动方式
  • YAML使用
  • 读书之深入理解ffmpeg_简单笔记2(初步)
  • ELK+kafka+filebeat企业内部日志分析系统搭建
  • 勒索检测能力升级,亚信安全发布《勒索家族和勒索事件监控报告》
  • 编译原理复习的有用链接
  • 不带控制器打包exe,转pdf文件时失败的原因
  • Python 注释的方法
  • webman插件创建
  • 大模型迎来“AppStore时刻”,OpenAI给2024的新想象
  • ubuntu解决在pycharm上使用jupyter无法导入虚拟环境中的包的问题
  • 探索2024年软件测试的几大主导趋势
  • Linux C语言 48-信号总结
  • 【vue技巧】之如何让mixin的data 比本身vue的data优先级要高
  • 全解析阿里云Alibaba Cloud Linux镜像操作系统
  • 什么是数据结构?
  • GOOS=darwin 代表macOS环境
  • hfish蜜罐docker部署
  • 我的创作纪念日——redis的历史纪录
  • 【Bootstrap5学习 day10】
  • 2024年学习计划
  • 学习笔记:C++之 switch语句