Skip to main content

BIO & NIO & AIO

Blocking IO

同步阻塞IO,每一个链接对应一个线程,accept,read,write都是阻塞的,只能等处理完成才会释放。

Non-block IO

同步非阻塞IO,每一个请求对应一个线程,客户端发送的链接请求会注册到多路复用器上(selector)

select是阻塞的(可以直接while这个函数,不会造成cpu空转)

NIO采用reactor模式,一个reactor线程聚合一个多路复用器,可以同时注册,监听,轮询,上千个channel,一个IO线程可以并发处理多个客户端连接。

Async IO

异步非阻塞IO,用户发起一个IO请求就立即返回,等IO完成后,应用程序会得到IO操作完成的通知。

总结

BIO之所以需要多线程,是因为在进行IO操作的时候,没有办法知道到底能不能写,能不能读,只能等,read write两个函数无法进行有效的中断,除了多开线程,没有办法更好的利用CPU

NIO读写函数可以立即返回,如果一个链接不能读写 read/write立即返回0,就可以把这件事记下来(在selector注册标记位),然后切换到其他的就绪链接(channel)继续进行读写

NIO由原来的阻塞读写 变成了单线程轮询事件找到可以进行读写的网络描述符进行读写,除了事件的轮询是阻塞的(没有可干的事情就必须要阻塞),剩下的IO都是纯CPU操作,没有必要开启多线程,并且解决了连接数过大时线程切换带来的问题也随之解决。