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.mzph.cn/news/592037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter Notebook的10个常用扩展介绍

Jupyter Notebook(前身为IPython Notebook)是一种开源的交互式计算和数据可视化的工具,广泛用于数据科学、机器学习、科学研究和教育等领域。它提供了一个基于Web的界面,允许用户创建和共享文档,这些文档包含实时代码、…

Stable Diffusion 本地部署详细教程

目录 一、前言二、系统和硬件要求三、安装前说明四、安装步骤5、升级pip(这是管理python环境软件工具),并把资源库换成国内地址为清华镜像。一、前言 虽然MJ和SD都可以生成图像,但是为什么我们要考虑使用本地SD部署呢?原因其实很简单:首先,本地部署的使用成本更低,且更加…

(15)Linux 进程创建与终止函数forkslab 分派器

前言:本章我们主要讲解进程的创建与终止,最后简单介绍一下 slab 分派器。 一、进程创建(Process creation) 1、分叉函数 fork 在 中, fork 函数是非常重要的函数,它从已存在进程中创建一个新的进程。 …

Python异常处理TypeError: translation() got an unexpected keyword argument ‘codeset‘

背景 学习graphql-python安装好依赖后执行命令 python manage.py migrate python manage.py runserver仅接着出现下列错误,主要提示是 「TypeError: translation() got an unexpected keyword argument ‘codeset’」 ntribute_to_classself.remote_field.throug…

1885页学习资料。一本在手,python不愁!

python3.11即将于下半年发布,新的版本速度提升2倍,以弥补与其他编程语言在速度上的缺陷。可以预见Python语言在未来的应用范围会越来越广。 python学习方向建议: 如果你是本科及以下学历,建议你学习以下两个方向 1、爬虫。简单…

Matplotlib基础

目录: 一、绘制yx^2图像: 一、绘制yx^2图像: from matplotlib import pyplot as plt import numpy as np #生成(-50,50)的数组 x np.arange(-50,50) #计算因变量y的值 y x ** 2 #根据x、y数组绘制图形yx^2 plt.plot…

一文带你玩转Superset!大数据可视化框架学习网站大盘点!

介绍:Superset是一款由Airbnb开源的现代化企业级BI工具,它主要用于数据分析和可视化工作。作为Apache孵化器项目的一部分,它在处理复杂的数据分析需求上表现出色,并支持多种数据源和丰富的图表类型。 这款工具的主要特点包括自助分…

PE解释器之PE文件结构

PE文件是由许许多多的结构体组成的,程序在运行时就会通过这些结构快速定位到PE文件的各种资源,其结构大致如图所示,从上到下依次是Dos头、Nt头、节表、节区和调试信息(可选)。其中Dos头、Nt头和节表在本文中统称为PE文件头(因为SizeOfHeaders…

大数据毕业设计:基于python淘宝数据采集分析可视化系统 商品销量数据分析 计算机毕业设计(附源码+文档)✅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题&#xff…

【第31例】IPD产品开发计划阶段详解

目录 简介 详细内容 作者简介 简介 今天继续更新 IPD 进阶专栏。 这节内容主要来谈谈 IPD 产品开发计划阶段。 计划阶段的主要目标是回答“怎么做”的问题。 具体就是要: 清晰定义产品及竞争优势; 理解业务计划; 制定项目计划,以及资源计划; 确保风险可以被合理管理…

微软真是活菩萨,面向初学者的机器学习、数据科学、AI、LLM课程统统免费

微软真是活菩萨,面向初学者的机器学习、数据科学、AI、LLM课程统统免费 大家好,我是老章 推荐几个质量上乘且完全免费的微软开源课程 面向初学者的机器学习课程 **地址:**https://microsoft.github.io/ML-For-Beginners/#/ 学习经典机器学…

Mysql 下载与安装教程(详细介绍与总结)

一:版本介绍 首先,我们需要先进入官网进行下载,在官网中有好几个版本,那么这里我分别简述一下MySQL各个版本区别: 1:企业版,MySQL Enterprise Edition 需要付费的,可以免费试用30天…

超声波传感器(附:c语言测距代码)

一、引言 超声波传感器是一种利用超声波进行检测的装置,具有非接触、高精度、抗干扰能力强等优点。在工业自动化、医疗诊断、环境监测等领域,超声波传感器发挥着重要的作用。本文将深入探讨超声波传感器的原理、应用,并通过C语言代码示例来展…

Windows使用IIS服务搭建WebDAV站点结合内网穿透公网访问

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功总结: 自己用Windows Server搭建了家用NAS主机&…

ffmpeg与SDL结合使用

FFmpeg 使用了 SDL 库来处理音频和视频数据的显示。SDL 提供了一套跨平台的图形显示库,它可以在多个操作系统上提供硬件加速的视频输出功能,并且支持多种常用的视频编解码格式,这些特性使得它成为 FFmpeg 中的一个重要组件。 在 FFmpeg 中&a…

OpenGL FXAA抗锯齿算法(Qt,Quality版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 将FXAA添加到现有渲染器中很简单:它作为最终渲染通道[1]应用,仅将渲染图像作为输入,并输出抗锯齿版本。其主要思想是检测渲染图像中的边缘并使其平滑。这种方法快速有效,但会模糊纹理上的细节。该算法有两个版本…

汉诺塔问题

问题: Hanoi(汉诺)塔问题。这时一个古典的数学问题,是一个递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C(如下图)。开始时A座上有64个盘子,盘子大小不等&#xff0c…

返利机器人的实现原理:从技术到收益的全面解析

返利机器人的实现原理:从技术到收益的全面解析 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在电商时代,许多消费者对返利机器人并不陌生。…

vue中使用lodash的debounce防抖函数

目录标题 第一步安装lodash第二步举例一个简单的例子: 防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计…

C++模板进阶操作 ---非类型模板参数、模板的特化以及模板的分离编译

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…