关于Java NIO是究竟是什么IO的问题

楼主查了大量资料,多数博文上写的都说属于同步非阻塞IO,然而《Netty权威指南第二版》却来了一句“为了符合大家的习惯,本书也会将NIO称为异步非阻塞或者非阻塞IO”,再者,NIO是基于多路复用IO技术的,UNIX的5种IO模型中,说到了多路复用IO模型其实是同步阻塞IO的加强版,不同之处就在于能阻塞多个IO操作,无论是在数据准备阶段还是在数据处理阶段,都是阻塞的(当没有IO事件时),直到有数据可读或可写时,才真正进行IO操作,这不是说明了多路复用IO技术也是同步阻塞的吗?还是我理解有问题。。。。。?还有一点就是NIO里的Selector.select()方法是阻塞的,那为什么NIO又是同步非阻塞的?这些问题让我感到十分迷茫,希望大佬们指点指点
#Java#
全部评论
IO有BIO,NIO,AIO,IO操作包括发起IO请求和IO操作两个部分,都阻塞的就是BIO,请求不阻塞,操作阻塞的就是NIO,比如它用的epoll机制,AIO指都不阻塞
点赞 回复 分享
发布于 2019-09-02 01:02
阻塞和非阻塞看的是你请求的时候如果io未准备好会不会阻塞等到io准备好(非阻塞是干脆地返回结果),同步和非同步看的是由操作系统给你复制数据到缓冲区还是你自己去复制
点赞 回复 分享
发布于 2019-09-02 07:19
NIO可以是阻塞式io可以是非阻塞式,非阻塞式对应epoll
点赞 回复 分享
发布于 2019-09-02 01:06
坐等大佬来个一针见血的指点
点赞 回复 分享
发布于 2019-09-02 01:18
之前和室友稍微讨论过,大概结论就是nio和多路复用应该区别看待
点赞 回复 分享
发布于 2019-09-02 03:22
select 是阻塞的,但是read等这些io操作不是阻塞的,一般说阻塞还是非阻塞都是讲这些read等请求函数的
点赞 回复 分享
发布于 2019-09-02 07:30
BIO是建立连接以后,一直等待,直到有数据可以读。NIO是关心可不可以读了,如果有的话,就阻塞读,没有的话就继续轮训。主要是看在连接的时候,是不是要一直阻塞等待时间的到来
点赞 回复 分享
发布于 2019-09-02 07:51
数据准备阶段和数据处理阶段指的是 数据从磁盘加载进内核缓冲区 和 从内核缓冲区复制到用户空间嘛?
点赞 回复 分享
发布于 2019-09-02 08:29
回一楼,多路复用阻塞就是io请求阶段只有select线程阻塞,而不是每个连接都阻塞,当然read时候work也是阻塞的,如果read交给内核做,做完通知用户那就是异步io,epoll其实也有阻塞,只是epoll通过树存句柄并设置回调函数,accept时候回调函数会把就绪的句柄加入就绪队列,epoll只需要轮训就绪队列不需要像select一样轮训所有连接。这个轮询的线程是阻塞,这是io多路复用的特点,read操作是阻塞的,这是同步io的特点。第一次回复,希望是讲清楚了
点赞 回复 分享
发布于 2019-09-02 08:39
之前哪里看到过一句话,java里的NIO和我们一般说的NIO不一样。。。
点赞 回复 分享
发布于 2019-09-02 08:41
io多路复用+非阻塞IO
点赞 回复 分享
发布于 2019-09-02 09:59

相关推荐

点赞 评论 收藏
分享
评论
1
33
分享
牛客网
牛客企业服务