BIO NIO AIO演变

news2024/11/23 12:32:25

   Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。

Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。

一、BIO的理解

      网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的

地址发送连接请求,通过三次握手建立连接,如果连接成功,双方就可以通过网络套接字(Socket)进行通信。在基于同步堵塞模式开发中,ServerSocket负责绑定Ip地址,启动监

听端口。Socket负责发起连接操作。连接成功之后,双方通过输入和输出流进行同步堵塞式通信。

BIO流程图

BIO 全称Block-IO 是一种阻塞同步的通信模式。我们常说的StockIO一般指的是BIO。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。

BIO 设计原理

       服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。若客户端数量增多,频繁地创建和销毁线程会

给服务器打开很大的压力。后改良为用线程池的方式代替新增线程,被称为伪异步IO。服务器提供IP地址和监听的端口,客户端通过TCP的三次握手与服务器连接,连接成功后,双

放才能通过套接字(Stock)通信。

小结:BIO模型中通过Socket和ServerSocket完成套接字通道的实现。阻塞,同步,建立连接耗时。

二、NIO的理解

       与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。这两种新增的通道都支持阻塞和非阻塞两种模

式。阻塞模式使用非常简单,但是性能和可靠性都不好,非阻塞模式则正好相反。幵发人员一般可以根据自己的需要来选择合适的模式,一般来说,低负载、低并发的应用程序可

以选择同步阻塞I/O以降低编程父杂度,但是对于高负载、高并发的网络络应用,需要使用NIO的非堵塞模式迸行幵发。

NIO 全称New IO,也叫Non-Block IO 是一种非阻塞同步的通信模式。

NIO流程图

NIO 设计原理

     NIO 相对于BIO来说一大进步。客户端和服务器之间通过Channel通信。NIO可以在Channel进行读写操作。这些Channel都会被注册在Selector多路复用器上。Selector通过

一个线程不停的轮询这些Channel。找出已经准备就绪的Channel执行IO操作。NIO 通过一个线程轮询,实现千万个客户端的请求,这就是非阻塞NIO的特点。

NIO几个新概念

1)缓冲区Buffer

      它是NIO与BIO的一个重要区别。BIO是将数据直接写入或读取到Stream对象中。而NIO的数据操作都是在缓冲区中进行的。缓冲区实际上是一个数组。Buffer最常见的类型

是ByteBuffer,另外还有CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。

2)通道Channel

       和流不同,通道是双向的。NIO可以通过Channel进行数据的读,写和同时读写操作。通道与流之间不同之处是通道是双向的,流只能一个方向移动(一个流必须是

InputStream或者OutputStream的子类)。 通道分为两大类:一类是网络读写(SelectableChannel),一类是用于文件操作(FileChannel),我们使用的SocketChannel

和ServerSocketChannel都是SelectableChannel的子类。

3)多路复用器Selector

     NIO编程的基础。多路复用器提供选择已经就绪的任务的能力。就是Selector会不断地轮询注册在其上的通道(Channel),如果某个通道处于就绪状态,会被Selector轮询出

来,然后通过SelectionKey可以取得就绪的Channel集合,从而进行后续的IO操作。服务器端只要提供一个线程负责Selector的轮询,就可以接入成千上万个客户端,这就是

JDK NIO库的巨大进步。

三、AIO理解

      异步无非是通知系统做一件事情。然后忘掉它,自己做其他事情去了。很多时候系统做完某一件事情后需要一些后续的操作。

AIO 也叫NIO2.0 是一种非阻塞异步的通信模式。在NIO的基础上引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。

AIO流程图

      AIO 并没有采用NIO的多路复用器,而是使用异步通道的概念。其read,write方法的返回类型都是Future对象。而Future模型是异步的,其核心思想是:去主函数等待时间。

AIO模型中通过AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道的实现。非阻塞,异步。

四、总结

1 IO,NIO,AIO区别

    IO 阻塞同步通信模式,客户端和服务器连接需要三次握手,使用简单,但吞吐量小。

    NIO 非阻塞同步通信模式,客户端与服务器通过Channel连接,采用多路复用器轮询注册的Channel。提高吞吐量和可靠性。

    AIO 非阻塞异步通信模式,NIO的升级版,采用异步通道实现异步通信,其read和write方法均是异步方法。

2 Stock通信的伪代码实现流程

      服务器绑定端口:server = new ServerSocket(PORT)

      服务器阻塞监听:socket = server.accept()

      服务器开启线程:new Thread(Handle handle)

      服务器读写数据:BufferedReader PrintWriter

     客户端绑定IP和PORT:new Socket(IP_ADDRESS, PORT)

     客户端传输接收数据:BufferedReader PrintWriter

3 什么是同步阻塞BIO,同步非阻塞NIO,异步非阻塞AIO

     同步阻塞IO : 用户进程发起一个IO操作以后,必须等待IO操作的真正完成后,才能继续运行。

     同步非阻塞IO: 用户进程发起一个IO操作以后,可做其它事情,但用户进程需要经常询问IO操作是否完成,这样造成不必要的CPU资源浪费。

     异步非阻塞IO: 用户进程发起一个IO操作然后,立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知。类比Future模式。

4、小结

     1)BIO模型中通过Socket和ServerSocket完成套接字通道实现。阻塞,同步,连接耗时。

    2) NIO模型中通过SocketChannel和ServerSocketChannel完成套接字通道实现。非阻塞/阻塞,同步,避免TCP建立连接使用三次握手带来的开销。

    3) AIO模型中通过AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道实现。非阻塞,异步。

再附上netty权威指南书中一张图、

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

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

相关文章

R语言分析糖尿病数据:多元线性模型、MANOVA、决策树、典型判别分析、HE图、Box's M检验可视化...

全文链接:https://tecdat.cn/?p33609 Reaven和Miller(1979)研究了145名非肥胖成年人的葡萄糖耐量和胰岛素血液化学指标之间的关系。他们使用斯坦福线性加速器中心的PRIM9系统将数据可视化为3D,并发现了一个奇特的图案&#xff0c…

Golang教程与Gin教程合集,入门到实战

GolangGin框架GormRbac微服务仿小米商城项目实战视频教程Docker Swarm K8s云原生分布式部署 介绍: Go即Golang,是Google公司2009年11月正式对外公开的一门编程语言,它不仅拥有静态编译语言的安全和高性能,而 且又达到了动态语言开…

将linux上的文件/文件夹下载到本地

要进行此操作 你的电脑需要有 ssh 如果没有安装 可以参考我的文章 windows系统安装SSH 其实非常简单 但您需要知道自己的文件在哪个路径下 如果不知道 例如 我知道我想下的文件叫 dist 可我不知道他在那个目录 我们可以在服务器中输入 find / -name "dist"这样 所有…

treeview形式的checkbox(wpf、c#)

如何实现treeview形式的checkbox&#xff0c;并且父节点和子节点的选中状态可相互影响。示例图&#xff1a; 代码如下&#xff1a; wpf代码&#xff1a;treeview绑定的数据是PermissionDataCollection。 <TreeView ItemsSource"{Binding PermissionDataCollection}…

只需3步,用华为云CodeArts快速搭建一个网上商城

华为云软件开发生产线CodeArts是面向开发者提供的一站式云端DevSecOps平台&#xff0c;其提供的10多个子服务覆盖了需求下发、代码提交、代码检查、代码编译、验证、部署、发布等软件交付全生命周期环节&#xff0c;提供软件研发流程的端到端支持。 华为端到端&#xff08;HE2…

ANIMALS FULL PACK (总共三十个动物)

资源包的动物包含&#xff1a;熊、野猪、鸡、牛、乌鸦、鸭子、大象、狐狸、金鹰、大雕鸮、山羊、猪、鸽子、兔子、海鸥、绵羊、麻雀、雄鹿、母鹿、狼、大象、犀牛、斑马、雄狮和母狮。此外还有一些水里的动物鲸、海豚、鲨鱼、海龟 资源链接在底部 Unity 资源商店链接 资源下载…

LLM - 批量加载 dataset 并合并

目录 一.引言 二.Dataset 生成 1.数据样式 2.批量加载 ◆ 主函数调用 ◆ 基础变量定义 ◆ 多数据集加载 3.数据集合并 ◆ Concat ◆ interleave ◆ stopping_strategy ◆ interleave_probs 三.总结 一.引言 LLM 模型基于 transformer 进行训练&#xff0c;需要先…

双token实现无感刷新

accessToken:用户获取数据权限refreshToken:用来获取新的accessToken 双 token 验证机制&#xff0c;其中 accessToken 过期时间较短&#xff0c;refreshToken 过期时间较长。当 accessToken 过期后&#xff0c;使用 refreshToken 去请求新的 token。 引入依赖 <!-- …

多版本CUDA安装切换

系统中默认的安装CUDA为12.0&#xff0c;现在需要在个人用户下安装CUDA11.7。 CUDA 下载 CUDA官网下载 安装 Log file not open.Segmentation fault (core dumped)错误 将/tmp/cuda-installer.log删除即可。重新安装&#xff0c;去掉驱动的安装&#xff0c;设置Toolkit的安装…

ST-LINK 下载器的使用

这两天我也是被这个ST-LINK搞的非常头疼&#xff0c;第一个是固件不兼容&#xff08;也就是keil5的魔法棒中显示ST-LINK connection error&#xff09;&#xff0c;第二个就是STM32 ST-LINK Utility的使用显示dll文件损坏 ST-LINK connection error 先来解决这个问题&#xff…

【附安装包】2023最新版Python安装详细教程!一键安装,永久使用

一、python官网 Python官网主要有python的About (简介)、Downloads (下载)、Documentation(文档)、Community (团体)、Success Stories (成功案例)、News (新闻)、Events (事件动态)等栏目。 Python官网地址&#xff1a;https://www.python.org/ 【领取方式见文末】 二、在…

如何选择感测型离子风机

离子风机在生产车间使用越来越广&#xff0c;对产品的要求也越来越高&#xff0c;而感测型离子风机正好满足。 感测型离子风机:内置感测和反馈功能&#xff1b;2.能快速静电中和及消除&#xff1b;高要求控制离子平衡&#xff1b;3.集感测&#xff0c;联网&#xff0c;通讯数据…

2023年数维杯数学建模C题宫内节育器的生产求解全过程文档及程序

2023年数维杯数学建模 C题 宫内节育器的生产 原题再现&#xff1a; 宫内节育器&#xff08;IUD&#xff09;是一种相对安全、有效、经济、可逆、简便&#xff0c;广大妇女易接受的节育器具&#xff0c;目前已成为我国育龄妇女的主要避孕措施。据悉&#xff0c;我国约70%妇女选…

设定excel导出时单元格的格式

一、需求 要求excel导出时&#xff0c;对应列里面的内容格式为日期&#xff0c;数值格式并有精度要求 &#xff0c;如下图&#xff1a; 使用alibaba&#xff0c;easyexcel&#xff0c;默认的导出数据格式为文本&#xff0c;excel显示为常规&#xff0c;使用数据规范注解Number…

玩转 gpgpu sim 01记 —— try it

1. 短介绍 gpgpu-sim 是一个gpu模拟器&#xff0c;可以让cuda/openCL程序运行在一个软件模拟器上&#xff0c;而不需要硬件GPU&#xff1b; 2. 目标 用最简单省事的方式跑通一个gpgpu-sim的仿真 3. gpgpu-sim 一点项目特性 开发比较早&#xff0c;没有持续的维护&#xff0…

vscode搭建Django自带后台管理系统

文章目录 一、django自带的后台管理系统1. 建表2. 后台管理系统2.1 创建账号2.2 运行后台2.3 登录 二、模版渲染1. 直接将数据渲染到页面2. 数据传递给js 三、数据库1. 查看当前数据库2. 创建UserInfo数据表3. Django rest framework配置 四、vue前端搭建1. 在Django项目的根目…

vue 使用canvas 详细教程

Vue.js 中使用 Canvas Vue.js 是一个流行的 JavaScript 框架&#xff0c;用于构建用户界面。它提供了一种简洁的方式来管理和渲染数据&#xff0c;同时也支持与其他库和工具的集成。要在 Vue.js 中使用 Canvas&#xff0c;您可以按照以下步骤进行操作&#xff1a; 在 Vue.js …

Visual Studio 2022安装SVN插件教程

1. 第一步&#xff1a;避免踩坑&#xff0c;超级重要&#xff01;&#xff01;&#xff01;关闭Visual Studio 2022应用程序&#xff1b;&#xff08;不然插件装不上&#xff0c;一直转圈&#xff01;&#xff09; 2.第二步&#xff1a;下载Visual Studio 2022版本对应的SVN插件…

最新IDE流行度最新排名(每月更新)

2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&#xff0c;Top IDE索引可以帮助您决定在软件开发项目中使用哪个IDE …

Excel显示列号

默认表格打开列以字母显示 设置方法 文件 -> 工具 -> 选项 -> 常规与保存 设置后效果如下图