BIO实战、NIO编程与直接内存、零拷贝深入辨析

news2024/11/19 1:45:39

BIO实战、NIO编程与直接内存、零拷贝深入辨析

长连接、短连接

  • 长连接
    • socket连接后不管是否使用都会保持连接状态
    • 多用于操作频繁,点对点的通讯,避免频繁socket创建造成资源浪费,比如TCP
  • 短连接
    • socket连接后发送完数据后就断开
    • 早期的http服务采用的短连接

网络编程

  • 网络编程

    • BIO

      • 一个连接一个线程,客户端有连接请求时服务端就需要启动一个线程进行处理,线程开销大
        • BIO是面向流的,各种流都是阻塞的,并且是单向的
    • 伪异步IO

      • 将请求连接放入线程池,一对多,但线程依旧是宝贵资源
    • NIO

      • 一个请求一个线程,但客户端发送的请求连接都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理
        • NIO是面向缓冲区的、非阻塞,并且channel是双向的
        • 基于事件驱动模型、单线程处理多任务
        • 非阻塞I/O,I/O读写不再阻塞
        • 基于块的传输比基于流的传输更高效,基于零拷贝保证网络传输速度
        • 基于Reactor线程模型,在Reactor模型中,事件会提前注册回调函数,事件分发器在等待该事件发生,事件分发器就将该事件交给对应的回调函数进行处理读写操作
    • AIO

      • 一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务端去启动线程进行处理
  • 问题: NIO与BIO的区别

    • NIO是面向缓冲区的,BIO是面向流的

        • 从流中读一个或多个字节直到全部有序被读出,不能前后移动数据
      • 缓冲区

        • 通过将读取的数据缓存到缓冲区可以进行适度的移动操作
    • NIO是非阻塞的,BIO是阻塞的

      • 阻塞
        • 当线程需要读写时,需要等待操作结束后,才能继续后续的操作
      • 非阻塞
        • 当线程需要读写时,一旦收到读写请求,会将读写交给提前注册好的回调函数进行处理,所以单线程能处理更多的任务

NIO的三大组件

  • 选择器(Selector)
    • 允许单独的一个线程来监视多个管道,可以注册多个管道使用一个选择器,然后使用一个单独的线程操作这个选择器
  • 管道(Channel)
    • 主要是负责程序与OS的读写交互
  • 缓冲区(Buffer)
    • 用于和管道进行交互,数据通过管道读入缓冲区或从缓冲区写入管道中

直接内存

  • 在NIO下采用直接内存(DirectByteBuffer)进行操作,一般速度比堆内存(HeapByteBuffer)快很多
  • 直接内存并不是JVM的内存区域,而是通过本地库获取到的堆外内存
  • 直接内存(堆外内存)与堆内存比较
    • 直接内存申请空间耗费更高的性能,当频繁申请到一定量时尤为明显
    • 直接内存 IO 读写的性能要优于普通的堆内存,在多次读写操作的情况下差异明显

传统数据传送机制

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 从磁盘读取内核态缓冲区,从内核态缓冲区拷贝到用户态缓冲,用户态再读取缓冲数据拷贝到socket,socket将数据拷贝到网卡进行网络传输

零拷贝

  • 执行读写操作时,CPU不需要先将数据从某处内存复制到另一个特定区域,通过减少中间复制操作来提升网络传输速度
    • 可以通过DMA(直接内存访问)减少内核态与内核态的交互过程

mmap

image.png

  • 通过磁盘文件位置与程序的缓冲区建立映射关系,减少拷贝次数
    • 3次拷贝(1次CPU拷贝、2次DMA拷贝)以及4次上下文切换

sendfile

image.png

  • 通过向内核态发送sendfile指令操控它进行文件复制
    • 3次拷贝(1次CPU拷贝,2次DMA拷贝)以及2次上下文切换

splice

image.png

  • 数据从磁盘读取到OS内核缓冲区后,在内核缓冲区直接可将其转成内核空间其他数据buffer,而不需要拷贝到用户空间
  • 2次拷贝(2次DMA拷贝)以及2次上下文切换

Netty的零拷贝实现

  • 在网络通信上,接收和发送数据通过直接内存进行操作
  • 在缓存操作上,通过合并多个缓冲数据,避免重复拷贝
  • 在文件传输上,直接通过文件缓冲数据传输到管道,避免拷贝

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

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

相关文章

mybatis总结传参三

十、(不推荐)多个参数-按位置传参 参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是 #{arg0}, 第二个是 #{arg1} 注意: mybatis-3.3 版本和之前的版本使用 #{0},#{1} 方式, 从 myba…

Android基础进阶 - RecyclerView列表加载多类型视图

你是否会经常见到在同一个 RecyclerView 列表中加载多种不同的布局效果?最近写了一篇 ConcatAdapter 相关内容,发现虽然之前一直在使用多类型视图列表,但从未记录过,故重新记录于此 RecyclerView基础 Android进阶之路 - Recycler…

一文读懂 Python 值传递和引用传递

文章目录 版本前言形参和实参值传递和引用传递Python 变量存储值语义和引用语义值语义引用语义 探讨 Python 值传递和引用传递不可变(immutable)类型可变(mutable)类型案例一案例二 拓展:不可变类型真的不可变&#xf…

C++Lambda表达式介绍

C11中引入了Lambda表达式,Lambda表达式是一种匿名函数,它可以在需要函数的地方直接定义和使用,而无需显式地定义一个函数。 lambda表达式 Lambda表达式语法定义 [capture-list](parameters) -> return-type { statement } capture-lis…

Linux服务器节点性能问题排查和优化思路

Linux服务器节点性能问题排查和优化思路 1. atop安装2. 整体思路2.1 如果现场存在/能复现2.2 如果现场不能复现: 3. 高负载问题排查与应对3.1. hung task 问题3.2. 底层硬盘/文件系统无法写入3.3. IO性能不足导致的运行缓慢3.4. CPU 性能不足导致的运行缓慢&#xf…

Go语言必知必会100问题-05 接口污染

接口污染 在Go语言中,接口是我们设计和编写代码的基石。然而,像很多概念一样,滥用它是不好的。接口污染是指用不必要的抽象来编写代码(刻意使用接口),使得代码更难以理解。这是具有不同习惯,特…

linux常用的网络命令实战分享

文章目录 ifup/down命令ifconfig命令观察网络接口信息修改接口参数增加虚拟网络接口 route命令查看路由表增加路由表规则删除路由表规则 IP 命令ip linkip addr设定路由 ip route arp 命令 在实际研发运维工作中常常会涉及到网关相关的操作和知识,这里对linux下常用…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬,我又回来了,最近2月太忙啦(过年、奶娃、本子、材料、结题),断更了。现水一篇证明我还活着!!! 最近在写国自然本子,遇到一个估计大家都会遇到的问…

FMM 笔记:FMM(colab上执行)【官方案例解读】

在colab上运行,所以如何在colab上安装fmm,可见FMM 笔记:在colab上执行FMM-CSDN博客 fmm见:论文笔记:Fast map matching, an algorithm integrating hidden Markov model with precomputation_ubodt(upper bounded ori…

离散数学——树思维导图

离散数学——树思维导图 文章目录 前言内容大纲参考 前言 这是当初学习离散数学时整理的笔记大纲,其中包含了自己对于一些知识点的体悟。现将其放在这里作为备份,也希望能够对你有所帮助。 当初记录这些笔记只是为了在复习时更快地找到对应的知识点。…

vant安装教程(基于vue3)

1、先安装 npm i vant 如果不行安装这个 yarn add vant 2、在main.js中引入即可 import { createApp } from vue import App from ./App.vue import router from ./router import store from ./store import { Button } from vant; import vant/lib/index.css;createApp(App).…

一分钟带你入门MVVM和ViewModel

目录 0.为啥用ViewModel进行数据的存取 1.MVVM的具体含义 2.viewModel内部构造 3.配置viewModel 3.1 声明一个ViewModel实例类 3.2 viewModel功能实现 0.为啥用ViewModel进行数据的存取 通过持有LiveData维护保存数据的状态 为啥维护 ? : 当Activi…

数据安全策略

当您在第一线担负着确保公司的信息和系统尽可能免受风险的关键职责时,您的数据安全策略需要复杂且多层次。威胁可能有多种形式:恶意软件、黑客攻击、财务或信息盗窃、破坏、间谍活动,甚至是您信任的员工故意或无意的活动造成的。因此&#xf…

成都直播基地用心建设三大生态服务体系服务支撑西部电商

天府锋巢直播产业基地用心建设三大生态服务体系的服务支撑,这为直播行业更加完善的提供了全生命周期的服务方案,成都直播基地助力创业者更好地“开源节流”。 首先,天府锋巢直播产业基地作为成都规模最大的直播基地,具有全面的基…

什么是DOM?(详解)

什么是DOM? DOM的定义知识回顾什么是D?什么是O?什么是M?什么是DOM树?根节点对象与节点对象 DOM树简单举例DOM的主要用途 DOM的定义 DOM(Document Object Model,文档对象模型) W3C对…

23年中科院1区算法|长鼻浣熊优化算法COA原理及其利用与改进(Matlab/Python)

文章来源于我的个人公众号:KAU的云实验台,主要更新智能优化算法的原理、应用、改进 CEC2005中的测试 本文 KAU将介绍一个2023年1月发表在中科院1区KBS上的优化算法——长鼻浣熊优化算法(Coati Optimization Algorithm,COA)[1] 该算法由Dehg…

【Zotero】在zotero中如何重新编辑文献条目信息

博主最近在使用zotero中,当将下载好的文献直接拖拽到相应文件夹目录下后,一般系统会自动查找到文献的条目信息,可是有时候会出现自动查找的文献条目信息与真实的文献内容不一致的情况,这时需要手动重新编辑文献条目信息。这里将博…

设计模式(三)建造者模式

相关文章设计模式系列 1.建造者模式简介 定义 建造者模式(builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 简介 建造者模式(builder)是创建一个复杂对象的创建型…

【随笔】固态硬盘数据删除无法恢复(开启TRIM),注意数据备份

文章目录 一、序二、机械硬盘和固态硬盘的物理结构与工作原理2.1 机械硬盘2.11 基本结构2.12 工作原理 2.2 固态硬盘2.21 基本结构2.22 工作原理 三、机械硬盘和固态硬盘的垃圾回收机制3.1 机械硬盘GC3.2 固态硬盘GC3.3 TRIM指令开启和关闭 四、做好数据备份 一、序 周末电脑突…

爬某网站延禧宫率第一集视频

import requests import re from tqdm import tqdm # 网址链接:https://v.ijujitv.cc/play/24291-1-1.html url https://v6.1080pzy.co/20220801/urxniJCN/hls/index.m3u8 headers {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Appl…