• 王睿
    2018-09-13
    举个收快递的例子不知道理解是否正确。

    BIO,快递员通知你有一份快递会在今天送到某某地方,你需要在某某地方一致等待快递员的到来。

    NIO,快递员通知你有一份快递会送到你公司的前台,你需要每隔一段时间去前台询问是否有你的快递。

    AIO,快递员通知你有一份快递会送到你公司的前台,并且前台收到后会给你打电话通知你过来取。
    展开
    
     100
  • I am a psycho
    2018-05-29
    由于nio实际上是同步非阻塞io,是一个线程在同步的进行事件处理,当一组事channel处理完毕以后,去检查有没有又可以处理的channel。这也就是同步+非阻塞。同步,指每个准备好的channel处理是依次进行的,非阻塞,是指线程不会傻傻的等待读。只有当channel准备好后,才会进行。那么就会有这样一个问题,当每个channel所进行的都是耗时操作时,由于是同步操作,就会积压很多channel任务,从而完成影响。那么就需要对nio进行类似负载均衡的操作,如用线程池去进行管理读写,将channel分给其他的线程去执行,这样既充分利用了每一个线程,又不至于都堆积在一个线程中,等待执行。杨老师,不知道上述理解是否正确?
    
     86
  • 明翼
    2018-07-05
    看完之后还是不了解nio,感觉看起来越来越吃力了,大半天都啃不了一篇,好多东西都不熟悉,还要自己查资料去了解然后再回过来看,,,老师最好给些学习的资料让我们能找到,就这一篇感觉根本不够
    
     49
  • Chan
    2018-06-16
    B和N通常是针对数据是否就绪的处理方式来
    sync和async是对阻塞进行更深一层次的阐释,区别在于数据拷贝由用户线程完成还是内核完成,讨论范围一定是两个线程及以上了。


    同步阻塞,从数据是否准备就绪到数据拷贝都是由用户线程完成

    同步非阻塞,数据是否准备就绪由内核判断,数据拷贝还是用户线程完成

    异步非阻塞,数据是否准备就绪到数据拷贝都是内核来完成

    所以真正的异步IO一定是非阻塞的。

    多路复用IO即使有Reactor通知用户线程也是同步IO范畴,因为数据拷贝期间仍然是用户线程完成。

    所以假如我们没有内核支持数据拷贝的情况下,讨论的非阻塞并不是彻底的非阻塞,也就没有引入sync和async讨论的必要了

    不知道这样理解是否正确

    展开
    
     39
  • 雷霹雳的爸爸
    2018-05-29
    批评NIO确实要小心,我觉得主要是三方面,首先是如果是从写BIO过来的同学,需要有一个巨大的观念上的转变,要清楚网络就是并非时刻可读可写,我们用NIO就是在认真的面对这个问题,别把channel当流往死里用,没读出来写不进去的时候,就是该考虑让度线程资源了,第二点是NIO在不同的平台上的实现方式是不一样的,如果你工作用电脑是win,生产是linux,那么建议直接在linux上调试和测试,第三点,概念上的,理解了会在各方面都有益处,NIO在IO操作本身上还是阻塞的,也就是他还是同步IO,AIO读写行为的回调才是异步IO,而这个真正实现,还是看系统底层的,写完之后,我觉得我这一二三有点凑数的嫌疑

    作者回复: 不错,不过,在非常有必要之前,不见得都要底层,毕竟各种抽象,都是为特定领域工程师准备的,JMM等抽象都是为了大家有个清晰的、不同层面的高效交流

    
     33
  • Allen
    2018-06-30
    希望能听到更多原理性的东西,而不是在网上能搜到的样例代码
    
     25
  • Chan
    2018-06-16
    忘记回答问题了。所以对于多路复用IO,当出现有的IO请求在数据拷贝阶段,会出现由于资源类型过份庞大而导致线程长期阻塞,最后造成性能瓶颈的情况

    作者回复: 对

    
     14
  • aiwen
    2018-06-02
    到底啥是多路复用?一个线程管理多个链接就是多路复用?
    
     11
  • zjh
    2018-05-31
    看nio代码部分,请求接受和处理都是一个线程在做。这样的话,如果有多个请求过来都是按顺序处理吧,其中一个处理时间比较耗时的话那所有请求不都卡住了吗?如果把nio的处理部分也改成多线程会有什么问题吗

    作者回复: 这种情况需要考虑把耗时操作并发处理,再说处理是费cpu,还是重io,需要不同处理;如果耗时操作非常多,就不符合这种模型的适用场景

    
     7
  • lorancechen
    2018-05-31
    我也自己写过一个基于nio2的网络程序,觉得配合futrue写起来很舒服。
    仓库地址:https://github.com/LoranceChen/RxSocket 欢迎相互交流开发经验~

    记得在netty中,有一个搁置的netty5.x项目被废弃掉了,原因有一点官方说是性能提升不明显,这是可以理解的,因为linux下是基于epoll,本质还是select操作。

    听了课程之后,有一点印象比较深刻,select模式是使用一个线程做监听,而bio每次来一个链接都要做线程切换,所以节省的时间在线程切换上,当然如果是c/c++实现,原理也是一样的。


    想问一个一直困惑的问题,select内部如何实现的呢?
    个人猜测:不考虑内核,应用层的区分,单纯从代码角度考虑,我猜测,当select开始工作时,有一个定时器,比如每10ms去检查一下网络缓冲区中是否有tcp的链接请求包,然后把这些包筛选出来,作为一个集合(即代码中的迭代器)填入java select类的一个集合成员中,然后唤醒select线程,做一个while遍历处理链接请求,这样一次线程调度就可以处理10ms内的所有链接。与bio比,节省的时间在线程上下文切换上。不知道这么理解对不对。
    另外,也希望能出一个课程,按照上面这种理解底层的方式,讲讲select(因为我平常工作在linux机器,所以对select epoll比较感兴趣)如何处理read,write操作的。谢谢~

    展开

    作者回复: 坦白说,内核epoll之类实现细节目前我的理解也有限

    
     7
  • 扁担
    2018-10-21
    据我理解,NIO2的局限性在于,如果回调时客户端做了重操作,就会影响调度,导致后续的client回调缓慢

    作者回复: 对,这是这种多路复用的主要局限之一,nodejs等其他类似框架都有这问题

    
     6
  • 扁扁圆圆
    2018-06-02
    这里Nio的Selector只注册了一个sever chanel,这没有实现多路复用吧,多路复用不是注册了多个channel ,处理就绪的吗?而且处理客户端请求也是在同线程内,这还不如上面给的Bio解决方案吧

    作者回复: 这是简化的例子,少占篇幅

    
     5
  • 逐梦之音
    2018-05-29
    IO的调用可以分为三大块,请求调用,逻辑处理,响应返回处理。常规的BIO在这三个阶段会串行的阻塞的。NIO其实可以理解为将这三个阶段尽可能的去阻塞或者减少阻塞。看了上面的例子,NIO的服务器端在接受客户端请求的时候,是单线程执行的,而BIO是多线程处理的。但是不管咋的,他们服务器端处理具体的客户业务逻辑是都要用多线程的吧?
    
     5
  • godtrue
    2018-12-15
    对比而言,感觉这节讲解的不够细致,学完以后,能回答开篇的两个问题了,Java提供了IO/BIO/NIO/AIO这几种IO的方式,但是他们的优缺点,使用场景等讲解的不多,推荐看下慕课的 https://www.imooc.com/learn/941 这个课程,前半部分把Java IO相关的东西讲解的还是比较详细的。多路复用,这个东西能节省服务端的线程创建成本,一个线程监听多个通道,那个通道就绪了,就处理那个通道,不过具体他是怎么实现的呢?主动的不断轮询?还是被动的接受信息?
    如果一个通道的处理时间比较长,其他的多个通道又都就绪了,此时该怎么办?就让其他的就绪的通道等待着?
    感觉是开眼界还行,如果是全弄明白,还是乏力的,要看专业的书啦!
    
     4
  • unclenought
    2018-11-19
    http://tutorials.jenkov.com/java-nio/index.html,这篇教程对NIO讲得很好,容易理解且有一些实际例子。
    
     4
  • 萧萧
    2018-08-08
    作者对同步/异步, 阻塞/非阻塞的概念说明存在问题。

    《操作系统(第9版)》中关于进程通信中有对这部分概念做过解释, 在进程间通信的维度, 同步和阻塞,异步和非阻塞是相同的概念。

     沿着作者的概念解释简单推论一下就可以发现:

    如果同步操作是需要等待调用返回才能进行下一步, 显然这个调用是阻塞的。

    反之, 不需要等待调用返回的接口,必然需要提供事件, 回调等机制,这种调用显然是非阻塞的。
    展开

    作者回复: 这东西并没有完全共识,概念定义要看上下文,很多情况下可以算是同等,但在网络IO编程中是区分的,本文的关注点就是这个

    
     4
  • 张凯江
    2018-07-18
    cpu运算密集型应用。node得诟病
    
     4
  • yxw
    2018-06-03
    java nio的selector主要的问题是效率,当并发连接数达到数万甚至数十万的时候 ,单线程的selector会是一个瓶颈;另一个问题就是再线上运行过程中经常出现cpu占用100%的情况,原因也是由于selector依赖的操作系统底层机制bug 导致的selector假死,需要程序重建selector来解决,这个问题再jdk中似乎并没有很好的解决,netty成为了线上更加可靠的网络框架。不知理解的是否正确,请老师指教。

    作者回复: 嗯,有局限性;那个epoll的bug应该在8里修了,netty的改进不止那些,它为了性能改了很多底层,后面会介绍,好多算是hack;另外nio的目的是通用场景的基础API,和终端应用有个距离,核心类库很多都是如此定位,netty这种开源框架更贴近用户场景

    
     4
  • lorancechen
    2018-05-31
    还有一个问题请教,select在单线程下处理监听任务是否会成为瓶颈?能否通过创建多个select实例,并发监听socket事件呢?

    作者回复: Doug Lea曾经推荐过多个Selector,也就是多个reactor,如果你是这意思

    
     4
  • ykkk88
    2018-05-29
    这个nio看起来还是单线程在处理,如果放到多线程池中处理和bio加线程池有啥区别呢
    
     4
我们在线,来聊聊吧