BIO、NIO、AIO及衍生出的Netty

PyBioMed学习 PyProtein。 阅读详情

JAVA的I/O模型

一、BIO

BIO全称Blocking IO,它作为传统I/O模型,是同步阻塞的。

特点: 1.无连接请求时,accept方法阻塞

         2.无数据可读取时,read方法阻塞

BIO引发的问题: 严重的资源浪费

1.线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。

2.线程本身占用较大内存,像Java的线程栈,一般至少分配512K~1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半。

3. 线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统调用。如果线程数过高,可能执行线程切换的时间甚至会大于线程执行的时间,这时候带来的表现往往是系统load偏高、CPU sy使用率特别高(超过20%以上),导致系统几乎陷入不可用的状态。

4.容易造成锯齿状的系统负载。因为系统负载是用活动线程数或CPU核心数,一旦线程数量高但外部网络环境不是很稳定,就很容易造成大量请求的结果同时返回,激活大量阻塞线程从而使系统负载压力过大。

二、NIO

NIO全称Non-blocking I/O,是同步非阻塞的I/O模型。

NIO使用Selector(多路复用器)来监视每一个Client,具体操作是客户端发送的连接请求注册到Selector上,NIO启用一个线程来轮询Selector是否有IO请求,有则进行处理。

NIO三大组件:

Selector 多路复用器 用于监听和注册,当一个Channel注册在Selector,Selector就会自动地轮询注册的Channel是否已就绪I/O事件,通过这样可使用一个线程管理多个Channel

Channel 通道  读取/写入buffer,用于传输

Buffer 缓冲区  针对8种基本类型对应的缓冲区类,用于存储数据

NIO底层支持的Reactor模型(也称Dispatcher模式):

Reactor模型即I/O多路复用统一监听事件,收到事件后分发(Dispatch给某进程),基于事件驱动开发,组件包括Reactors和Handlers。还可将Reactor分成3种:单线程模型(单Reactor模型)、多线程模型(单Reactor多线程)、主从多线程(多Reactor多线程)

三、AIO

AIO即 Asynchronous I/O,也称为NIO2.0,异步非阻塞的I/O模型。

AIO与NIO不同的是,进行读写操作时,只需直接调用read或wirte方法。

它无需一个线程去轮询所有IO操作的状态改变,当有状态的改变时,系统会通知线程处理。

四、NIO衍生的I/O框架---Netty

Netty的线程模型就是Reactor模式的一个实现。

未完的。。

 

部分参考:

1.《Java 开发必备! I/O与Netty原理精讲》文章,公众号:阿里技术

2.《Java NIO浅析》文章 -- https://tech.meituan.com/2016/11/04/nio.html

3.《从 BIO、NIO 聊到 Netty,最后还要手写一个简单的 RPC 框架!毕设/项目经验稳了!》文章,公众号:后端技术进阶

UEC++ 虚幻5笔记(数字孪生示例) day13 文件读取与写入,数字孪生入门制作 阅读详情

相关推荐

2025华为od机试真题B卷【字符串计数匹配】Java&Go 实现

给你一个字符串str和整数k,返回满足以下条件的所有子字符串个数: 1.恰好包含k个字母。 2.数字0-9各现至少一次。

MISAYAONE的博客 582

Netty(一)- NettyBIONIOAIO介绍

Netty(一)- NettyBIONIOAIO介绍

及时当勉励,岁月不待人 2626

哨兵1号后向散射系数土壤水分反演

打开之前预处理之后的VH和VV极化的后向散射系数转存的tiff文件。

所有专家都曾始于新手 3258

Netty——BIONIONetty

本文介绍了 BIONIONetty,并对比了 NIONetty 的区别。

qq_61350148的博客 1208

Netty学习——实战篇3 BIONIO零拷贝 和 Netty入门实战 备份

【代码】Netty学习——实战篇3 BIONIO零拷贝 和 Netty入门实战 备份。

geminigoth的博客 355

Netty系列】Netty/BIO/NIO/AIO

Netty是一个开源的异步的事件驱动的网络应用框架,用于快速开发高性能的网络服务器和客户端。它主要用于构建可伸缩的网络应用程序,如协议服务器和客户端。Netty的设计目标是提供一个简单、快速、稳定的网络应用程序框架,同时保持灵活性和可扩展性。Netty基于NIO(非阻塞I/O)的事件驱动模型,使用了高效的线程池和优化的内存分配机制,使得它在处理大量并发连接时表现色。Netty广泛用于构建各种类型的网络应用,包括Web服务器、游戏服务器、即时通讯系统等。

Love Peace 1434

Netty学习——实战篇1 BIONIO入门demo

运行结果。

geminigoth的博客 1436

从阻塞到异步:Java IO 模型进化史 ——BIONIOAIO 深度解析

本文全面解析Java中的三种IO模型:BIONIOAIOBIO是传统的同步阻塞模型,适合低并发场景但线程资源消耗大;NIO采用同步非阻塞设计,通过多路复用实现高并发,是Netty等框架的基础;AIO是异步非阻塞模型,适用于IO密集型应用。文章详细对比了三者的核心特性、性能表现和适用场景,并提供了完整代码示例。在实际开发中,应根据业务需求选择合适模型,高并发场景推荐使用NIO或基于NIO的框架如Netty,而AIO在特定场景下能发挥最大价值。

果酱 の 博客 911

深入理解 BIO,NIO,AIO 三者的用途和区别?Select,poll,epoll 操作系统函数简介

本文详细介绍了Java中三种I/O模型:BIONIOAIO的工作原理及实现方式。 BIO(同步阻塞I/O):采用"一个连接一个线程"模型,编程简单但效率低,适用于低并发场景。文章通过服务端/客户端代码示例展示了BIO的双重阻塞特性及其资源浪费问题。 NIO(同步非阻塞I/O):通过Selector多路复用机制实现单线程管理多个连接,大幅提高并发性能。文章从基础版本逐步推导完整实现方案,并深入分析了底层select/poll/epoll系统调用的区别。 AIO(异步非阻塞I/O):采

m0_70325779的博客 889

bio , nio , aio , netty

Block io 的缺点在于: 单通道阻塞 1.单通道,读的时候需要获取input 来读 ,写的时候需要获取output来写,效率受到了影响,比如连接完了,需要写数据,需要临时的去客户端握手,获取输入或者输的通道,等于高速上就一条大路,读取的时候是一条道,等到写的时候,需要再开一条高速路,再去写 , 比较耗费板砖,就等于比较耗费资源,如果是百万级别的输入,输,就等于有2倍的百万级别的连接,如果是双通道的话,就比较节省连接数量。 socket.getinputstream.read socket.geto

bhwqq的博客 402

什么是 BIONIOAIO

摘要:Java提供了三种I/O模型:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)。BIO采用一连接一线程模式,简单但性能低;NIO通过多路复用实现单线程处理多连接,适合高并发;AIO由操作系统完成I/O后回调,性能最优但实现复杂。NIO在性能和易用性间取得平衡,是主流选择(如Netty框架)。开发者应根据并发需求选择合适的I/O模型。

weixin_45422672的博客 161

即时通讯技术文集(第9期):Java NIONetty入门系列 [共19篇]

为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。

hellojackjiang2011的博客 493

Netty基础知识

目录 一、Netty是什么 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty整合了网络编程、多线程处理和并发等多个领域的只是,极大地简化了网络开发的流程。 Netty是一个NIO客户端服务器框架,它能够快速和轻松地开发网络应用程序,如协议服务器和客户端。它极大地简化了T

junerli的博客 994

走近科学之《netty 的秘密》

IO 相关概念、五种 IO 模型、BIO NIO AIO 特点及区别、NIO 设计原理及核心组件、netty 简介及应用场景、netty 线程模型(Reactor 线程模型)、netty 设计原理及核心组件、netty 常用技巧实现(心跳机制、长连接、tcp 粘包/拆包、大文件传输、SSL/TLS 加密传输等)、相关代码示例。

后端为主,前端为辅。 1526

服务化基石之远程通信系列三:I/O模型

远程通信系列 I/O模型 I/O即输入/输(Input/Output)。每个应用系统间都无法完全避免相互的依赖调用,称之为远程通信;每个应用系统自身也将或多或少的产生数据,称之为本地读写。I/O则是远程通信和本地读写的核心。虽然地位重要,但I/O的性能发展是明显落后于 CPU 的。对于高性能、高并发的应用系统来说,如何回避I/O瓶颈从而提升性能是至关重要的。 阻塞与非阻塞 一般来说,

xinyuegu的博客 434

IO与反射:深入Java两大核心机制的内部世界

/ 注意:newInstance()已废弃,推荐getConstructor().newInstance()Spring的IoC(通过类名创建Bean)、Hibernate的ORM(动态生成Entity)、Jackson的JSON序列化等都重度依赖反射。掌握好这一“外”一“内”两种机制,你对Java的理解将不再停留在语法层面,而是能够真正洞察其运行时的动态本质,从而设计更优雅、更强大的系统架构。(而非编译时)获取类的任何内部信息(如方法、字段、构造器、注解等),并能动态地调用方法、操作字段、创建实例。

qq_74898152的博客 813

netty学习(二) 官网的解读

https://netty.io/3.8/guide/#architecture 官方文档非常有意思, 他为了偷懒(起码我是这么觉得,在spring就没看到类似的骚操作),4.1把基础的原理部分直接引用了3.8的. 第2章。架构概述 目录 1.丰富的缓冲区数据结构 1.1。 合并和切片ChannelBuffer 2.通用异步I / O API 3.基于拦截器链模式的事件模型 4.高级组件,实现更快的开发 4.1。 编解码器框架 4.2。 SSL / TLS支持 4.3。 HTTP实现 4.4。 Web

habazhu1110的专栏 327

我会什么开发技能

DDD设计(就是把方法放到一个类中,不好理解,后续很难维护)、多态(父类的对象指向子类的引用),设计模式一定要多使用,否则业务代码很难扩展也很容易问题,策略,工厂,构建者,单例,抽象工厂,动态代理,模版,装饰,适配器。springboot,mybatis,docker,netty,xxxjob,zk,redis,配置中心,kafka,rocketmq,hbase,mysql,hadoop,hive,postgresql。3、一个接口定义标准,然后spi回掉外围,还可以使用rpc的方式进行调用,下游实现。

红豆和绿豆的博客 624

面试阿里太难了!二本毕业、两年crud经验,侥幸通过面试定级P6

本文素材来自一位关注我一年多的铁粉 对于很多没有学历优势的人来说,面试大厂是非常困难的,这对我而言,也是一样,身于二本,原本以为就三点一线的生活度过一生,直到生活上的变故,才让我有了新的想法和目标,因此我这个二本渣渣也奋斗了起来,竟拿下了阿里P6岗。今天分享这波面经,主要是希望能够激励到同样被学历所困扰的技术人,能够对职业生涯和技术规划有一个参考价值,感谢! 有需要Java架构进阶资料...

一入Java深似海 1004

Java学习计划,给自己一个学习线路

动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! Java学习计划,给自己一个学习线路。语言是学习成本比较低的,Java作为一种高级语言,其相关语法相对简单,各种类库、框架封装的都相对好,而且相关生态也比较好(百度、google可以快速检索,github也有很多相当优秀的资源),Java类库的使用与C++的STL有很多类似的地方(STL的类库是基...

weixin_40599844的博客 226

Netty(1) —— NIOBIO

Netty学习前置知识(一) 学习 https://www.bilibili.com/video/BV1py4y1E7oA?p=122&spm_id_from=pageDriver 所做笔记 1.阻塞IO JDK 1.4 之前: bio 同步阻塞的IO JDK 1.4 之后: java.nio.xxx —> 解决阻塞问题 Non-Blocking 同步非阻塞的IO 在学习Nio之前我们需要回顾一下传统的阻塞IO,网络连接是怎么干的 客户端与

qq_40662405的博客 328

netty是如何一步一步演化而来的,不断进化成就netty

简介 随着IO类库不断完善,我们基于Java的网络编程学习成本越来越低。之前网络开发都是底层语言编写的,像C语言,C++。其实通过Java也可以编写。Java的io类基于tcp连接提供的socket就是我们实现网络开发的桥段。但是因为是同步阻塞式,所以效率上来说就慢了很多。在Java7之后提供了异步阻塞式io。为我们拉开了一个新天地。 BIO 什么是网络编程?所谓的网络编程其实就是C/S模型。大家都知道Java是开发B/S模型的。C/S实际是client和server端的开发。说白就是两个进程相互通信。

m0_50180963的博客 245

FANUC和三菱新代三轴UG后处理自动换刀与非自动换刀

FANUC和三菱新代三轴UG后处理自动换刀与非自动换刀

AS3.0画板涂鸦板

实例化到添加到显示列表,支持画笔,橡皮,调色,笔触等功能,详见代码内注释

上一篇: 【快速排序QuickSort研究】快排的双路实现以及注意要点
下一篇: 一日三餐的最佳用餐时间
windy46
博客等级 码龄10年 2粉丝 41原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值