备忘

备忘

  • netty是如何实现对于某个channel的IO事件,交由同一个线程去处理?
    channel持有一个eventloop,后续所有的操作都会交由这个eventllop操作,具体是在每个操作前,判断一下当前的执行线程是不是eventloop,如果是,直接执行,如果不是,则将要执行的事情放到eventloop的执行任务队列中

  • 什么时候创建的多个NioServerSocketChannel?(与问题5类似)
    netty中, nioServerSocketChannel只是在bind的时候被创建一次,后续也不会创建,但可以通过register方法创建相应的channel.

  • NIO的标准操作哪里去了?
    • NioEventLoop中实现了轮询的逻辑
    • NioServerSocketChannel构造函数中实现了channel的配置信息
    • Register方法实现了注册
  • selector是在哪里开始监听事件的,它的interseteOps是在哪里被设置的(如何监听连接,与问题6类似)?
    bind操作中触发了fireChannelActive事件,这个事件会调用channel的read方法,然后会调用unsafe的doBeginRead方法,在这个方法中,channel的兴趣事件被真正设置, 而channel的interestOps在它的构造函数中就已经被设置好了

  • SocketChannel是怎么被创建的(它是有多个吗?还是只有一个?)
    socketChannel是在客户端发起连接操作时,由NioEventLoop的轮询操作捕获到相应的IO事件,它调用了unsafe的read方法,在该方法中,NioSocketChannel被创建,且通过NioServerSocketChannel的read事件传播, 在NioSSC的pipeline初始化的时候,设置了ServerBootstrapAcceptor的处理器,它会处理channelRead事件,并在这个事件的处理中,初始化NioSC的相应属性, 然后将NioSC注册到childGroup中. 对于每一个新的连接,服务端都会创建一个新的请求.

  • server端是如何处理连接的
    见问题5

参考文献

  1. NioEventLoop的运行情况

  2. 服务启动的代码

  3. 系列的开始文章

您的支持将鼓励我继续创作!