IO模型详解

IO模型:就是用什么样的通道进行数据的发送和接受,Java支持3种网络编程IO模式。

第一种:

BIO(Blocking IO)

同步阻塞模型,一个客户端连接对应一个处理线程。

BIO模型图:

 优点:

程序简单,易于理解。

 缺点:

1.IO代码里面的accept操作是阻塞操作,如果没有客户端连接,则会线程阻塞,浪费资源。

2.IO代码里面的read操作是阻塞操作,如果连接的客户端一直没发送数据,则会线程阻塞,浪费资源。

3.如果线程很多,会造成服务器线程很多,压力很大,像c10k问题。

应用场景:

BIO 方式适用于连接数目比较小且固定的场景。

第二种:

NIO(Non Blocking IO)

同步非阻塞模型,服务器实现模式为一个线程可以处理多个请求,客户端发送的连接请求都会注册到多路复用器selector上,多路复用器轮询到连接有IO请求就进行处理。

NIO模型图:

NIO 有三大核心组件: Channel(通道), Buffer(缓冲区),Selector(多路复用器)

1、channel 类似于流,每个 channel 对应一个 buffer缓冲区,buffer 底层就是个数组

2、channel 会注册到 selector 上,由 selector 根据 channel 读写事件的发生将其交由某个空闲的线程处理

3、NIO 的 Buffer 和 channel 都是既可以读也可以写

NIO流程:

Java调用了操作系统的内核函数来创建Socket,获取到Socket的文件描述符,再创建一个Selector对象,对应操作系统的Epoll描述符,将获取到的Socket连接的文件描述符的事件绑定到Selector对应的Epoll文件描述符上,进行事件的异步通知,这样就实现了使用一条线程,并且不需要太多的无效的遍历,将事件处理交给了操作系统内核(操作系统中断程序实现),大大提高了效率。

优点:

并发性高。

缺点:

程序的处理和处理IO相比更加复杂。

应用场景:

NIO方式适用于连接数目多且连接比较短(轻操作)的场景, 比如聊天服务器, 弹幕系统, 服务器间通讯。

第三种:

AIO(NIO 2.0)

异步非阻塞, 由操作系统完成后回调通知服务端程序启动线程去处理, 一般适用于连接数较多且连接时间较长的应用。

AIO模型图:

优点: 

并发性高、CPU利用率高、线程利用率高。

缺点:

不适合连接数目少且连接比较短的场景。

应用场景:

AIO方式适用于连接数目多且连接比较长(重操作)的场景。

三种IO模型对比:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值