BIO,NIO,AIO,Netty的简单认识

1. 基本概念

同步阻塞I/O:

服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。

 同步非阻塞IO:

服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理

异步非阻塞IO:

异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理

 

2. BIO的认识

又称同步阻塞IO。那么问题来啦,

问题1:同步在哪里?阻塞在哪里?

这里同步指的是单线程情况下,用户线程发起IO请求后需要等待内核IO操作完成之后才可继续。 阻塞:IO操作需要彻底完成后才返回到用户空间。

传统BIO代码1:

BIO,NIO,AIO,Netty的简单认识

 

 

问题2:如何解决多个客户端连接服务器端的问题?(线程)

BIO,NIO,AIO,Netty的简单认识

传统BIO代码2:

BIO,NIO,AIO,Netty的简单认识

多线程处理面临的问题:1. 频繁的线程上下文切换。 2. 高并发请求下,线程不够用问题。从而证明线程资源是非常宝贵的,不应该随便产生线程,用一个成语叫恰到好处。

BIO,NIO,AIO,Netty的简单认识

问题3:如何做到线程恰到好处的开启?

服务端每次要记录客户端的状态,只有客户端状态变为是write和read时,才产生线程进行IO操作。(NIO对应的selector选择器出现)

 

BIO,NIO,AIO,Netty的简单认识

问题4:如何复用客户端与服务端的管道?

NIO进行抽象把这些管道抽象为CHANNEL(多路复用)

BIO,NIO,AIO,Netty的简单认识

问题5:如何解决IO阻塞操作?(但是IO本身是阻塞的)

NIO进行解决IO阻塞操作使用BUFFER。

BIO,NIO,AIO,Netty的简单认识

BIO,NIO,AIO,Netty的简单认识

从上述问题1-5:可以看出selector选择器,CHANNEL,BUFFER,产生的原因。

3. Reactor模型认识

BIO,NIO,AIO,Netty的简单认识

单线程模型最明显问题:一个NIO线程同时处理成百上千的链路,性能上无法支撑,即便NIO线程的CPU负荷达到100%,也无法满足海量消息的编码、解码、读取和发送。

多线程模型最明显问题:特殊情况下,一个NIO线程负责监听和处理所有的客户端连接可能会存在性能问题。如并发百万客户端连接。

主从线程解决的问题:可以解决1个服务端监听线程无法有效处理所有客户端连接的性能不足问题。

BIO与NIO代码的对比(从中可以看出NIO的api比较复杂)

BIO,NIO,AIO,Netty的简单认识

 

4. Netty的产生

BIO,NIO,AIO,Netty的简单认识

Netty解决的问题:

屏蔽复杂NIO的api。

支持主从线程模型。

 

问题6:我们已经知道BIO-->NIO--->Netty的大概过程,那么在看一下里面的细节,Socket到底是什么?

 

BIO,NIO,AIO,Netty的简单认识

问题7:BIO里面Socket socket = server.accept()为什么是阻塞的?

BIO,NIO,AIO,Netty的简单认识

AIO的异步模型:

 

BIO,NIO,AIO,Netty的简单认识

5. 讨论区:

1. 怎样理解用户空间和内核空间,里面的数据交互过程是怎样的?

2. IO操作为什么是阻塞的?