美文网首页
聊一聊BIO、NIO

聊一聊BIO、NIO

作者: Bardon_X | 来源:发表于2019-03-09 15:46 被阅读0次

1、标准I/O

InputStream和OutputStream作用于字节流,Reader和Writer作用于字符流。

JDK1.4引入新的I/O类库,旧的I/O包已经使用nio重新实现过,以便充分利用这种速度提高。

通道和缓存。我们可以把它相像成一个煤矿,通道是一个包含煤矿(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。也就是说,我们并不是直接和通道交互,而只与缓冲交互,并把缓冲派到通道,获取数据或发送数据。

不使用缓冲 使用缓冲

2、BIO

bio即block-I/O,同步阻塞式I/O

由代码可知,在while循环内服务端会调用accept方法等待接收客户端的连接请求,一旦一个请求连接,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成,再进行下一次循环。此处可以使用线程池技术,提高并发,但随着连接的增多,将会消耗过多的内存资源,导致服务器变慢甚至崩溃。

3、NIO

nio即no-block I/O,同步非阻塞式IO

init操作是获取一个serverSocketChanel并注册到selector

run方法实际是对selector做遍历,监听事件(SelectionKey 有isReadable()、isWritable()、isConnectable()、isAcceptable())并处理。利用buffer作为程序与I/O的缓冲提高运行速度。

NIO较BIO的优势,通过selector轮询channel,选择就绪事件处理。当存在大量客户端连接请求时,服务器处理事件可以得到有效调控。

①客户端发起的连接请求是异步的,可以通过直接在多路复用器注册OP_CONNECT操作等待后续操作,不需要同步阻塞等待结果可用。

②SocketChannel的读写都是异步的,如果没有可读写的数据它不会同步等待,直接返回,这样IO通信线程可以处理其他链路,不要同步等待这个链路可用。

③线程模型的优化:由于JDK的Selector在Linux等主流OS中通过epoll实现,没有连接句柄数的限制,这意味着Selector线程可以同时处理成千上万的客户端连接,而且性能不会随着客户端的增加而线性下降,因此非常适合做高性能、高并发的网络服务器。

陈钊对这个过程在java bio,nio,aio及源码中讲解得还是比较清晰的。

参考:

1、《Java编程思想》

2、Java中的BIO与NIO的区别详解

3、java bio,nio,aio及源码

相关文章

网友评论

      本文标题:聊一聊BIO、NIO

      本文链接:https://www.haomeiwen.com/subject/sujrpqtx.html