`
javaG
  • 浏览: 550190 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

IoServer源代码阅读笔记

    博客分类:
  • java
 
阅读更多

NIO:写事件要尽量早的被注销.

1,IOServer用一个主线程来处理Accept事件,然后把得到的key封装到IOSession中,再分配到一个读写处理器管理器(IoReadWriteMachineManager是一个数组,如果当前服务器有N个cpu则里面就有n个IoReadWriteMachine对象,相当于每个cpu绑定一个IoReadWriteMachine进行读写的io操作)中处理.
2,Selector中wakeup的作用,每次接受到一个Accept时间,就把对应的IOSession加入到一个IoReadWriteMachine中去,同时会调用这个IoReadWriteMachine中的Selector的wakeup()方法.看了这个方法的解释,发现它会让阻塞的select或者select(long)方法理解返回,同时在这两个方法返回的过程中不论你调用多少次wakeup方法,效果都一样,这个说明很有用.所以代码里面只要注册一个时间到IoReadWriteMachine都会调用一次wakeup,因为平凡调用不会损失效率.
3,SelectionKey是一个把Channel,Channel感兴趣的事件类型绑定的一个对象,当我们通过select方法返回的一组就绪事件队列实际上是一个SelectionKey队列,按照正常的情况我们是取得这个key后就把这个key从这个队列里面删除(不删除反正是有问题,具体为什么会有问题,目前还不太清楚).但是这里有个地方要注意,就是虽然被删除了,但是在NIO内部,这个key对象并没有被删除,你可以通过设置这个这个key的interestOps(int)函数来改变当前这个key对应的Channel感兴趣的事件 ,而不一定非要用channel的register方法.
4,IOServer的读事件,写事件,发起连接的事件,都是以IoSession为载体,通过把IoSession放入注册队列,控制队列,等待连接队列,然后再从这写队列取出IoSession来改变他们的key的interestOps来达到读写的目的.可以这样来描述一个IoSession的生命周期:accept后->加入注册队列->通过registerIoSessionsNow从注册队列取出把它绑定到一个IoReadWriteMachine的selector上,并绑定为可读态->读完后如果需要写数据则把IoSession丢入控制队列->通过changeControls方法把设置IoSession对应的SelectionKey的interestOps为可写态
5,在处理写操作时,每次调用IoSession的write方法时,把要写的数据封装到一个WriteFuture(实现了IoFuture接口)的对象内,然后把这个WriteFuture对象放入Sessoin的writeQueue队列,并把当前的IoSession加入到控制队列,就如4里面提到的,然后在IoReadWriteMachine中出理这个写事件,处理写事件的时候,是从把IoSession里取出writeQueue队列,每次取一个WriteFuture对象处理,处理完便推出,再等到下一次写时间过来,直到writeQueue里面的数据被输出完毕.输出完毕后则关闭这个通道的写事件.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics