NIO

NIO有三个部分:Selector, Channel和Buffer. 传统的IO基于字节流和字符流进行操作。而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区,或者从缓冲区写入通道中。Selector用于监听多个通道的时间(比如打开,数据到达),因此,单个线程可以监听多个数据通道。

Selector内部原理实际是在做一个对所注册的Channel的轮询访问,不断的轮询,一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙(SelectionKey),让我妈通过这把钥匙来读取channel的内容。

NIO有一个重要的点是:Reactor模式。从网上抠来一张Reactor模式的模型图如下:



Reactor模式有两大角色:Reactor和Handler. Reactor负责响应I/O事件;Handler负责非阻塞行为。至于Reactor模式的编码风格我就不赘述了。

前面说到了Selector的原理就是轮询,但是Java NIO中有个epoll()(linux系统下),这个对并发idle Connection会有大幅度的性能提升。epoll是linux下多路复用I/O接口Select/poll的增强版本。一般的轮询方式一个进程打开的FD(File Descriptor)是有一定限制的,FD_SETSIZE默认是2048,这个宏定义可以修改,但修改后的效果并不理想,对于那些需要支持上万连接数的IM服务器来说显然太少。epoll没有这个限制,可以通过”cat /proc/sys/fs/file-max”来查看支持的FD上限。博主本地机器是205822。epoll()有两种使用模式:LT(Level triggered)缺省,ET(Edge-triggered)高速。

epoll有一个著名的epoll-bug, 也可能会导致无效的状态的选择和100%的CPU利用率,要解决epoll-bug的唯一方法是回收旧的选择,将先前注册的通道实例转移到新创建的选择器上。当然如果使用一些框架比如:Netty, Mina.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值