Java零拷贝(一):从硬件到内核再到源码分析

(笔记整理自b站小刘说源码课程)

一、DMA

在没有DMA时:CPA首先将内存数据读到缓存,再写到网卡。这样做会降低CPU的速度至网卡层面。

当出现DMA时:首先进行一次CPU复制,将内存数据读到socket内核缓冲区,此时CPU不参与后面的工作,转由DMA接管。DMA读取socket缓冲区的内容,然后将其写入网卡中。

DMA完成手头工作后,DMA中断CPU,此时CPU得知socket空出来了。CPU从用户态切换到内核态,执行中断处理程序,将socket缓冲区阻塞的进程移回到运行队列。

二、系统调用和虚拟内存

系统调用:用户读取硬盘上的文件,发起read调用,read是内核态的库函数api,该库函数会发起系统调用。该库函数里有80中断、软中断、进程切换到内核态。到CPU里存一个系统调用号(表示哪个系统函数,比如read)。把CPU的临时数据都保存到thread_info中(恢复到用户态时使用,包含PC、寄存器、用户程序基地址、CPU cache等),然后执行int 80中断处理程序,搜索到之前存的系统调用号,这里是read,首先检查缓存中有没有对应的数据,没有就去磁盘中加载到内核缓冲区,然后从内核缓冲区拷贝到用户空间,随后恢复到用户态,根据thread_info,用户可以知道从哪继续执行。

缓冲区读写:

读:首先用户态切换到内核态,先判断内核态缓冲区是否有,有的话直接读取,否则交由DMA处理。DMA从外设读,这个过程中CPU可以执行其他进程。DMA将数据加载到内核缓冲区后告诉CPU,CPU把数据拷贝到用户态,将此进程从阻塞队列移到运行队列。

写:缓存区满了之后,写操作产生阻塞。缓冲区有一个等待队列,记录阻塞的进程(java的轻量级进程),DMA将缓存区数据写到网卡后通知CPU,CPU中断,将该进程移动到运行队列。

物理内存:类似于大的数组,可以随机读取。

虚拟内存:早期单核计算机只需要保证数据不写入内核空间即可。多核计算机引入多线程后,每个进程有自己的用户空间,得防止不能访问其他进程空间,所以引入了虚拟内存。进程分配了虚拟内存,CPU的MMU单元可以辅助完成虚拟内存到物理内存的映射。虚拟内存可以大于真实物理内存,MMU可以把不常用的东西从物理内存放到磁盘(SWAP区)。因为可以替换,所以不同进程的虚拟内存空间的地址可以映射到同一个物理内存,利用这个特性,可以把用户空间和内核空间的地址翻译为同一块的物理内存地址,就可以减少拷贝,通常称为零拷贝。

三、IO方式

传统IO:从硬盘读到网卡。进程去读,首先看内核缓冲区是否存在,不存在则告诉DMA去读内核缓冲区,然后把进程放到内核的阻塞队列中,DMA读好后发起中断通知CPU,CPU唤醒阻塞进程,从内核缓冲区读到数据缓冲区,然后再切换到内核态进行写操作,写到socket缓冲区后,告诉DMA把socket缓冲区的数据写到网卡。复制了4次,进程切换了4次。

MMAP:DMA把磁盘上的文件映射到内存,用户空间和内核空间共享同一块物理地址,这样就无需进程用户空间和内核空间的来回复制。 写到网卡的时候,共享空间的内容拷贝到socket缓冲区(CPU复制),然后通知DMA发送到网卡。3次复制,两次DMA,一次CPU。

sendfile:打开文件的fd和传输的socket的fd告诉sendfile,也是和上述一样的3次复制,不过只进行了2次用户态和内核态的切换。

NIO:BUFFER数组,NIO把byte数组的位置和长度发给内核态,内核空间可以访问用户空间,称为跨传输。假设发生了FULL GC,stop the world,线程停止,回收垃圾对象,会进行碎片整理,位置可能改变。NIO选择在堆外创建一个同样大小的buffer,先从用户空间拷贝到堆外空间(CPU拷贝),再发送write系统调用,此时发送堆外的位置和长度,然后再拷贝到内核缓冲区。堆外是不发生GC的。使用NIO时可以直接将buffer拷贝到堆外,可以避免一些拷贝过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85312.shtml

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

相关文章

Go 常用命令介绍

Go 常用命令 文章目录 Go 常用命令一、Go 常用命令1.1 go build1.1.1 指定输出目录1.1.2 常用环境变量设置编译操作系统和 CPU 架构1.1.3 查看支持的操作系统和CPU架构 1.2 go test1.3 go vet1.4 go clean1.5 go fmt1.6 go get1.7 go install1.8 go tool1.9 go generate1.10 go…

智思Ai企联系统去授权版本+uniapp前后端(内含教程)

智思AI企联系统是一款企业级AI系统,与普通版AI产品相比具备显著差异。该系统允许企业按需选择和定制二开任意功能,以满足不同企业的个性化需求和场景要求。企业可以根据实际业务需求扩展和改进系统功能模块,使之更好地适应企业独特需求。

【word格式】mathtype公式插入 | 段落嵌入后格式对齐 | 字体大小调整 |空心字体

1. 公式嵌入 推荐在线latex编辑器,可以截图转 latex 识别率很高 https://www.latexlive.com/home 美中不足,不开会员每天只能用3次识别。 通过公式识别后,输出选择align环境,然后在mathtype中直接粘贴latex就可以转好。 2.公式…

网络爬虫——HTTP和HTTPS的请求与响应原理

目录 一、HTTP的请求与响应 二、浏览器发送HTTP请求的过程 三、HTTP请求方法 四、查看网页请求 五、常用的请求报头 六、服务端HTTP响应 七、常用的响应报头 八、Cookie 和 Session 九、响应状态码 十、网页的两种加载方法 十一、认识网页源码的构成 十二、爬虫协议…

【Linux 之二】Ubuntu下开发环境的搭建(NFS \ SSH \ FTP \ Smba \ ...)

目前正在进行Linux相关项目的开发,而我的Linux开发是在Ubuntu(版本20.04)下进行的,为此需要搭建很多Linux相关的开发环境,方便工作的进行。这里主要是对各种开发环境的搭建做一个总结记录,方便后面查阅&…

LeetCode【69. x 的平方根】

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…

FPGA原理与结构(0)——目录与传送门

一、 简介 FPGA的设计和软件设计不同,我们所设计的RTL代码最终还是要落实到硬件底层来进行实例化,因此理解硬件底层的内容是很有意义的。 二、可编程逻辑块CLB 可配置逻辑块CLB(Configurable Logic Block)是xilinx系类FPGA的基本…

操作系统--------调度算法篇

目录 一.先来先服务调度算法(FCFS) 二.短作业优先调度算法(SJF) 2.1.SJF调度算法缺点 三.优先级调度算法 3.1优先级调度算法的类型 1.非抢占优先级调度算法 2.抢占优先级调度算法 3.2优先级的类型 3.1静态优先级 3.2动态…

肖sir__mysql之存储练习题__013

实验 一、 实验要求: 理解存储过程的概念掌握存储过程的语法格式、使用方法掌握存 储过程的创建、执行 二、实验前提: – drop table if exists student; – Create table student – (Id varchar(255), #学号 – Name varchar(255), #姓名 – Roomid…

C/C++算法入门 | 查找元素

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始,不如现在行动! 文章目录 🌴前言🌴一、找x1.题目(codeup 1934)2.思路3.代码实现 🌴总结 🌴前言 有时候…

生成式模型和判别式模型区别

目录 1.概念 2.定义​ 3.举例​ (1)例子 A​ (2)例子 B​ 4.特点 5.优缺点 6.代表算法 1.概念 首先我们需要明确,两种不同的模型都用于监督学习任务中。监督学习的任务就是从数据中学习一个模型,并用…

golang优先级坑

看如下代码,我本以为a1, a2是相同的 package mainimport "fmt"func main() {b, c, d : 1, 0, 1a1 : b ^ c&(^d) // 1 ^a2 : c ^ b&(^d) // 0 ^fmt.Println(a1, a2) // 1 0 }但结果却是不同的,在golang中&的优先级^和|…

使用 PyTorch 的计算机视觉简介 (1/6)

一、说明 Computer Vision(CV)是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗,到更复杂的任务,例如用自然语言描述图像。 二、CV常见的问…

RocketMQ高性能核心原理与源码架构剖析

文章目录 1、源码环境搭建1.1、主要功能模块1.2、源码启动服务1.2.1、 启动nameServer1.2.2、 启动Broker1.2.3、 发送消息1.2.4、 消费消息 2、源码剖析2.1、NameServer的启动过程2.2、Broker服务启动过程2.3、Netty服务注册框架2.3.1、关注重点2.3.2、源码重点 1、源码环境搭…

AJAX学习

文章目录 创建 XMLHttpRequest 对象向服务器发送请求XMLHttpRequest.open()XMLHttpRequest.send()GET或POST 服务器响应XMLHttpRequest 的属性XMLHttpRequest.readyStateXMLHttpRequest.onreadystatechangeXMLHttpRequest.responseXMLHttpRequest.responseTypeXMLHttpRequest.r…

OpenAI官方吴达恩《ChatGPT Prompt Engineering 提示词工程师》(7)聊天机器人 / ChatBot

聊天机器人 / ChatBot 使用大型语言模型来构建你的自定义聊天机器人 在本视频中,你将学习使用OpenAI ChatCompletions格式的组件构建一个机器人。 环境准备 首先,我们将像往常一样设置OpenAI Python包。 import os import openai from dotenv import…

ruoyi框架修改左侧菜单样式

菜单效果 ruoyi前端框架左侧的菜单很丑,我们需要修改一下样式,下面直接看效果。 修改代码 1、sidebar.scss .el-menu-item, .el-submenu__title {overflow: hidden !important;text-overflow: ellipsis !important;white-space: nowrap !important;//…

vue3——pixi初学,编写一个简单的小游戏,复制粘贴可用学习

pixi官网 小游戏效果 两个文件夹 一个index.html 一个data.js //data.js import { reactive } from "vue"; import { Sprite, utils, Rectangle, Application, Text, Graphics } from "pixi.js";//首先 先创建一个舞台 export const app new Applicat…

QT配置MySQL数据库 ninja: build stopped: subcommand failed

QT配置MySQL数据库 我当前的软件版本:QT Creator 10.0.2 (community),MingW 6.4.3 (QT6),MySQL 8.0。 MySQL不配置支持的数据库有QList("QSQLITE", "QODBC", "QPSQL"),这个时候是不支持MYSQL数据…

[极客大挑战 2019]RCE ME 取反绕过正则匹配 绕过disable_function设置

目录 取反 1.蚁剑插件绕过 2.baypass disable_function open_dir/disable_function putenv()/LD_PRELOAD 来绕过限制 利用条件 利用思路 有意思。。。。 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("Th…