Netty基础知识

本文详细介绍了Java中的三种I/O模型:BIO、NIO和AIO(NIO2.0)。BIO是同步阻塞,一个连接一个线程;NIO是同步非阻塞,一个请求一个线程,利用选择器提高效率;AIO是异步非阻塞,一个有效请求一个线程,基于事件和回调机制。NIO适用于高并发场景,AIO则进一步降低了CPU占用。
摘要由CSDN通过智能技术生成

参考博客:https://blog.csdn.net/weixin_55604133/article/details/117048887

BIO,NIO,AIO的区别?

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

一、传统的BIO(同步阻塞的BIO)

就是说服务端一旦接受客户端的连接,就可以建立通信套接字在这个通信套接字上进行读写操作,
此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成,
不过可以通过多线程来支持多个客户端的连接,循环导致高cpu消耗。

服务器的实现模式是一个连接一个线程,这样的模式很明显的一个缺陷是:
由于客户端连接数与服务器线程数成正比关系,
可能造成不必要的线程开销,严重的还将导致服务器内存溢出。当然,
这种情况可以通过线程池机制改善,但并不能从本质上消除这个弊端。

问题:当出现高并发怎么办?
解决这个问题就有了下面的

二、NIO(同步非阻塞的NIO)。它支持面向缓冲的,基于通道的I/O操作方法

从JDK1.4以后开始,JDK引入的新的IO模型NIO
Channel(通道):通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。
Buffer(缓冲区):Buffer是一个对象,它包含一些要写入或者要读出的数据
Selector(选择器):选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。
就是说加了三个功能来解决bio中的单线程一对多的问题
而服务器的实现模式是多个请求一个线程,即请求会注册到多路复用器Selector上,
多路复用器轮询到连接有IO请求时才启动一个线程处理。
Java NIO: 单线程管理多个连接。
劣处:维护成本高,容易出现bug,项目大了之后消耗成本

三:AIO(异步非阻塞的AIO)

JDK1.7发布了NIO2.0也可以说是Nio的加强版,它是异步非阻塞的IO模型。
异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

这就是真正意义上的异步非阻塞,服务器的实现模式为多个有效请求一个线程,客户端的IO请求都是由OS先完成再通知服务器应用去启动线程处理(回调)。

AIO:必须使用异步编程方式,即协程
应用场景:并发连接数不多时采用BIO,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择NIO或AIO,更好的建议是采用成熟的网络通信框架Netty。
总结:理解了这,浓缩了还是有点东西的
BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。

IO多路复用详解

在这里插入图片描述

I/O多路复用的本质:
通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符(fd),一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值