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

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的零拷贝实现

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于JSP的毕业设计选题系统的设计与实现

基于JSP的毕业设计选题系统的设计与实现 (源代码论文) A. 项目简介 毕业设计选题系统就是能够使学生通过互联网完成毕业设计课题的选定,它采用Web方式,同时适用于局域网和Internet,它要实现审核,权限管理,邮件通知…

Spring6学习技术|IoC|基于注解管理bean

学习材料 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解) IoC注解 首先这是最常用的方法。(在学Java基础的时候明明是非常不起眼的知识点啊!!!) 从 Java…

二进制部署k8s之网络部分

1 CNI 网络组件 1.1 K8S的三种接口 CRI 容器运行时接口 docker containerd podman cri-o CNI 容器网络接口 flannel calico cilium CSI 容器存储接口 nfs ceph gfs oss s3 minio 1.2 K8S的三种网络 节点网络 nodeIP 物理网卡的IP实现节点间的通信 Pod网络 podIP Pod与Po…

RabbitMQ服务启动失败

报错信息: 在服务中启动RabbitMQ服务显示: RabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。 系统出错。 发生系统错误 1067。 进程意外终止 报错原因: 1.Erlang与RabbitMQ是否匹配 2.Erlang与RabbitMQ安装路径是否存在中文或空格 3.电…

解决谷歌浏览器,每次重启都重置所有设置的问题

一、问题: 修改谷歌浏览器的设置 关闭浏览器再打开设置页面后,会显示(部分设置已重置Chrome检测到您的部分设置被其他程序篡改了,因此已将这些设置重置为原始默认设置。了解详情) 之前的设置被重置了 二、解决 创建—…

VS2022调试技巧(一)

什么是bug? 在1945年,美国科学家Grace Hopper在进行计算机编程时,发现一只小虫子钻进了一个真空管,导致计算机无法正常工作。她取出虫子后,计算机恢复了正常,由此,她首次将“Bug”这个词用来描…

跳房子 Ⅰ(C语言)

题目来自于博主算法大师的专栏:最新华为OD机试C卷AB卷OJ(CJavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏。 游戏参与者需要分多个回…

Go语言必知必会100问题-06 生产者端接口

生产者端接口 Go语言必知必会100问题-05 接口污染中介绍了程序中使用接口是有价值的。在编码的时候,接口应该放在哪里呢?这是Go开发人员经常有误解的一个问题,本文将深入分析该问题。 在深入探讨问题之前,先对提及的术语做一个定…

2024年老薛主机开工大吉活动:云服务器5折起,续费同价!

2024年老薛主机开工大吉活动开始了,香港/美国云服务器季付7折,半年付6折,年付5折,续费同价! 活动地址: 点此直达老薛主机官网 活动详情: 老薛主机2024开年促销活动,香港/美国云服…

全网最全AI绘画工具汇总(二)

一.AI绘画 图像 创造人工智能艺术的方式共有多种方法,包括使用数字模式的程序“基于规则”的图像生成、模拟笔触和其他绘画效果的算法,以及人工智能或深度学习算法等。 最早的重要人工智能艺术系统之一是AARON,由哈罗德科恩于1960年代末开…

Pytorch添加自定义算子之(1)-安装配置Eigen库

一、安装对应的ubuntu环境 推荐使用Docker FROM nvcr.io/nvidia/pytorch:23.01-py3 RUN pip install tensorboardX RUN pip install pyyaml RUN pip install yacs RUN pip install termcolor RUN pip install opencv-python RUN pip install timm0.6.12 WORKDIR /app COPY . …

【LeetCode:2476. 二叉搜索树最近节点查询 + 中序遍历 + 有序表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

vDPA测试环境搭建

要求: 运行 Linux 发行版的计算机。本指南使用 CentOS 9-stream,但对于其他 Linux 发行版,特别是对于 Red Hat Enterprise Linux 7,命令不应有重大变化。 具有 sudo 权限的用户 ~ 主目录中有 25 GB 的可用空间 至少 8GB 内存 …

蓝桥杯-扫雷

代码解答及思路: #include <iostream> using namespace std; int main() { int n,m; int a[100][100] {0},b[100][100];//记住要开数组确数 &#xff0c;这样外围就会有边 &#xff0c;不能直接设置值&#xff0c;要记住&#xff01;&#xff01;&#xff01;&#…

FairyGUI × Cocos Creator 3.x 场景切换

前言 前文提要&#xff1a; FariyGUI Cocos Creator 入门 FairyGUI Cocos Creator 3.x 使用方式 个人demo&#xff1a;https://gitcode.net/qq_36286039/fgui_cocos_demo_dust 个人demo可能会更新其他代码&#xff0c;还请读者阅读本文内容&#xff0c;自行理解并实现。 官…

模版(初级)

一.泛型编程 当我们要写一个交换函数时&#xff0c;面对不同的类型&#xff0c;我们可能就需要向如下这么写&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double tem…

【linux】常见指令 -通配符,数据管道,重定向,压缩打包...

目录 前言 基本指令 ls命令 常见选项 ​编辑 pwd命令 cd 指令 常见选项 touch指令 mkdir指令 常见选项 rm 指令 常见选项 man指令 cp指令 常用选项&#xff1a; mv指令 常用选项 nano指令 如何写入且执行文件&#xff1f; cat指令 常用选项 more指令…

RPA超级自动化、AIGC大模型、低代码、流程挖掘四大热门峰会火热报名中!

由企智未来科技&#xff08;RPA中国、LowCode低码时代、AIGC开放社区&#xff09;主办的第四届「ISIG中国产业智能大会」将于2024年3月16日在上海召开&#xff0c;本届主题为“与科技共赢&#xff0c;与产业共进”。在此次大会中&#xff0c;我们将设立RPA超自动化、低代码/零代…

【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV开发痛点 传统图像算法开发最好的开源解决方案是OpenCV视觉库&#xff0c;但是OpenCV中收录了2000的传统算法&#xf…

鸿蒙 渲染控制

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 1.概念 ArkUI通过自定义组件的build()函数和builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了…