Netty学习笔记—IO模型

来源:互联网 发布:java api 数量 编辑:程序博客网 时间:2024/06/05 04:56

 

 netty是一个流行的NIO的框架,它的健壮性、性能、功能都特别的好。既然是一个NIO的框架,那么今天就来聊一聊IO模型。


 BIO模型

 在网络编程中,基本的模型也就是常见的Client/Server模型,这也就是常见的两个进程之间的相互通信。也非常的简单,服务端暴漏自己的ip和端口,客户端通过地址信息向服务端发起连接请求,经过三次请求的握手进行建立连接,如果连接成功,双方就可以开始进行通信。


 上面就是传统的BIO的模型,但是我们发现这是一个一对一的应答通信模型。什么意思呢,也就是服务端有一个独立的Acceptor线程负责监听客户端的连接请求,它接收到客户端的连接请求后,就会为每一个客户端创建一个新的线程进行链路处理,处理完后,把结果返回给客户端,然后进行线程的销毁。


 BIO模型的问题,通过上面的描述,我们很容易发现潜在的问题,也就是当并发量大的话,服务端因为要创建过多的线程,从而导致系统的性能急剧下降,甚至可能造成线程堆栈溢出,创建新线程失败等问题,结果可想而知,进程宕机或者不能对外提供服务。


 伪异步IO

 上面分析了BIO的问题,那么如何来解决呢,可以在服务端通过线程池来替代过多的线程带来的开销。让客户端的每一次的请求都是一个task,交给服务端的线程来进行操作。

 伪异步模型的问题:虽然解决了大量线程的问题,但只是做了一个简单的优化,无法从根本上解决同步IO导致的通信线程阻塞的问题。比如服务端采用了线程池,当并发量大的时候,依然是拒绝响应等


 NIO模型

 NIO被称作New IO,支持阻塞和非阻塞两种模型,与传统的面向字节的io流相比较,它提供了高速的、面向块的I/O操作。也就是数据通过块的形式写到buffer中,然后再从buffer中流入到channel。另外还有一个多路复用器Selector的概念,多路复用器提供选择已经就绪的任务的能力,它会不断的轮询注册在其上的channel,如果某个channel上面发生读或者写事件,这个channel就处于就绪状态,会被selector轮询出来。





0 0