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方式适用于连接数目多且连接比较短(轻 *** 作)的场景, 比如聊天服务器, d幕系统, 服务器间通讯。
第三种:
AIO(NIO 2.0)
异步非阻塞, 由 *** 作系统完成后回调通知服务端程序启动线程去处理, 一般适用于连接数较多且连接时间较长的应用。
AIO模型图:
优点:
并发性高、CPU利用率高、线程利用率高。
缺点:
不适合连接数目少且连接比较短的场景。
应用场景:
AIO方式适用于连接数目多且连接比较长(重 *** 作)的场景。
三种IO模型对比:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)