JAVA中的NIO
其实之前我看完linux的各种网络模型后,就开始疑惑。我们知道网络IO的模型一般分为两个阶段:
- 等待数据传输到网卡,拷贝到内核缓冲区
- 将数据从内核缓冲区拷贝到用户空间来进行执行
但去研究java中的NIO,为什么有说他是非阻塞呢?
我们都知道java这种的NIO其底层实现是IO多路复用,使用select来进行实际监听,但就和我们之前的分析一样,IO多路复用在第一阶段,也就是调用select阶段如果此时没有准备好的数据,那么它就得阻塞等到操作系统回复一个select可以返回的消息,然后线程再阻塞的将数据读到用户缓冲区。
考虑是否为阻塞的是考虑第一个阶段,当没有数据到达内核的时候,是否阻塞,而IO多路复用第一阶段也是阻塞的。
于是就非常疑惑,再去看网上的解答:
总结两种:
- 实际上考虑IO多路复用时候使用select、poll、epoll时可以把返回时候设置为0,就是非阻塞
- 非阻塞不是只selector.select()方法的时候,这个也是阻塞。这个非阻塞是指select()方法返回之后的,之后我们就是可以处理自己的业务逻辑包括读。所以总体而言是非阻塞的形式。因为BIO全程实际上是阻塞的直到完成。
所以综上,个人觉得:我觉得还是尽量想java编程思想里面一样叫JAVA里的NIO为new IO,而不是nonblocking IO,会产生歧义。